Reacher Data API v1.0.0
Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu.
Access your Reacher affiliate data programmatically. Use your API key in the x-api-key header and shop ID in the x-shop-id header.
Base URLs:
Authentication
-
API Key (ApiKeyAuth)
- Parameter Name: x-api-key, in: header. Your Reacher API key (starts with rk_live_)
-
API Key (ShopId)
- Parameter Name: x-shop-id, in: header. The shop ID to query. Accepts a single integer, a comma-separated list of integers (e.g. '101,202,303'), or 'all' to query every shop your API key has access to. Multi-shop responses include a 'shops_queried' field and use USD as the default currency. Detail endpoints (e.g. GET /creators/{handle}, GET /automations/{id}) require a single shop ID.
Shops
Discover your shops and their regions.
List your shops
GET /shops
Returns all active shops accessible to this API key. Use the returned shop_id values in the x-shop-id header for other endpoints.
Example responses
200 Response
{
"data": [
{
"shop_id": 0,
"shop_name": "string",
"region": "string",
"affiliate_market_region": "string",
"business_region": "string",
"currency": "string",
"status": "string",
"customer_id": 0,
"primary_category": "string"
}
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | ShopsListResponse |
Creators
Affiliates who have worked with your shop.
List creators
POST /creators/list
List affiliate creators for your shop with pagination, sorting, and filtering. GMV represents the creator's lifetime revenue for this shop. Data updates approximately every hour.
Body parameter
{
"page": 1,
"page_size": 50,
"sort_by": "shop_gmv",
"sort_dir": "asc",
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"status": "string",
"creator_handle": "string",
"min_shop_gmv": 0,
"min_overall_gmv": 0,
"min_videos": 0,
"min_followers": 0,
"group_id": "string",
"tags": [
"string"
],
"product_id": "string"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | CreatorsListRequest | true | none |
Example responses
200 Response
{
"data": [
{
"creator_handle": "string",
"follower_count": 0,
"status": "string",
"shop_gmv": 0,
"overall_gmv": 0,
"creator_level": "string",
"overall_fulfillment_rate": 0,
"shop_units_sold": 0,
"shop_video_count": 0,
"video_views": 0,
"sample_received": 0,
"commission_rate": 0,
"est_commission": 0,
"fulfillment_rate": 0,
"tags": [
"string"
],
"product_id": "string",
"product_title": "string",
"updated_at": "string",
"created_at": "string"
}
],
"currency": "string",
"pagination": null,
"date_range": {
"start_date": "string",
"end_date": "string"
},
"shops_queried": [
"string"
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | CreatorsListPaginatedResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Creator performance (date-filtered)
POST /creators/performance
Top creators ranked by GMV earned within a specific date range. Unlike /creators/list (which shows lifetime GMV), this endpoint uses daily performance data and matches the dashboard's 'Top Creators' section exactly. Defaults to the last 30 days. Use this for period-specific rankings and reports.
Body parameter
{
"page": 1,
"page_size": 50,
"sort_by": "gmv",
"sort_dir": "asc",
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"creator_handle": "string",
"min_gmv": 0
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | CreatorPerformanceRequest | true | none |
Example responses
200 Response
{
"data": [
{
"creator_id": "string",
"creator_handle": "string",
"gmv": 0,
"units_sold": 0,
"order_count": 0,
"est_commission": 0,
"follower_count": 0
}
],
"currency": "string",
"pagination": null,
"date_range": {
"start_date": "string",
"end_date": "string"
},
"shops_queried": [
"string"
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | CreatorPerformanceResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Creator activity totals for a window
POST /creators/summary
Four headline totals for the shop over a date window: creators added, affiliate GMV earned, videos posted, and orders placed. Runs the same aggregate query that backs the summary cards above the portal's My Creators table, over the same trailing-28-day default window (TikTok reporting day, GMT-7).
gmv_generated and video_posts are scoped to the shop's CRM-tracked creators, which makes them narrower than their whole-shop namesakes on POST /metrics/summary (gmv, videos_posted) — the two will not agree, by design.
Aggregates cover the whole shop — there is no filter parameter in v1. Defaults to the trailing 28 days. Requires a single shop.
No prior-period comparison is included; for a period-over-period delta, call twice with adjacent windows and subtract. Returns 503 when the aggregate times out — back off and retry rather than treating it as a failure.
Body parameter
{
"start_date": "2019-08-24",
"end_date": "2019-08-24"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | CreatorsSummaryRequest | true | none |
Example responses
200 Response
{
"data": {
"new_creators": 0,
"gmv_generated": 0,
"video_posts": 0,
"orders": 0
},
"currency": "string",
"date_range": {
"start_date": "string",
"end_date": "string"
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | CreatorsSummaryResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Daily series per creator
POST /creators/trends
Daily time series for up to 100 named creators — affiliate GMV, video GMV, videos posted, video views, units sold, and commission. Backs sparklines and per-creator trend comparisons.
Every series is aligned positionally with the days axis and zero-filled, so index i of any array corresponds to days[i]. Creators with no activity in the window appear with all-zero arrays rather than being omitted; handles that don't exist in this shop are listed in unresolved_handles instead.
Defaults to the trailing 28 days. Requires a single shop.
Body parameter
{
"creator_handles": [
"string"
],
"start_date": "2019-08-24",
"end_date": "2019-08-24"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | CreatorTrendsRequest | true | none |
Example responses
200 Response
{
"data": {
"property1": {
"affiliate_gmv": [
0
],
"video_gmv": [
0
],
"videos_posted": [
0
],
"total_video_views": [
0
],
"units_sold": [
0
],
"commission": [
0
]
},
"property2": {
"affiliate_gmv": [
0
],
"video_gmv": [
0
],
"videos_posted": [
0
],
"total_video_views": [
0
],
"units_sold": [
0
],
"commission": [
0
]
}
},
"days": [
"string"
],
"unresolved_handles": [
"string"
],
"currency": "string",
"date_range": {
"start_date": "string",
"end_date": "string"
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | CreatorTrendsResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Weekly outreach funnel by creator tier
POST /creators/tier-performance
The outreach funnel — messages sent, sample requests, samples approved, videos posted — rolled up per creator GMV tier, one block per week.
Weeks run Sunday to Saturday and are labelled by the Saturday they end on (week_ending), matching how weekly client reports are cut. A week with no activity is still returned, as zeros.
All eight tiers L0-L7 are always present. A creator's tier comes from their ALL-TIME platform-wide GMV — the same basis as the Top Creators level badges — not from the GMV attributed inside the window. The gmv field on each row IS the windowed figure.
touches is outreach messages: three DMs to one creator counts three. reached is distinct creators. Single shop only — set x-shop-id to one shop ID.
Body parameter
{
"start_date": "2019-08-24",
"end_date": "2019-08-24"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | TierPerformanceRequest | true | none |
Example responses
200 Response
{
"shop_id": 0,
"weeks": [
{
"week_start": "string",
"week_ending": "string",
"total": {
"creators": 0,
"reached": 0,
"converted": 0,
"conversion_rate": 0,
"touches": 0,
"sample_requests": 0,
"samples_approved": 0,
"videos_posted": 0,
"gmv": 0
},
"tiers": [
{
"tier": "string",
"creators": 0,
"reached": 0,
"converted": 0,
"conversion_rate": 0,
"touches": 0,
"sample_requests": 0,
"samples_approved": 0,
"videos_posted": 0,
"gmv": 0
}
]
}
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | TierPerformanceResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Creator distribution by GMV level
GET /creators/levels
Distribution of creators by GMV tier (L0-L7). Matches the dashboard's 'Creators by Level' pie chart. Uses active creators from the date range (defaults to last 30 days). Pass start_date and end_date query params (YYYY-MM-DD) to customize the window. L0=$0, L1=<$5k, L2=$5k-$25k, L3=$25k-$60k, L4=$60k-$150k, L5=$150k-$400k, L6=$400k-$1M, L7=>$1M.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| start_date | query | any | false | Start date (YYYY-MM-DD). Defaults to 30 days ago. |
| end_date | query | any | false | End date (YYYY-MM-DD). Defaults to the shop's newest settled day. |
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Response Schema
Get creator detail
GET /creators/{creator_handle}
Get detailed information for a single creator, including groups, products, and latest 10 videos (for full video list, use POST /creators/{creator_handle}/videos).
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| creator_handle | path | string | true | none |
Example responses
200 Response
{
"data": {
"creator_handle": "string",
"follower_count": 0,
"status": "string",
"shop_gmv": 0,
"overall_gmv": 0,
"creator_level": "string",
"overall_fulfillment_rate": 0,
"shop_units_sold": 0,
"shop_video_count": 0,
"video_views": 0,
"sample_received": 0,
"commission_rate": 0,
"est_commission": 0,
"fulfillment_rate": 0,
"tags": [
"string"
],
"product_id": "string",
"product_title": "string",
"updated_at": "string",
"created_at": "string"
},
"groups": [],
"products": [],
"videos": [],
"currency": "string"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | CreatorDetailResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
List creator's videos
POST /creators/{creator_handle}/videos
Paginated list of videos by this creator in your shop.
Body parameter
{
"page": 1,
"page_size": 50,
"sort_by": "video_gmv",
"sort_dir": "asc",
"start_date": "2019-08-24",
"end_date": "2019-08-24"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| creator_handle | path | string | true | none |
| body | body | CreatorVideosRequest | true | none |
Example responses
200 Response
{
"data": [
{
"video_id": "string",
"creator_id": "string",
"title": "string",
"video_url": "string",
"tiktok_url": "string",
"creator_handle": "string",
"product_id": "string",
"product_name": "string",
"views": 0,
"like_count": 0,
"comment_count": 0,
"share_count": 0,
"units_sold": 0,
"video_gmv": 0,
"posted_date": "string"
}
],
"currency": "string",
"pagination": null,
"date_range": {
"start_date": "string",
"end_date": "string"
},
"shops_queried": [
"string"
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | VideosListPaginatedResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
List creator's products
POST /creators/{creator_handle}/products
Products this creator is affiliated with in your shop.
Body parameter
{
"page": 1,
"page_size": 50
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| creator_handle | path | string | true | none |
| body | body | CreatorProductsRequest | true | none |
Example responses
200 Response
{
"data": [
{
"product_id": "string",
"product_title": "string",
"commission_rate": 0,
"shop_units_sold": 0,
"shop_gmv": 0,
"status": "string"
}
],
"currency": "string",
"pagination": null,
"shops_queried": [
"string"
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | CreatorProductsPaginatedResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Products
Your products and their affiliate performance.
List products
POST /products/list
Product performance metrics aggregated over a date range. Defaults to the last 7 days if no dates are specified. Data is typically 2-3 days behind the current date. Each product also carries its TikTok Seller Center per-product metrics as sc_* fields: all-channel GMV with its per-channel breakdown (affiliate, seller video, seller live, product card, shop tab), plus orders, units sold, customers, impressions, clicks, CTR, conversion, AOV, GMV per 1,000 impressions, add-to-cart, and refunds. The sc_* fields are null for products not yet on the Seller Center sync.
Body parameter
{
"page": 1,
"page_size": 50,
"sort_by": "gmv",
"sort_dir": "asc",
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"product_name": "string"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | ProductsListRequest | true | none |
Example responses
200 Response
{
"data": [
{
"product_id": "string",
"product_name": "string",
"gmv": 0,
"units_sold": 0,
"refund_units": 0,
"video_count": 0,
"sample_count": 0,
"live_count": 0,
"est_commission": 0,
"product_status": "string",
"sc_total_gmv": 0,
"sc_orders": 0,
"sc_units_sold": 0,
"sc_customers": 0,
"sc_aov": 0,
"sc_impressions": 0,
"sc_clicks": 0,
"sc_ctr": 0,
"sc_conversion": 0,
"sc_gmv_per_1k_impr": 0,
"sc_add_to_cart": 0,
"sc_affiliate_gmv": 0,
"sc_seller_video_gmv": 0,
"sc_seller_live_gmv": 0,
"sc_product_card_gmv": 0,
"sc_shop_tab_gmv": 0,
"sc_refunds": 0
}
],
"currency": "string",
"pagination": null,
"date_range": {
"start_date": "string",
"end_date": "string"
},
"shops_queried": [
"string"
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | ProductsListPaginatedResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
List product catalog with inventory
POST /products/catalog
The shop's merchandising catalog with current stock — for syncing products into an external CRM or ordering system. Sourced from TikTok's product catalog (refreshed roughly every 6 hours), NOT the affiliate performance data in POST /products/list.
Each product carries its product-level inventory (total_inventory, sku_count, out_of_stock_sku_count) and, by default, a nested skus[] array with per-SKU stock and variant attributes. Set include_skus=false for a lighter product-only payload.
All money is reported as integer minor currency units (cents) in the product's currency. Prices and stock are passed through exactly as TikTok reports them: product-level total_inventory and per-SKU inventory can legitimately differ during a sync, so do not assume total_inventory equals the sum of SKU inventories. There is no warehouse-level stock breakdown — inventory exists only at the product and SKU grain.
For incremental syncs, pass updated_since and key off each row's updated_at. Soft-deleted products are excluded.
Body parameter
{
"page": 1,
"page_size": 50,
"sort_by": "title",
"sort_dir": "asc",
"product_name": "string",
"product_status": "string",
"in_stock_only": false,
"updated_since": "2019-08-24T14:15:22Z",
"include_skus": true
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | ProductCatalogRequest | true | none |
Example responses
200 Response
{
"data": [
{
"shop_id": 0,
"product_id": "string",
"title": "string",
"description": "string",
"brand_name": "string",
"category_chain": [
null
],
"primary_image_url": "string",
"image_urls": [
null
],
"currency": "string",
"price_min_cents": 0,
"price_max_cents": 0,
"total_inventory": 0,
"sku_count": 0,
"out_of_stock_sku_count": 0,
"product_status": "string",
"affiliate_status": 0,
"is_cod_allowed": true,
"tiktok_created_at": "string",
"tiktok_updated_at": "string",
"updated_at": "string",
"skus": [
{
"sku_id": "string",
"seller_sku": "string",
"inventory": 0,
"variants": [
{
"name": "string",
"value_name": "string",
"value_id": "string",
"image_url": "string"
}
],
"updated_at": "string"
}
]
}
],
"pagination": null,
"shops_queried": [
"string"
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | ProductCatalogPaginatedResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
List product's creators
POST /products/{product_id}/creators
Creators affiliated with this product.
Body parameter
{
"page": 1,
"page_size": 50
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| product_id | path | string | true | none |
| body | body | ProductCreatorsRequest | true | none |
Example responses
200 Response
{
"data": [
{
"creator_handle": "string",
"follower_count": 0,
"commission_rate": 0,
"gmv": 0
}
],
"currency": "string",
"pagination": null,
"shops_queried": [
"string"
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | ProductCreatorsResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
List product's videos
POST /products/{product_id}/videos
Videos featuring this product.
Body parameter
{
"page": 1,
"page_size": 50,
"sort_by": "video_gmv",
"sort_dir": "asc",
"start_date": "2019-08-24",
"end_date": "2019-08-24"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| product_id | path | string | true | none |
| body | body | ProductVideosRequest | true | none |
Example responses
200 Response
{
"data": [
{
"video_id": "string",
"creator_id": "string",
"title": "string",
"video_url": "string",
"tiktok_url": "string",
"creator_handle": "string",
"product_id": "string",
"product_name": "string",
"views": 0,
"like_count": 0,
"comment_count": 0,
"share_count": 0,
"units_sold": 0,
"video_gmv": 0,
"posted_date": "string"
}
],
"currency": "string",
"pagination": null,
"date_range": {
"start_date": "string",
"end_date": "string"
},
"shops_queried": [
"string"
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | VideosListPaginatedResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Videos
Affiliate videos and performance metrics.
List videos
POST /videos/list
Affiliate videos and their performance metrics. Values represent lifetime totals per video (total views, total GMV, etc.). Data can be up to three days stale, given the delay in affiliate center.
Body parameter
{
"page": 1,
"page_size": 50,
"sort_by": "video_gmv",
"sort_dir": "asc",
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"creator_id": "string",
"creator_handle": "string",
"product_id": "string",
"product_ids": [
"string"
],
"min_gmv": 0,
"min_views": 0
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | VideosListRequest | true | none |
Example responses
200 Response
{
"data": [
{
"video_id": "string",
"creator_id": "string",
"title": "string",
"video_url": "string",
"tiktok_url": "string",
"creator_handle": "string",
"product_id": "string",
"product_name": "string",
"views": 0,
"like_count": 0,
"comment_count": 0,
"share_count": 0,
"units_sold": 0,
"video_gmv": 0,
"posted_date": "string"
}
],
"currency": "string",
"pagination": null,
"date_range": {
"start_date": "string",
"end_date": "string"
},
"shops_queried": [
"string"
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | VideosListPaginatedResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Creator video leaderboard
POST /videos/leaderboard
Creator-level shoppable-video leaderboard for a campaign window. Aggregates attributed video GMV and units per creator over a posted-date range (optionally restricted to specific product_ids), each with a per-product breakdown, ranked by total video GMV (default). Use this instead of paginating /videos/list + joining by hand: one row per creator with total_video_gmv, total_units_sold, qualifying_video_count (DISTINCT videos), and a products[] breakdown. min_gmv is a per-video-row threshold consistent with /videos/list. Multi-shop requests (x-shop-id: all or comma-separated) aggregate creators across shops, but only when every shop shares one currency — GMV cannot be summed across currencies, so a mixed-currency shop set is rejected (400); scope x-shop-id to a single currency/region.
Body parameter
{
"page": 1,
"page_size": 50,
"sort_by": "total_video_gmv",
"sort_dir": "asc",
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"product_ids": [
"string"
],
"min_gmv": 0
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | VideoLeaderboardRequest | true | none |
Example responses
200 Response
{
"data": [
{
"creator_id": "string",
"creator_handle": "string",
"total_video_gmv": 0,
"total_units_sold": 0,
"qualifying_video_count": 0,
"products": [
{
"product_id": "string",
"product_name": "string",
"video_gmv": 0,
"units_sold": 0,
"video_count": 0
}
]
}
],
"currency": "string",
"pagination": null,
"date_range": {
"start_date": "string",
"end_date": "string"
},
"shops_queried": [
"string"
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | VideoLeaderboardResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Top videos with creative breakdown
POST /videos/creative
The shop's top videos ranked by GMV earned in the date range (defaults to the last 30 days, same ranking as /videos/performance), each enriched with the AI creative breakdown: hook, sell points, product niche, shot style, and videography. Use this to analyze WHY the top videos perform — not just how much they earned. Videos that haven't been analyzed yet keep their metrics and list the unavailable breakdown fields in creative.missing_fields; render those as 'not analyzed' rather than blank. Multi-shop requests (x-shop-id: all or comma-separated) mirror /videos/performance's semantics: one ranking across shops with a single top-level currency (USD fallback) — use a single shop when per-shop currency precision matters.
Body parameter
{
"limit": 10,
"sort_by": "video_gmv",
"sort_dir": "asc",
"start_date": "2019-08-24",
"end_date": "2019-08-24"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | VideosCreativeRequest | true | none |
Example responses
200 Response
{
"data": [
{
"video_id": "string",
"title": "string",
"creator_handle": "string",
"tiktok_url": "string",
"video_gmv": 0,
"views": 0,
"like_count": 0,
"comment_count": 0,
"order_count": 0,
"posted_date": "string",
"rank": 0,
"creative": {
"analyzed": true,
"hook": {
"text": "string",
"classification": "string",
"reasoning": "string"
},
"sell_points": [
"string"
],
"product_niche": "string",
"shot_style": [
"string"
],
"videography": {
"locations": [
"string"
],
"lighting": [
"string"
],
"product_showcase": [
"string"
],
"notes": "string"
},
"missing_fields": [
"string"
]
}
}
],
"currency": "string",
"date_range": {
"start_date": "string",
"end_date": "string"
},
"coverage": {
"videos_returned": 0,
"with_creative_analysis": 0
},
"total_count": 0,
"message": "string",
"shops_queried": [
"string"
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | VideosCreativeResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Video performance (date-filtered)
POST /videos/performance
Top videos ranked by GMV or views earned within a specific date range. Unlike /videos/list (which shows lifetime totals), this endpoint uses daily performance data and matches the dashboard's 'Top Videos' section exactly. Defaults to the last 30 days. Use this for period-specific rankings, trend analysis, and correlating video performance with product sales.
Body parameter
{
"page": 1,
"page_size": 50,
"sort_by": "video_gmv",
"sort_dir": "asc",
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"creator_handle": "string",
"min_gmv": 0,
"min_views": 0
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | VideoPerformanceRequest | true | none |
Example responses
200 Response
{
"data": [
{
"video_id": "string",
"title": "string",
"creator_handle": "string",
"tiktok_url": "string",
"video_gmv": 0,
"views": 0,
"like_count": 0,
"comment_count": 0,
"order_count": 0,
"posted_date": "string"
}
],
"currency": "string",
"pagination": null,
"date_range": {
"start_date": "string",
"end_date": "string"
},
"shops_queried": [
"string"
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | VideoPerformanceResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
List videos with retention / hook-quality metrics
GET /videos/retention
Your shop's videos with per-video completion rate (watch_finish_rate), exposure (impressions), views, CTR and engagement — the organic hook-quality signal.
TikTok exposes a 2-second view rate only for GMV Max ad creatives (video_view_rate_2s on /campaigns/{id}/creative-metrics); for organic videos the retention metric is completion, so use watch_finish_rate as the quality bar (min_watch_finish_rate filters to it). Ordered strongest-hook first.
Scope: videos in the shop's own Seller Center analytics (posted for the shop).
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| creator_handle | query | any | false | Restrict to a creator by (partial) TikTok handle. |
| min_watch_finish_rate | query | any | false | Only videos whose completion rate is at least this (percent). |
| min_views | query | any | false | Only videos with at least this many views. Pair with min_watch_finish_rate to use completion rate as a quality bar — without a floor a 1-view video reads as 100% completion and tops the ranking. |
| page | query | integer | false | Page number (1-indexed). |
| page_size | query | integer | false | Rows per page (max 100). |
Example responses
200 Response
{
"data": [
{
"video_id": "string",
"video_url": "string",
"video_name": "string",
"video_duration_s": 0,
"publish_time": "2019-08-24T14:15:22Z",
"creator_handle": "string",
"creator_alias": "string",
"views": 0,
"impressions": 0,
"clicks": 0,
"ctr_rate": 0,
"watch_finish_rate": 0,
"likes": 0,
"comments": 0,
"shares": 0,
"new_followers": 0,
"gpm": 0,
"revenue": 0,
"currency": "string",
"products": [
{
"id": "string",
"name": "string"
}
]
}
],
"pagination": {
"total_count": 0,
"page": 0,
"page_size": 0,
"total_pages": 0
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | VideoRetentionResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Video Intelligence
Per-video transcripts and AI creative analysis: how a video opens, its structure, on-screen text, detected products, scored creative features, and its bottom-of-funnel verdict.
Get one video's creative analysis
GET /videos/{video_id}/analysis
Reacher's AI analysis of a single video: the spoken transcript, a hook_summary of how it opens, the structure_outline of its beats, the on-screen text (OCR), the visual tags, the products detected on screen, and the scored creative features (hook in the first three seconds, product demo present, voiceover present, pace, and a content summary).
video_id is the value returned by POST /videos/list, POST /videos/performance and GET /crm/content.
Coverage is partial and grows over time: a video this shop owns that has not been analyzed yet returns 200 with analyzed: false and null fields, so absence is distinguishable from a bad id. Thumbnail-source analyses (analysis_source: thumbnail) carry no transcript and no motion features.
Set include_experimental=true to additionally receive features_experimental, the analyzer's full scored-feature block — richer, but unstable across analyzer versions.
Only videos belonging to the calling key's shop are readable; any other video_id returns 404. Single-shop only — set x-shop-id to one shop ID.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| video_id | path | string | true | Video id from any Reacher video surface. |
| include_experimental | query | boolean | false | Attach the analyzer's full scored-feature block as features_experimental. |
Example responses
200 Response
{
"data": {
"video_id": "string",
"analyzed": true,
"analysis_source": "string",
"analysis_version": 0,
"analyzed_at": "2019-08-24T14:15:22Z",
"transcript": "string",
"transcript_language": "string",
"transcript_duration_s": 0,
"transcript_source": "string",
"hook_summary": "string",
"structure_outline": [
"string"
],
"on_screen_text": "string",
"vision_tags": {},
"detected_products": {},
"features": {},
"features_experimental": {}
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | VideoAnalysisResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Get creative analysis for several videos
GET /videos/analysis
The batch form of GET /videos/{video_id}/analysis — same payload per video, up to 100 ids per call. Pass video_ids once per id (?video_ids=A&video_ids=B).
Unlike the single-video route this never 404s: ids that do not belong to this shop are listed in not_found, while owned-but-unanalyzed videos appear in data with analyzed: false. Use it to check analysis coverage across a set of videos in one round trip.
Only videos belonging to the calling key's shop are readable; any other video_id returns 404. Single-shop only — set x-shop-id to one shop ID.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| video_ids | query | array[string] | true | Repeatable video id (max 100 per request). |
| include_experimental | query | boolean | false | Attach the analyzer's full scored-feature block as features_experimental. |
Example responses
200 Response
{
"data": [
{
"video_id": "string",
"analyzed": true,
"analysis_source": "string",
"analysis_version": 0,
"analyzed_at": "2019-08-24T14:15:22Z",
"transcript": "string",
"transcript_language": "string",
"transcript_duration_s": 0,
"transcript_source": "string",
"hook_summary": "string",
"structure_outline": [
"string"
],
"on_screen_text": "string",
"vision_tags": {},
"detected_products": {},
"features": {},
"features_experimental": {}
}
],
"not_found": [
"string"
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | VideoAnalysisBatchResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Get one video's bottom-of-funnel verdict
GET /videos/{video_id}/bof
Whether a video is bottom-of-funnel content — direct-response creative that pushes the viewer to buy now (discount, urgency, explicit call to action) rather than building awareness.
bof_status is the raw verdict (bof, not_bof, needs_review, pending) and bof_confidence scores it 0-100; is_bof is the displayable answer, true only for a bof verdict at confidence >= 90 — the same threshold behind the BOF badge and filter in the Reacher portal, so the API and the portal can never disagree about a video. matched_keywords, matched_patterns and matched_signals explain the verdict.
A video this shop owns that the classifier has no verdict for returns 200 with classified: false and is_bof: false; classification_status then says why (pending, no_transcript, or not_analyzed) — classified: false is a coverage state, not an error.
Only videos belonging to the calling key's shop are readable; any other video_id returns 404. Single-shop only — set x-shop-id to one shop ID.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| video_id | path | string | true | Video id from any Reacher video surface. |
Example responses
200 Response
{
"data": {
"video_id": "string",
"classified": true,
"classification_status": "classified",
"bof_status": "string",
"bof_confidence": 0,
"is_bof": true,
"matched_signals": [
"string"
],
"matched_keywords": [
"string"
],
"matched_patterns": [
"string"
],
"classified_at": "2019-08-24T14:15:22Z"
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | VideoBofResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Samples
Sample request tracking and per-product breakdowns.
List sample requests
POST /samples/list
Track sample requests from creators in your shop. Shows only sample-related statuses. Data updates approximately every hour.
Each row includes the requesting creator's bio, categories, and email (sourced from the same regional creators table the AI Creator Search API reads), so consumers can score sample requests on brand/niche fit without a second API call. These fields are null when the creator has no row in the regional creators table.
Body parameter
{
"page": 1,
"page_size": 50,
"sort_by": "updated_at",
"sort_dir": "asc",
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"status": "string",
"creator_handle": "string",
"product_id": "string"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | SamplesListRequest | true | none |
Example responses
200 Response
{
"data": [
{
"creator_handle": "string",
"product_id": "string",
"product_title": "string",
"status": "string",
"gmv": 0,
"units_sold": 0,
"sample_received": 0,
"updated_at": "string",
"bio": "string",
"categories": [
"string"
],
"email": "string"
}
],
"currency": "string",
"pagination": null,
"date_range": {
"start_date": "string",
"end_date": "string"
},
"shops_queried": [
"string"
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | SamplesListPaginatedResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Sample metrics by product
POST /samples/by-product
Sample performance breakdown by product. Shows requests, approvals, and GMV per product. Data can be up to three days stale, given the delay in affiliate center.
Body parameter
{
"page": 1,
"page_size": 50,
"sort_by": "total_requests",
"sort_dir": "asc",
"start_date": "2019-08-24",
"end_date": "2019-08-24"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | SamplesByProductRequest | true | none |
Example responses
200 Response
{
"data": [
{
"product_id": "string",
"product_name": "string",
"total_requests": 0,
"approved": 0,
"sample_gmv": 0,
"videos_from_samples": 0
}
],
"currency": "string",
"pagination": null,
"date_range": {
"start_date": "string",
"end_date": "string"
},
"shops_queried": [
"string"
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | SamplesByProductPaginatedResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Sample request stat cards
GET /samples/metrics
The four stat cards above the sample-request table: pendingReview (how many requests await a decision, plus how many of those are expiring soon), approvedInAutoProcess (samples auto-approved by an automation), completionRate (share of approved samples that produced content), and approvalTarget (usage against the shop's approval quota). The change metrics compare against the immediately preceding period of equal length.
dataFreshness reports how current the underlying sample data is — TikTok's sample feed lags, so surface it rather than presenting the counts as real-time.
Under a sku_ids filter, notScopableBySku names the cards that could not be narrowed — approvedInAutoProcess and approvalTarget, whose counters are product-grain — so treat those as unscoped rather than filtered.
date_from/date_to must be given together and bound request creation date. Single-shop only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| product_ids | query | any | false | Comma-separated product IDs to filter by. Omit for all products. |
| sku_ids | query | any | false | Comma-separated SKU IDs. AND-ed with product_ids, so passing both narrows to those SKUs rather than widening. |
| date_from | query | any | false | Start of the window (inclusive). Requires date_to. |
| date_to | query | any | false | End of the window (inclusive). Requires date_from. |
| exclude_rejected | query | boolean | false | Exclude creators previously rejected/cancelled by this shop. |
| include_archived | query | boolean | false | Include sample requests archived in the portal. |
Example responses
200 Response
{
"pendingReview": {
"count": 0,
"expiringSoon": 0
},
"approvedInAutoProcess": {
"count": 0,
"changePct": 0,
"changeDirection": "up"
},
"completionRate": {
"rate": 0,
"changePct": 0,
"changeDirection": "up"
},
"approvalTarget": {
"monthlyLimit": 0,
"monthlyUsed": 0,
"dailyTarget": 0,
"dailyCurrent": 0,
"dailyPct": 0,
"onTrack": true
},
"dataFreshness": {
"lastSyncedAt": "string",
"isStale": false,
"isRefreshing": false
},
"notScopableBySku": [
"string"
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | MetricsResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Sample request pipeline funnel counts
GET /samples/pipeline-counts
How many sample requests sit at each stage of the fulfilment funnel: toReview → readyToShip → shipped → pendingContent → completed, plus cancelled. Also returns the shop's completionRate, its approvalTarget usage, the archivedCount, and expiringCount (requests about to lapse if no decision is made). approvalTarget is always shop-wide: it ignores product_ids and sku_ids.
Counts honour the same filters as the portal table, so a filtered funnel and a filtered list agree. They EXCLUDE requests hidden because the creator is archived (archivedCount.total is how many those are, and archivedCounts is unset here); for stage counts that include them, and so match TikTok's Affiliate Center, use GET /funnel/v2/counts. The portal's advanced numeric creator filters (GMV / views / post-rate bands) are not exposed here — use POST /samples/list and aggregate if you need those.
date_from/date_to must be given together. Single-shop only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| product_ids | query | any | false | Comma-separated product IDs to filter by. |
| sku_ids | query | any | false | Comma-separated SKU IDs. AND-ed with product_ids, so passing both narrows to those SKUs rather than widening. |
| date_from | query | any | false | Start of the window (inclusive). Requires date_to. |
| date_to | query | any | false | End of the window (inclusive). Requires date_from. |
| exclude_rejected | query | boolean | false | Exclude creators previously rejected/cancelled by this shop. |
| include_archived | query | boolean | false | Include sample requests archived in the portal. |
| search | query | any | false | Free-text filter on creator handle / name. |
| tags | query | any | false | Comma-separated CRM tags to filter by. |
| show_expiring | query | boolean | false | Count only requests that are close to expiring. |
Example responses
200 Response
{
"counts": {
"toReview": 0,
"readyToShip": 0,
"shipped": 0,
"pendingContent": 0,
"completed": 0,
"cancelled": 0,
"all": 0,
"inShipment": 0,
"posted": 0,
"allApproved": 0,
"overdue": 0,
"rejected": 0,
"expired": 0,
"ignored": 0
},
"archivedCounts": {
"toReview": 0,
"readyToShip": 0,
"shipped": 0,
"pendingContent": 0,
"completed": 0,
"cancelled": 0,
"all": 0,
"inShipment": 0,
"posted": 0,
"allApproved": 0,
"overdue": 0,
"rejected": 0,
"expired": 0,
"ignored": 0
},
"completionRate": 0,
"approvalTarget": {
"limit": 0,
"used": 0
},
"archivedCount": {
"creators": 0,
"products": 0,
"total": 0
},
"expiringCount": 0,
"dataFreshness": {
"lastSyncedAt": "string",
"isStale": false,
"isRefreshing": false
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | PipelineCountsResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Per-product sample usage this month
GET /samples/product-usage
How many samples each product has consumed in the current calendar month (productId → usedThisMonth). This is the counter the portal checks per-product sample limits against, so it answers 'which product is about to run out of its monthly allowance'.
Products with no usage this month are omitted. Single-shop only.
Example responses
200 Response
{
"data": [
{
"productId": "string",
"usedThisMonth": 0
}
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | ProductUsageResponse |
List auto-approval product configs
GET /samples/product-config
Per-product sample auto-approval rules for this shop: monthly sample limit, daily approval target, the minimum GMV / post-rate a requester must clear, the ideal-creator profiles they must match, and how many samples of that product have already gone out this month (usedThisMonth). Products with no row here follow the shop-wide quota only. Read-only; requires a single shop.
Example responses
200 Response
{
"data": [
{
"id": 0,
"productId": "string",
"productName": "string",
"sku": "string",
"productImage": "string",
"monthlySampleLimit": 0,
"dailyApprovalTarget": 0,
"usedThisMonth": 0,
"idealCreatorProfiles": [
{
"id": 0,
"name": "string"
}
],
"config": {
"minGmv": 0,
"minPostRate": 0
},
"createdAt": "string",
"updatedAt": "string"
}
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | ProductConfigListResponse |
Create auto-approval product config
POST /samples/product-config
Create the auto-approval rule for one product. Requires read_write scope and a single shop. productId must not already have a config in this shop — a duplicate returns 409 PRODUCT_CONFIG_EXISTS; use PUT /samples/product-config/{config_id} to change an existing rule. idealCreatorProfileIds that don't belong to this shop are dropped rather than linked.
Body parameter
{
"monthlySampleLimit": 0,
"dailyApprovalTarget": 0,
"idealCreatorProfileIds": [
0
],
"config": {
"minGmv": 0,
"minPostRate": 0
},
"productId": "string"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | PublicProductConfigCreateRequest | true | none |
Example responses
201 Response
{
"success": true,
"data": {
"id": 0,
"productId": "string",
"productName": "string",
"sku": "string",
"productImage": "string",
"monthlySampleLimit": 0,
"dailyApprovalTarget": 0,
"usedThisMonth": 0,
"idealCreatorProfiles": [
{
"id": 0,
"name": "string"
}
],
"config": {
"minGmv": 0,
"minPostRate": 0
},
"createdAt": "string",
"updatedAt": "string"
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 201 | Created | Successful Response | ProductConfigResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Update auto-approval product config
PUT /samples/product-config/{config_id}
Partially update one product's auto-approval rule. Requires read_write scope and a single shop. Omitted fields keep their current value; an explicit null clears the setting. config_id is re-checked against this shop before the write — a config belonging to another shop returns 404, never a cross-shop update.
Body parameter
{
"monthlySampleLimit": 0,
"dailyApprovalTarget": 0,
"idealCreatorProfileIds": [
0
],
"config": {
"minGmv": 0,
"minPostRate": 0
}
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| config_id | path | integer | true | none |
| body | body | ProductConfigUpsertRequest | true | none |
Example responses
200 Response
{
"success": true,
"data": {
"id": 0,
"productId": "string",
"productName": "string",
"sku": "string",
"productImage": "string",
"monthlySampleLimit": 0,
"dailyApprovalTarget": 0,
"usedThisMonth": 0,
"idealCreatorProfiles": [
{
"id": 0,
"name": "string"
}
],
"config": {
"minGmv": 0,
"minPostRate": 0
},
"createdAt": "string",
"updatedAt": "string"
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | ProductConfigResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Delete auto-approval product config
DELETE /samples/product-config/{config_id}
Remove one product's auto-approval rule. The product falls back to the shop-wide quota; nothing already approved is affected. Requires read_write scope and a single shop. config_id is re-checked against this shop before the delete — a foreign ID returns 404.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| config_id | path | integer | true | none |
Example responses
200 Response
{
"success": true
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | SuccessResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Get shop sample quota
GET /samples/quota
The shop-wide monthly sample ceiling. monthlyLimit is null when the shop has never set one, which means unlimited — per-product limits still apply. Read-only; requires a single shop.
Example responses
200 Response
{
"success": true,
"data": {
"shopId": 0,
"monthlyLimit": 0,
"createdAt": "string",
"updatedAt": "string"
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | QuotaSettingsResponse |
Update shop sample quota
PUT /samples/quota
Set the shop-wide monthly sample ceiling. Requires read_write scope and a single shop. monthlyLimit must be present: a number caps the shop, null removes the cap. The shop is taken from the authenticated key / x-shop-id, never from the body.
Body parameter
{
"monthlyLimit": 0
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | PublicQuotaUpdateRequest | true | none |
Example responses
200 Response
{
"success": true,
"data": {
"shopId": 0,
"monthlyLimit": 0,
"createdAt": "string",
"updatedAt": "string"
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | QuotaSettingsResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
List ideal-creator profiles
GET /samples/profiles
Reusable creator-quality criteria (minimum post rate, GMV range, minimum views, minimum followers) that product configs point at when deciding whether to auto-approve a sample request. linkedProducts counts how many product configs reference each profile. Read-only; requires a single shop.
Example responses
200 Response
{
"data": [
{
"id": 0,
"name": "string",
"criteria": {
"minPostRate": 0,
"gmvRange": {
"min": 0,
"max": 0
},
"minViews": 0,
"minFollowers": 0
},
"linkedProducts": 0,
"createdAt": "string",
"updatedAt": "string"
}
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | modules__sample_requests__SampleRequestsV2Schemas__ProfileListResponse |
Create ideal-creator profile
POST /samples/profiles
Create a reusable ideal-creator profile for this shop. Requires read_write scope and a single shop. Names are unique per shop — a duplicate returns 409 PROFILE_NAME_EXISTS. Link the new profile to products via idealCreatorProfileIds on a product config.
Body parameter
{
"name": "string",
"criteria": {
"minPostRate": 0,
"gmvRange": {
"min": 0,
"max": 0
},
"minViews": 0,
"minFollowers": 0
}
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | ProfileCreateRequest | true | none |
Example responses
201 Response
{
"success": true,
"data": {
"id": 0,
"name": "string",
"criteria": {
"minPostRate": 0,
"gmvRange": {
"min": 0,
"max": 0
},
"minViews": 0,
"minFollowers": 0
},
"linkedProducts": 0,
"createdAt": "string",
"updatedAt": "string"
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 201 | Created | Successful Response | ProfileResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Update ideal-creator profile
PUT /samples/profiles/{profile_id}
Replace a profile's name and criteria. Requires read_write scope and a single shop. profile_id is re-checked against this shop before the write — a profile belonging to another shop returns 404. Renaming onto an existing name returns 409 PROFILE_NAME_EXISTS. Product configs linked to this profile pick up the new criteria immediately.
Body parameter
{
"name": "string",
"criteria": {
"minPostRate": 0,
"gmvRange": {
"min": 0,
"max": 0
},
"minViews": 0,
"minFollowers": 0
}
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| profile_id | path | integer | true | none |
| body | body | ProfileCreateRequest | true | none |
Example responses
200 Response
{
"success": true,
"data": {
"id": 0,
"name": "string",
"criteria": {
"minPostRate": 0,
"gmvRange": {
"min": 0,
"max": 0
},
"minViews": 0,
"minFollowers": 0
},
"linkedProducts": 0,
"createdAt": "string",
"updatedAt": "string"
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | ProfileResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Delete ideal-creator profile
DELETE /samples/profiles/{profile_id}
Delete a profile and unlink it from every product config that referenced it — those products keep their other criteria. Requires read_write scope and a single shop. profile_id is re-checked against this shop before the delete — a foreign ID returns 404.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| profile_id | path | integer | true | none |
Example responses
200 Response
{
"success": true
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | SuccessResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Automations
Automation performance and outreach metrics.
Automation portfolio stats for one shop
GET /automations/stats
Shop-level overview of your automations: total_automations, live_automations, archived_automations, and the split between regular_automations and email_automations, plus three breakdowns — by_type (Target Collab, Message, Email, Sample Request Processing, …), by_status (running / stopped / completed / …) and by_type_and_state (each type split live vs archived) — and an aggregated metrics block rolled up across the shop's automations.
This is the portfolio view; use POST /automations/list for the per-automation rows behind it. Pass crm_only=true to count only automations backed by a CRM group. Single-shop only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| crm_only | query | boolean | false | Count only CRM-backed automations (those with a crm_group_id). Defaults to false — all automations. |
Example responses
200 Response
{
"total_automations": 0,
"live_automations": 0,
"archived_automations": 0,
"email_automations": 0,
"regular_automations": 0,
"by_type": {
"property1": 0,
"property2": 0
},
"by_status": {
"property1": 0,
"property2": 0
},
"by_type_and_state": {
"property1": {
"property1": 0,
"property2": 0
},
"property2": {
"property1": 0,
"property2": 0
}
},
"metrics": {
"total_creators_reached": 0,
"total_sample_requests": 0,
"total_creators": 0,
"total_emails_sent": 0,
"total_dm_messages_sent": 0,
"total_dm_response_count": 0,
"total_reply_rate": 0,
"total_email_open_count": 0,
"total_email_reply_count": 0,
"total_email_open_rate": 0,
"total_email_reply_rate": 0
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | AutomationStatsResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Performance rollup for one automation
GET /automations/{automation_id}/metrics
The precomputed performance rollup for ONE automation — the numbers the portal shows above the automation's tabs.
tab_counts carries the creator-tracker, sample-request and video counts (the tracker count already excludes creators on the automation's current omit lists, so it matches the tab it labels). top_line_metrics carries creators_reached, dm_response_count and reply_rate, unique_creators_posted and post_rate, videos_count, total_revenue (GMV), and total views / shares / likes.
Check data_available first. It is false when the rollup aggregator has not yet computed a row for this automation — the zeros are then 'not computed yet', not 'nothing happened'. top_line_metrics is null for automation types that have no full-funnel view (is_full_view: false).
Single-shop only; the automation must belong to that shop or this returns 404.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| automation_id | path | integer | true | none |
Example responses
200 Response
{
"data_available": true,
"is_full_view": false,
"tab_counts": {
"creator_tracker_count": 0,
"sample_request_count": 0,
"video_count": 0,
"reply_count": 0,
"unread_count": 0
},
"top_line_metrics": {
"creators_reached": 0,
"dm_response_count": 0,
"reply_rate": 0,
"unique_creators_posted": 0,
"post_rate": 0,
"videos_count": 0,
"total_revenue": 0,
"total_views": 0,
"total_shares": 0,
"total_likes": 0
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | AutomationMetricsResponse |
| 404 | Not Found | Automation not found in this shop. | None |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
List automations
POST /automations/list
Your automations with performance and outreach metrics. Includes creators reached, sample requests, videos posted, and GMV. reply_rate is populated for Running, Stopped, and Completed automations.
Body parameter
{
"page": 1,
"page_size": 50,
"sort_by": "gmv",
"sort_dir": "asc",
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"automation_type": "string",
"status": "string",
"show_archived": false,
"created_via": [
"string"
],
"exclude_created_via": [
"string"
]
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | AutomationsListRequest | true | none |
Example responses
200 Response
{
"data": [
{
"automation_id": 0,
"automation_name": "string",
"automation_type": "string",
"is_evergreen": false,
"status": "string",
"status_message": "string",
"gmv": 0,
"sample_requests": 0,
"accepted_requests": 0,
"videos_posted": 0,
"videos_converted": 0,
"creators_reached": 0,
"target_collab_cleanup_creators_reached": 0,
"dm_response_count": 0,
"reply_rate": 0,
"skipped": 0,
"total_creators": 0,
"creators_remaining": 0,
"created_at": "string",
"completed_at": "string",
"created_via": "string"
}
],
"currency": "string",
"pagination": null,
"date_range": {
"start_date": "string",
"end_date": "string"
},
"shops_queried": [
"string"
],
"aggregate": {
"creators_reached": 0,
"tc_invites": 0,
"tc_invites_creator_count": 0,
"creators_messaged": 0,
"emails_sent": 0,
"sample_request": 0,
"sample_approved": 0,
"videos_posted": 0,
"videos_converted": 0,
"spark_codes": 0,
"added_showcase_affiliates": 0,
"accepted_tc_count": 0,
"tc_showcase_creator_count": 0,
"tc_content_creator_count": 0,
"tc_acceptance_rate": 0,
"coverage_through": "string"
},
"excluded": {}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | AutomationsListPaginatedResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Region-specific filter options
GET /automations/filters
Returns the filter options (categories, GMV ranges, follower segments, engagement / view tiers, content-style options, etc.) valid for the given shop region. Use the response to drive filter dropdowns or to validate creators_to_include.filters values before submitting a create request.
Region differences:
- Numeric ranges use the region's currency (
£for UK,$for US,€for EU regions,R$for BR, etc.). - Category lists differ — UK has a smaller category set than US.
- AI-search filters (face_visibility / content_style / personality_tone / etc.) are only fully populated for US today; other regions surface a subset.
- Ethnicity filter is available globally regardless of region.
Supported regions: US, UK, IE, MX, DE, FR, ES, BR, IT, GLOBAL (alias for US).
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| shop_region | query | string | true | none |
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Response Schema
Outreach send capacity for this shop
GET /automations/outreach-capacity
Current outreach send-capacity for a single shop, so callers can pre-check before sending TC invites / DMs and schedule retries when capacity frees.
Two independent limits govern outreach:
- Daily per-shop throttle counted in UTC (resets at 00:00 UTC — see
daily_window_resets_at).daily_creators_usedcounts actual sends only (skipped/creator_not_foundinvites do not count). The daily ceiling is plan/TikTok-dependent and is not returned as a single number;daily_limit_throttledflags when the shop is currently paused by it. - TikTok's outreach quota, enforced TikTok-side and read from TikTok's own quota endpoint — see
outreach_quotafor the consumption, ceiling and refresh instant. It counts connections shop-wide, so it includes outreach not sent through Reacher. Most shops are on a weeklyPERIODquota; some hold aBONUSgrant that does not roll, so checkoutreach_quota.quota_typebefore calling it weekly. Null when the shop has no synced quota — null means unknown, never zero.weekly_limit_throttledflags when paused by the limit.
The daily pool is shared between the automation engine and direct POST /target-collabs invites. Requires a single shop.
Example responses
200 Response
{
"shop_id": 0,
"daily_creators_used": 0,
"daily_window_resets_at": "string",
"concurrent_automations_running": 0,
"max_concurrent_automations": 0,
"daily_limit_throttled": true,
"weekly_limit_throttled": true,
"outreach_quota": {
"quota_type": "string",
"used": 0,
"limit": 0,
"remaining": 0,
"unlimited": true,
"resets_at": "string",
"gmv_tier": "string",
"gmv_level_rule": [
null
]
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | OutreachCapacityResponse |
Get automation detail
GET /automations/{automation_id}
Detailed automation data with performance metrics.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| automation_id | path | integer | true | none |
Example responses
200 Response
{
"data": {
"automation_id": 0,
"automation_name": "string",
"automation_type": "string",
"is_evergreen": false,
"status": "string",
"status_message": "string",
"gmv": 0,
"sample_requests": 0,
"accepted_requests": 0,
"videos_posted": 0,
"videos_converted": 0,
"creators_reached": 0,
"target_collab_cleanup_creators_reached": 0,
"dm_response_count": 0,
"reply_rate": 0,
"skipped": 0,
"total_creators": 0,
"creators_remaining": 0,
"created_at": "string",
"completed_at": "string",
"created_via": "string"
},
"creators_remaining": 0,
"details": {
"messaging": {
"creator_message": "string",
"message_type": "string",
"message_sequence": [
{
"message_type": "string",
"message_entry": "string",
"product_id": "string",
"days_after_previous": 0,
"has_image": true
}
],
"follow_up_steps": [
{
"message_type": "string",
"message_entry": "string",
"product_id": "string",
"days_after_previous": 0,
"has_image": true
}
],
"personalization": {},
"ai_custom_qa": [
null
],
"spark_code_form": {}
},
"target_collab": {
"invitation_name": "string",
"invitation_message": "string",
"valid_until": "string",
"content_type": "string",
"products": [
{
"product_id": "string",
"product_name": "string",
"commission_rate": 0,
"shop_min_commission": 0,
"shop_ads_commission_rate": 0
}
],
"offer_free_samples": true,
"auto_approve_samples": true,
"auto_resolve_conflicts": "string",
"support_contact_email": "string",
"support_contact_phone": "string",
"invite_start_before_days": "string",
"invite_expire_after_days": "string"
},
"schedule": {
"daily_caps": {
"property1": 0,
"property2": 0
},
"start_time": "string",
"timezone": "string"
},
"targeting": {
"creator_source_type": "string",
"include_lists": [
"string"
],
"include_uploads": [
null
],
"crm_group_id": "string",
"exclude_lists": [
"string"
],
"exclude_crm_groups": [
null
],
"exclude_previously_messaged": true,
"filters": {},
"ai_search_filters": {}
}
},
"currency": "string"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | AutomationDetailResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Update automation
PATCH /automations/{automation_id}
Partial update across all 4 types. Cannot change automation_type, shop, lifecycle state, or system fields. Idempotency-Key optional; X-Dry-Run: true supported.
Body parameter
{
"automation_name": "string",
"schedule": {
"Monday_maxCreators": 0,
"Tuesday_maxCreators": 0,
"Wednesday_maxCreators": 0,
"Thursday_maxCreators": 0,
"Friday_maxCreators": 0,
"Saturday_maxCreators": 0,
"Sunday_maxCreators": 0,
"start_time": "string",
"end_time": "string",
"timezone": "string"
},
"creators_to_include": {
"list_upload": [
"string"
],
"lists_selected": [
"string"
],
"filters": {
"product_categories": [
"string"
],
"follower_count": {
"min": 0,
"max": 0
},
"creator_ethnicity": [
"string"
],
"gender": [
"string"
],
"age_range": [
"string"
],
"languages": [
"string"
],
"community": [
"string"
],
"gmv": {
"min": 0,
"max": 0
},
"units_sold": {
"min": 0,
"max": 0
},
"average_views": {
"min": 0,
"max": 0
},
"engagement_rate": {
"min": 0,
"max": 0
},
"post_rate": {
"min": 0,
"max": 0
},
"video_gpm": {
"min": 0,
"max": 0
},
"live_gpm": {
"min": 0,
"max": 0
},
"follower_age": [
"string"
],
"follower_gender": [
"string"
],
"face_visibility": [
"string"
],
"content_style": [
"string"
],
"production_quality": [
"string"
],
"personality_tone": [
"string"
],
"body_type": [
"string"
],
"hair_type": [
"string"
]
},
"crm_group_id": "string",
"crm_group_entered_after": "2019-08-24",
"crm_group_entered_before": "2019-08-24"
},
"creators_to_exclude": {
"list_upload": [
"string"
],
"lists_selected": [
"string"
],
"crm_groups": [
"string"
],
"exclude_previously_messaged": false
},
"messages": [
{
"type": "message",
"body": "string",
"image_url": "string",
"product_id": "string",
"submission_url_slug": "string"
}
],
"follow_ups": [
{
"delay_days": 30,
"addons": [
{
"type": "message",
"body": "string",
"image_url": "string",
"product_id": "string",
"submission_url_slug": "string"
}
]
}
],
"target_collab": {
"invitation_name": "string",
"valid_until": "2019-08-24",
"message": "string",
"products": [
{
"product_id": "string",
"commission_rate": 1,
"shop_min_commission": 1,
"shop_ads_commission_rate": 1
}
],
"content_type": "no_preference",
"sample_policy": {
"offer_free_samples": true,
"auto_approve": true,
"send_to": "brand_recipient"
},
"support_contact": {
"email": "string",
"phone": "string"
},
"lock_receivers_profiles": true
},
"dm_config": {
"spark_code": {
"only_collect_creator_information": false,
"spark_code_submission_url": "string"
}
},
"sample_request": {
"action": "approve",
"rejection_reason": "NOT_MATCH",
"approval_message": "string",
"rejection_message": "string",
"message_images": [
"string"
],
"products": {
"include_all_products": false,
"selected_products": [
{
"product_id": "string",
"max_approvals_per_week": 10000
}
],
"weekly_auto_approval_per_product": 1
},
"minimum_performance_criteria": {
"followers": 0,
"avg_views": 0,
"engagement_rate": 1,
"post_rate": 1,
"creator_gmv_30_days": 0,
"gmv_per_sample": 0
},
"maximum_performance_criteria": {
"followers": 0,
"avg_views": 0,
"engagement_rate": 1,
"post_rate": 1,
"creator_gmv_30_days": 0,
"gmv_per_sample": 0
},
"auto_approval_settings": {
"enabled": false,
"total_weekly_approved_sample_limit": 1,
"always_approve_status": "string",
"always_approve_from_lists_ids": [
0
]
},
"target_list": [
0
]
},
"ai_enabled": true,
"is_evergreen": true,
"end_date": "2019-08-24",
"business_hours_timezone": "string",
"email_sent_per_day": 1,
"subject": "string",
"body": "string"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| automation_id | path | integer | true | none |
| Idempotency-Key | header | any | false | none |
| X-Dry-Run | header | any | false | none |
| body | body | AutomationUpdateRequest | true | none |
Example responses
200 Response
{
"data": {
"automation_id": 0,
"shop_id": 0,
"automation_name": "string",
"automation_type": "string",
"automation_status": "string",
"state": "string",
"config": {},
"schedule": {},
"creators_to_include": {},
"creators_to_exclude": {},
"crm_group_id": "string",
"ai_enabled": false,
"end_date": "string",
"created_at": "string",
"updated_at": "string",
"created_via": "string",
"side_effects": {}
},
"dry_run": false,
"side_effects": {}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | AutomationWriteResponseV2 |
| 400 | Bad Request | Validation, missing/invalid Idempotency-Key, or forbidden update field. | WriteErrorResponse |
| 403 | Forbidden | API key lacks read_write scope (WRITE_NOT_PERMITTED). |
WriteErrorResponse |
| 404 | Not Found | Automation/list/group not in this shop. | WriteErrorResponse |
| 409 | Conflict | Idempotency conflict or archived row. | WriteErrorResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
| 429 | Too Many Requests | Write-tier rate limit (10/min, 50/hr, 100/day) exceeded. | WriteErrorResponse |
Delete automation
DELETE /automations/{automation_id}
Soft-delete (state=archived). Reversible only by Reacher support. Calling on already-archived returns 200 with already_archived: true.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| automation_id | path | integer | true | none |
| Idempotency-Key | header | any | false | none |
| X-Dry-Run | header | any | false | none |
Example responses
200 Response
{
"data": {
"automation_id": 0,
"shop_id": 0,
"automation_name": "string",
"automation_type": "string",
"automation_status": "string",
"state": "string",
"config": {},
"schedule": {},
"creators_to_include": {},
"creators_to_exclude": {},
"crm_group_id": "string",
"ai_enabled": false,
"end_date": "string",
"created_at": "string",
"updated_at": "string",
"created_via": "string",
"side_effects": {}
},
"dry_run": false,
"side_effects": {}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | AutomationWriteResponseV2 |
| 400 | Bad Request | Validation, missing/invalid Idempotency-Key, or forbidden update field. | WriteErrorResponse |
| 403 | Forbidden | API key lacks read_write scope (WRITE_NOT_PERMITTED). |
WriteErrorResponse |
| 404 | Not Found | Automation/list/group not in this shop. | WriteErrorResponse |
| 409 | Conflict | Idempotency conflict or archived row. | WriteErrorResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
| 429 | Too Many Requests | Write-tier rate limit (10/min, 50/hr, 100/day) exceeded. | WriteErrorResponse |
Per-creator outcome ledger
GET /automations/{automation_id}/creators
Per-creator outcomes for ONE automation: which creators got an invite/DM submitted, which were skipped (and why), which were previously invited, etc. This is the authoritative per-creator answer to 'what happened to each invite' — backed by the always-present target_collabs / Messages / skipped_creators tables, so it stays populated even after the aggregate creators_reached / skipped counters on the list/detail responses age out (those read from a stats view that only retains recently-active automations).
Queued ≠ delivered. An invite_submitted / outreach_sent outcome means Reacher's worker submitted the invite/DM through the same browser-automation path the portal uses. TikTok does not return a per-creator inbox-delivery receipt, so this is the most authoritative delivery signal available — not a confirmed inbox event. Requires a single shop.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| automation_id | path | integer | true | none |
| page | query | integer | false | none |
| page_size | query | integer | false | none |
Example responses
200 Response
{
"data": [
{
"creator_handle": "string",
"outcome": "string",
"status": "string",
"detail": "string",
"skip_reason": "string",
"invitation_id": "string"
}
],
"summary": {
"total": 0,
"invite_submitted": 0,
"outreach_sent": 0,
"previously_invited": 0,
"invite_removed": 0,
"skipped": 0,
"unknown": 0
},
"pagination": null
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | AutomationCreatorsResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Automation message templates
GET /automations/{automation_id}/messages
The message copy configured on one automation, flattened into a uniform shape regardless of automation type: the TC invite template (tc_invite_message), the ordered DM sequence (message_sequence — array order is send order), follow-up steps, and AI-chatbot Q&A. Placeholders (e.g. {{creators username}}) are NOT substituted — this is the template. For the exact per-creator text that was actually sent, use GET /automations/{automation_id}/sent-messages. Requires a single shop.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| automation_id | path | integer | true | none |
Example responses
200 Response
{
"automation_id": 0,
"automation_name": "string",
"automation_type": "string",
"tc_invite_message": "string",
"message_sequence": [
null
],
"follow_up_steps": [
null
],
"ai_custom_qa": [
null
],
"personalization": {
"enabled": false,
"tone": "string",
"fallback_message": "string",
"offer_discussion": "string",
"product_description": "string",
"product_selling_points": "string",
"word_counts": {
"property1": 0,
"property2": 0
},
"name_source": "string"
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | AutomationMessagesTemplateResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Exact sent message copy (grouped by creator)
GET /automations/{automation_id}/sent-messages
What this automation actually sent, with honest coverage semantics:
dm_sent— the exact rendered DM text per creator (placeholders substituted at send time), grouped by creator, most recently messaged first. Filter withcreator_handle; page depth withcreator_limit/messages_per_creator.tc_sent— Target-Collab invitation batches (who was invited, when, status) plus the invite template. TikTok TC invites are sent from the template and the per-creator rendered text is not stored —exact_copy: falseandcoverage_notestate this explicitly. When the automation is a campaign's TC automation,campaigncarries the link.
Hybrid automations (Message + TC) populate both sections. Empty sections carry an explicit message instead of blank lists. Read-only. Requires a single shop.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| automation_id | path | integer | true | none |
| creator_limit | query | integer | false | none |
| messages_per_creator | query | integer | false | none |
| creator_handle | query | any | false | none |
Example responses
200 Response
{
"automation_id": 0,
"automation_name": "string",
"automation_type": "string",
"template": {
"automation_id": 0,
"automation_name": "string",
"automation_type": "string",
"tc_invite_message": "string",
"message_sequence": [
null
],
"follow_up_steps": [
null
],
"ai_custom_qa": [
null
],
"personalization": {
"enabled": false,
"tone": "string",
"fallback_message": "string",
"offer_discussion": "string",
"product_description": "string",
"product_selling_points": "string",
"word_counts": {
"property1": 0,
"property2": 0
},
"name_source": "string"
}
},
"dm_sent": {
"exact_copy": true,
"groups": [
{
"creator_name": "string",
"creator_id": "string",
"last_sent_at": "string",
"messages": [
{
"content": "string",
"sent_at": "string",
"status": "string"
}
]
}
],
"creators_returned": 0,
"total_creators": 0,
"total_messages": 0,
"message": "string"
},
"tc_sent": {
"exact_copy": false,
"coverage_note": "string",
"template_text": "string",
"placeholders_present": false,
"invitations": [
{
"sent_at": "string",
"status": "string",
"creator_count": 0,
"creators": [
"string"
],
"creators_truncated": false,
"expiration_date": "string"
}
],
"invitations_returned": 0,
"total_invitations": 0,
"total_creators_invited": 0,
"status_breakdown": {
"property1": 0,
"property2": 0
},
"campaign": {
"campaign_id": 0,
"campaign_name": "string"
},
"message": "string"
},
"message": "string"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | AutomationSentMessagesResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Create Target Collab automation
POST /automations/target-collab
Create a Target Collab (TC) invitation automation with optional follow-up DMs. Required: read_write scope, Idempotency-Key header. Pass X-Dry-Run: true to validate without persisting.
Body parameter
{
"automation_name": "string",
"schedule": {
"Monday_maxCreators": 0,
"Tuesday_maxCreators": 0,
"Wednesday_maxCreators": 0,
"Thursday_maxCreators": 0,
"Friday_maxCreators": 0,
"Saturday_maxCreators": 0,
"Sunday_maxCreators": 0,
"start_time": "string",
"end_time": "string",
"timezone": "string"
},
"creators_to_include": {
"list_upload": [
"string"
],
"lists_selected": [
"string"
],
"filters": {
"product_categories": [
"string"
],
"follower_count": {
"min": 0,
"max": 0
},
"creator_ethnicity": [
"string"
],
"gender": [
"string"
],
"age_range": [
"string"
],
"languages": [
"string"
],
"community": [
"string"
],
"gmv": {
"min": 0,
"max": 0
},
"units_sold": {
"min": 0,
"max": 0
},
"average_views": {
"min": 0,
"max": 0
},
"engagement_rate": {
"min": 0,
"max": 0
},
"post_rate": {
"min": 0,
"max": 0
},
"video_gpm": {
"min": 0,
"max": 0
},
"live_gpm": {
"min": 0,
"max": 0
},
"follower_age": [
"string"
],
"follower_gender": [
"string"
],
"face_visibility": [
"string"
],
"content_style": [
"string"
],
"production_quality": [
"string"
],
"personality_tone": [
"string"
],
"body_type": [
"string"
],
"hair_type": [
"string"
]
},
"crm_group_id": "string",
"crm_group_entered_after": "2019-08-24",
"crm_group_entered_before": "2019-08-24"
},
"creators_to_exclude": {
"list_upload": [
"string"
],
"lists_selected": [
"string"
],
"crm_groups": [
"string"
],
"exclude_previously_messaged": false
},
"target_collab": {
"invitation_name": "string",
"valid_until": "2019-08-24",
"message": "string",
"products": [
{
"product_id": "string",
"commission_rate": 1,
"shop_min_commission": 1,
"shop_ads_commission_rate": 1
}
],
"content_type": "no_preference",
"sample_policy": {
"offer_free_samples": false,
"auto_approve": false,
"send_to": "brand_recipient"
},
"support_contact": {
"email": "string",
"phone": "string"
}
},
"messages": [
{
"type": "message",
"body": "string",
"image_url": "string",
"product_id": "string",
"submission_url_slug": "string"
}
],
"follow_ups": [
{
"delay_days": 30,
"addons": [
{
"type": "message",
"body": "string",
"image_url": "string",
"product_id": "string",
"submission_url_slug": "string"
}
]
}
],
"ai_enabled": false,
"end_date": "2019-08-24",
"auto_resolve_conflicts": "SKIP_ALL",
"is_evergreen": false,
"business_hours_timezone": "string"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| Idempotency-Key | header | any | false | none |
| X-Dry-Run | header | any | false | none |
| X-Created-Via | header | any | false | none |
| body | body | AutomationTargetCollabRequest | true | none |
Example responses
201 Response
{
"data": {
"automation_id": 0,
"shop_id": 0,
"automation_name": "string",
"automation_type": "string",
"automation_status": "string",
"state": "string",
"config": {},
"schedule": {},
"creators_to_include": {},
"creators_to_exclude": {},
"crm_group_id": "string",
"ai_enabled": false,
"end_date": "string",
"created_at": "string",
"updated_at": "string",
"created_via": "string",
"side_effects": {}
},
"dry_run": false,
"side_effects": {}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 201 | Created | Successful Response | AutomationWriteResponseV2 |
| 400 | Bad Request | Validation, missing/invalid Idempotency-Key, or forbidden update field. | WriteErrorResponse |
| 403 | Forbidden | API key lacks read_write scope (WRITE_NOT_PERMITTED). |
WriteErrorResponse |
| 404 | Not Found | Automation/list/group not in this shop. | WriteErrorResponse |
| 409 | Conflict | Idempotency conflict or archived row. | WriteErrorResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
| 429 | Too Many Requests | Write-tier rate limit (10/min, 50/hr, 100/day) exceeded. | WriteErrorResponse |
Create TC Cleanup automation
POST /automations/tc-cleanup
Create a TC Cleanup utility automation — re-targets creators in this shop who received a TC invite from a prior automation but didn't accept it. Conceptually closer to sample_request than to the proactive TC outreach types: products + creator selection only, no messages, no follow-ups. Required: read_write scope, Idempotency-Key header. Pass X-Dry-Run: true to validate without persisting.
Body parameter
{
"automation_name": "string",
"schedule": {
"Monday_maxCreators": 0,
"Tuesday_maxCreators": 0,
"Wednesday_maxCreators": 0,
"Thursday_maxCreators": 0,
"Friday_maxCreators": 0,
"Saturday_maxCreators": 0,
"Sunday_maxCreators": 0,
"start_time": "string",
"end_time": "string",
"timezone": "string"
},
"creators_to_include": {
"list_upload": [
"string"
],
"lists_selected": [
"string"
],
"filters": {
"product_categories": [
"string"
],
"follower_count": {
"min": 0,
"max": 0
},
"creator_ethnicity": [
"string"
],
"gender": [
"string"
],
"age_range": [
"string"
],
"languages": [
"string"
],
"community": [
"string"
],
"gmv": {
"min": 0,
"max": 0
},
"units_sold": {
"min": 0,
"max": 0
},
"average_views": {
"min": 0,
"max": 0
},
"engagement_rate": {
"min": 0,
"max": 0
},
"post_rate": {
"min": 0,
"max": 0
},
"video_gpm": {
"min": 0,
"max": 0
},
"live_gpm": {
"min": 0,
"max": 0
},
"follower_age": [
"string"
],
"follower_gender": [
"string"
],
"face_visibility": [
"string"
],
"content_style": [
"string"
],
"production_quality": [
"string"
],
"personality_tone": [
"string"
],
"body_type": [
"string"
],
"hair_type": [
"string"
]
},
"crm_group_id": "string",
"crm_group_entered_after": "2019-08-24",
"crm_group_entered_before": "2019-08-24"
},
"creators_to_exclude": {
"list_upload": [
"string"
],
"lists_selected": [
"string"
],
"crm_groups": [
"string"
],
"exclude_previously_messaged": false
},
"products": [
{
"product_id": "string",
"commission_rate": 1,
"shop_min_commission": 1,
"shop_ads_commission_rate": 1
}
],
"invite_start_before_days": 1,
"invite_expire_after_days": 1,
"end_date": "2019-08-24"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| Idempotency-Key | header | any | false | none |
| X-Dry-Run | header | any | false | none |
| X-Created-Via | header | any | false | none |
| body | body | AutomationTcCleanupRequest | true | none |
Example responses
201 Response
{
"data": {
"automation_id": 0,
"shop_id": 0,
"automation_name": "string",
"automation_type": "string",
"automation_status": "string",
"state": "string",
"config": {},
"schedule": {},
"creators_to_include": {},
"creators_to_exclude": {},
"crm_group_id": "string",
"ai_enabled": false,
"end_date": "string",
"created_at": "string",
"updated_at": "string",
"created_via": "string",
"side_effects": {}
},
"dry_run": false,
"side_effects": {}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 201 | Created | Successful Response | AutomationWriteResponseV2 |
| 400 | Bad Request | Validation, missing/invalid Idempotency-Key, or forbidden update field. | WriteErrorResponse |
| 403 | Forbidden | API key lacks read_write scope (WRITE_NOT_PERMITTED). |
WriteErrorResponse |
| 404 | Not Found | Automation/list/group not in this shop. | WriteErrorResponse |
| 409 | Conflict | Idempotency conflict or archived row. | WriteErrorResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
| 429 | Too Many Requests | Write-tier rate limit (10/min, 50/hr, 100/day) exceeded. | WriteErrorResponse |
Create DM automation
POST /automations/dm
Create a Direct Message automation. The mode field selects between 4 variants: vanilla (text-only), with_image, with_product_card, spark_code (collect TikTok spark codes via form). Each mode has specific addon and config requirements — see model schema.
Body parameter
{
"automation_name": "string",
"mode": "vanilla",
"schedule": {
"Monday_maxCreators": 0,
"Tuesday_maxCreators": 0,
"Wednesday_maxCreators": 0,
"Thursday_maxCreators": 0,
"Friday_maxCreators": 0,
"Saturday_maxCreators": 0,
"Sunday_maxCreators": 0,
"start_time": "string",
"end_time": "string",
"timezone": "string"
},
"creators_to_include": {
"list_upload": [
"string"
],
"lists_selected": [
"string"
],
"filters": {
"product_categories": [
"string"
],
"follower_count": {
"min": 0,
"max": 0
},
"creator_ethnicity": [
"string"
],
"gender": [
"string"
],
"age_range": [
"string"
],
"languages": [
"string"
],
"community": [
"string"
],
"gmv": {
"min": 0,
"max": 0
},
"units_sold": {
"min": 0,
"max": 0
},
"average_views": {
"min": 0,
"max": 0
},
"engagement_rate": {
"min": 0,
"max": 0
},
"post_rate": {
"min": 0,
"max": 0
},
"video_gpm": {
"min": 0,
"max": 0
},
"live_gpm": {
"min": 0,
"max": 0
},
"follower_age": [
"string"
],
"follower_gender": [
"string"
],
"face_visibility": [
"string"
],
"content_style": [
"string"
],
"production_quality": [
"string"
],
"personality_tone": [
"string"
],
"body_type": [
"string"
],
"hair_type": [
"string"
]
},
"crm_group_id": "string",
"crm_group_entered_after": "2019-08-24",
"crm_group_entered_before": "2019-08-24"
},
"creators_to_exclude": {
"list_upload": [
"string"
],
"lists_selected": [
"string"
],
"crm_groups": [
"string"
],
"exclude_previously_messaged": false
},
"messages": [
{
"type": "message",
"body": "string",
"image_url": "string",
"product_id": "string",
"submission_url_slug": "string"
}
],
"follow_ups": [
{
"delay_days": 30,
"addons": [
{
"type": "message",
"body": "string",
"image_url": "string",
"product_id": "string",
"submission_url_slug": "string"
}
]
}
],
"dm_config": {
"spark_code": {
"only_collect_creator_information": false,
"spark_code_submission_url": "string"
}
},
"personalization": {
"enabled": true,
"tone": "engaging",
"fallback_message": "string",
"offer_discussion": "",
"product_description": "",
"product_selling_points": "",
"word_counts": {
"property1": 0,
"property2": 0
},
"name_source": "first_name"
},
"ai_enabled": false,
"end_date": "2019-08-24",
"is_evergreen": false,
"business_hours_timezone": "string"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| Idempotency-Key | header | any | false | none |
| X-Dry-Run | header | any | false | none |
| X-Created-Via | header | any | false | none |
| body | body | AutomationDmRequest | true | none |
Example responses
201 Response
{
"data": {
"automation_id": 0,
"shop_id": 0,
"automation_name": "string",
"automation_type": "string",
"automation_status": "string",
"state": "string",
"config": {},
"schedule": {},
"creators_to_include": {},
"creators_to_exclude": {},
"crm_group_id": "string",
"ai_enabled": false,
"end_date": "string",
"created_at": "string",
"updated_at": "string",
"created_via": "string",
"side_effects": {}
},
"dry_run": false,
"side_effects": {}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 201 | Created | Successful Response | AutomationWriteResponseV2 |
| 400 | Bad Request | Validation, missing/invalid Idempotency-Key, or forbidden update field. | WriteErrorResponse |
| 403 | Forbidden | API key lacks read_write scope (WRITE_NOT_PERMITTED). |
WriteErrorResponse |
| 404 | Not Found | Automation/list/group not in this shop. | WriteErrorResponse |
| 409 | Conflict | Idempotency conflict or archived row. | WriteErrorResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
| 429 | Too Many Requests | Write-tier rate limit (10/min, 50/hr, 100/day) exceeded. | WriteErrorResponse |
Duplicate an automation
POST /automations/{automation_id}/duplicate
Create a copy of an existing automation you own — same audience, config, and schedule — as a NEW automation in the STOPPED state. The copy never sends until it is explicitly started in the portal. Requires read_write scope and an Idempotency-Key.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| automation_id | path | integer | true | none |
| Idempotency-Key | header | any | false | none |
| X-Created-Via | header | any | false | none |
Example responses
201 Response
{
"data": {
"automation_id": 0,
"shop_id": 0,
"automation_name": "string",
"automation_type": "string",
"automation_status": "string",
"state": "string",
"config": {},
"schedule": {},
"creators_to_include": {},
"creators_to_exclude": {},
"crm_group_id": "string",
"ai_enabled": false,
"end_date": "string",
"created_at": "string",
"updated_at": "string",
"created_via": "string",
"side_effects": {}
},
"dry_run": false,
"side_effects": {}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 201 | Created | Successful Response | AutomationWriteResponseV2 |
| 400 | Bad Request | Validation, missing/invalid Idempotency-Key, or forbidden update field. | WriteErrorResponse |
| 403 | Forbidden | API key lacks read_write scope (WRITE_NOT_PERMITTED). |
WriteErrorResponse |
| 404 | Not Found | Automation/list/group not in this shop. | WriteErrorResponse |
| 409 | Conflict | Idempotency conflict or archived row. | WriteErrorResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
| 429 | Too Many Requests | Write-tier rate limit (10/min, 50/hr, 100/day) exceeded. | WriteErrorResponse |
Create Email automation
POST /automations/email
Create an outbound email automation. Different recipient model from outreach — use selection_mode: mailing_list (with vault list IDs or upload emails inline) OR selection_mode: filters (creator search criteria). An email_account_id may back several active email automations. Each one adds to that inbox's daily send volume, and the daily cap is applied per automation, so heavy reuse risks provider throttling or spam classification.
Body parameter
{
"automation_name": "string",
"email_account_id": 0,
"subject": "string",
"body": "string",
"selection_mode": "mailing_list",
"mailing_list": {
"list_upload_emails": [
"string"
],
"lists_selected": [
"string"
]
},
"filters": {
"min_creator_gmv": 0,
"min_followers": 0,
"min_engagement_rate": 1,
"min_avg_views": 0,
"regions": [
"string"
],
"categories": [
"string"
]
},
"creators_to_exclude": {
"list_upload": [
"string"
],
"lists_selected": [
"string"
],
"crm_groups": [
"string"
],
"exclude_previously_messaged": false
},
"attachments": [
{
"name": "string",
"url": "string"
}
]
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| Idempotency-Key | header | any | false | none |
| X-Dry-Run | header | any | false | none |
| X-Created-Via | header | any | false | none |
| body | body | AutomationEmailRequest | true | none |
Example responses
201 Response
{
"data": {
"automation_id": 0,
"shop_id": 0,
"automation_name": "string",
"automation_type": "string",
"automation_status": "string",
"state": "string",
"config": {},
"schedule": {},
"creators_to_include": {},
"creators_to_exclude": {},
"crm_group_id": "string",
"ai_enabled": false,
"end_date": "string",
"created_at": "string",
"updated_at": "string",
"created_via": "string",
"side_effects": {}
},
"dry_run": false,
"side_effects": {}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 201 | Created | Successful Response | AutomationWriteResponseV2 |
| 400 | Bad Request | Validation, missing/invalid Idempotency-Key, or forbidden update field. | WriteErrorResponse |
| 403 | Forbidden | API key lacks read_write scope (WRITE_NOT_PERMITTED). |
WriteErrorResponse |
| 404 | Not Found | Automation/list/group not in this shop. | WriteErrorResponse |
| 409 | Conflict | Idempotency conflict or archived row. | WriteErrorResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
| 429 | Too Many Requests | Write-tier rate limit (10/min, 50/hr, 100/day) exceeded. | WriteErrorResponse |
Create Sample Request auto-processing automation
POST /automations/sample-request
Auto-approve OR auto-reject incoming TikTok Shop sample requests by criteria. Side-effect: a CRM Group is internally created from the minimum_performance_criteria so creator membership stays dynamic. The new crm_group_id is returned in side_effects. If CRM-group creation fails, the automation still creates (logged + Sentry breadcrumb). Sample request type uses target_list (vault list IDs) instead of creators_to_include.
Body parameter
{
"automation_name": "string",
"sample_request": {
"action": "approve",
"rejection_reason": "NOT_MATCH",
"approval_message": "string",
"rejection_message": "string",
"message_images": [
"string"
],
"products": {
"include_all_products": false,
"selected_products": [
{
"product_id": "string",
"max_approvals_per_week": 10000
}
],
"weekly_auto_approval_per_product": 1
},
"minimum_performance_criteria": {
"followers": 0,
"avg_views": 0,
"engagement_rate": 1,
"post_rate": 1,
"creator_gmv_30_days": 0,
"gmv_per_sample": 0
},
"maximum_performance_criteria": {
"followers": 0,
"avg_views": 0,
"engagement_rate": 1,
"post_rate": 1,
"creator_gmv_30_days": 0,
"gmv_per_sample": 0
},
"auto_approval_settings": {
"enabled": false,
"total_weekly_approved_sample_limit": 1,
"always_approve_status": "string",
"always_approve_from_lists_ids": [
0
]
},
"target_list": [
0
]
},
"schedule": {
"Monday_maxCreators": 0,
"Tuesday_maxCreators": 0,
"Wednesday_maxCreators": 0,
"Thursday_maxCreators": 0,
"Friday_maxCreators": 0,
"Saturday_maxCreators": 0,
"Sunday_maxCreators": 0,
"start_time": "string",
"end_time": "string",
"timezone": "string"
},
"creators_to_exclude": {
"list_upload": [
"string"
],
"lists_selected": [
"string"
],
"crm_groups": [
"string"
],
"exclude_previously_messaged": false
}
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| Idempotency-Key | header | any | false | none |
| X-Dry-Run | header | any | false | none |
| X-Created-Via | header | any | false | none |
| body | body | AutomationSampleRequestRequest | true | none |
Example responses
201 Response
{
"data": {
"automation_id": 0,
"shop_id": 0,
"automation_name": "string",
"automation_type": "string",
"automation_status": "string",
"state": "string",
"config": {},
"schedule": {},
"creators_to_include": {},
"creators_to_exclude": {},
"crm_group_id": "string",
"ai_enabled": false,
"end_date": "string",
"created_at": "string",
"updated_at": "string",
"created_via": "string",
"side_effects": {}
},
"dry_run": false,
"side_effects": {}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 201 | Created | Successful Response | AutomationWriteResponseV2 |
| 400 | Bad Request | Validation, missing/invalid Idempotency-Key, or forbidden update field. | WriteErrorResponse |
| 403 | Forbidden | API key lacks read_write scope (WRITE_NOT_PERMITTED). |
WriteErrorResponse |
| 404 | Not Found | Automation/list/group not in this shop. | WriteErrorResponse |
| 409 | Conflict | Idempotency conflict or archived row. | WriteErrorResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
| 429 | Too Many Requests | Write-tier rate limit (10/min, 50/hr, 100/day) exceeded. | WriteErrorResponse |
Start automation
POST /automations/{automation_id}/start
Transition automation to running. Idempotent — already-running returns 200. Rejects with 422 AUTOMATION_NOT_STARTABLE when the automation can never run as configured (no schedule day with maxCreators > 0, or valid_until/end_date already passed) — this prevents the 'start succeeded but nothing ever sends' trap.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| automation_id | path | integer | true | none |
| Idempotency-Key | header | any | false | none |
| X-Dry-Run | header | any | false | none |
Example responses
200 Response
{
"data": {
"automation_id": 0,
"shop_id": 0,
"automation_name": "string",
"automation_type": "string",
"automation_status": "string",
"state": "string",
"config": {},
"schedule": {},
"creators_to_include": {},
"creators_to_exclude": {},
"crm_group_id": "string",
"ai_enabled": false,
"end_date": "string",
"created_at": "string",
"updated_at": "string",
"created_via": "string",
"side_effects": {}
},
"dry_run": false,
"side_effects": {}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | AutomationWriteResponseV2 |
| 400 | Bad Request | Validation, missing/invalid Idempotency-Key, or forbidden update field. | WriteErrorResponse |
| 403 | Forbidden | API key lacks read_write scope (WRITE_NOT_PERMITTED). |
WriteErrorResponse |
| 404 | Not Found | Automation/list/group not in this shop. | WriteErrorResponse |
| 409 | Conflict | Idempotency conflict or archived row. | WriteErrorResponse |
| 422 | Unprocessable Entity | Automation cannot run as configured — no schedule day with maxCreators > 0, or valid_until/end_date already passed (AUTOMATION_NOT_STARTABLE). |
WriteErrorResponse |
| 429 | Too Many Requests | Write-tier rate limit (10/min, 50/hr, 100/day) exceeded. | WriteErrorResponse |
Stop automation
POST /automations/{automation_id}/stop
Transition automation to stopped. Idempotent.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| automation_id | path | integer | true | none |
| Idempotency-Key | header | any | false | none |
| X-Dry-Run | header | any | false | none |
Example responses
200 Response
{
"data": {
"automation_id": 0,
"shop_id": 0,
"automation_name": "string",
"automation_type": "string",
"automation_status": "string",
"state": "string",
"config": {},
"schedule": {},
"creators_to_include": {},
"creators_to_exclude": {},
"crm_group_id": "string",
"ai_enabled": false,
"end_date": "string",
"created_at": "string",
"updated_at": "string",
"created_via": "string",
"side_effects": {}
},
"dry_run": false,
"side_effects": {}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | AutomationWriteResponseV2 |
| 400 | Bad Request | Validation, missing/invalid Idempotency-Key, or forbidden update field. | WriteErrorResponse |
| 403 | Forbidden | API key lacks read_write scope (WRITE_NOT_PERMITTED). |
WriteErrorResponse |
| 404 | Not Found | Automation/list/group not in this shop. | WriteErrorResponse |
| 409 | Conflict | Idempotency conflict or archived row. | WriteErrorResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
| 429 | Too Many Requests | Write-tier rate limit (10/min, 50/hr, 100/day) exceeded. | WriteErrorResponse |
Personalization
AI-personalized outreach (CORE-4857): preview the message a creator would receive, resolve product blocks, retone copy, and read fallback stats + per-creator sent history. Configure it on a DM via the personalization block of POST /automations/dm. Single-shop only.
Preview the personalized message a single creator would receive
POST /personalization/preview
Generate the AI personalization blocks for one creator and return the fully assembled message — exactly what a send with the same configuration would ship. When the creator has too little signal to personalize, the brand fallback_message is returned instead (is_fallback: true).
Content Discussion and Product Discussion are AI-generated from the creator's own signals; Product Description / Selling Points / Offer are the fixed strings you pass in (resolve product blocks first via POST /personalization/product-blocks). Region and brand name are taken from the shop (brand name defaults to the shop name).
API previews are stateless: nothing is stored, and a later send generates its own copy (or reuses a lock approved in the Reacher portal composer). Generation endpoints share a separate quota (20/min, 500/hr per key). Requires a single shop.
Body parameter
{
"creator": {
"creator_id": "string",
"creator_handle": "string",
"creator_first_name": ""
},
"message_body": "string",
"tone": "engaging",
"fallback_message": "string",
"brand_name": "",
"product_description": "",
"product_selling_points": "",
"offer_discussion": "",
"word_counts": {
"property1": 0,
"property2": 0
},
"name_source": "first_name"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | PersonalizationPreviewRequest | true | none |
Example responses
200 Response
{
"creator_id": "string",
"message": "string",
"is_fallback": true,
"blocks_used": [
"string"
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | PersonalizationPreviewResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Resolve product description + derive selling points
POST /personalization/product-blocks
Resolve the two product-sourced personalization blocks for one of your products: [Product Description] (the product's own catalog text) and [Product Selling Points] (2–3 concrete selling points DERIVED from the product's real title/description/attributes — never invented). Use the returned strings verbatim in POST /personalization/preview and in the personalization block of POST /automations/dm, so preview and send share the same fixed copy.
Both blocks degrade to empty strings (the block simply drops out of the message) ONLY when the product isn't in this shop's catalog or has too little grounded content; a failed lookup (transient database error) returns 500 instead, so empty strings are always a true statement about the product, never an outage artifact — safe to store. Requires a single shop.
Body parameter
{
"product_id": "string"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | PersonalizationProductBlocksRequest | true | none |
Example responses
200 Response
{
"product_description": "",
"product_selling_points": ""
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | PersonalizationProductBlocksResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Rewrite a message body in a new tone
POST /personalization/retone
Rewrite the shared message body in a new tone (engaging | bold | inspirational), preserving every [Block] token so the template stays intact. This is brand-level copy (one message for everyone) — there's no creator here. Degrades to the original body on any failure, so the caller never ends up with a broken template. Requires a single shop.
Body parameter
{
"message_body": "string",
"tone": "engaging"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | PersonalizationRetoneRequest | true | none |
Example responses
200 Response
{
"message": "string"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | PersonalizationRetoneResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Personalization fallback usage for one automation
GET /personalization/automations/{automation_id}/fallback-stats
How many of an automation's personalized outreach messages used the brand fallback (creator had too little signal to personalize) versus were fully personalized. A lifetime aggregate across every send run of the automation, plus the fallback_rate convenience ratio. Counts are recorded when the send engine locks the copy for delivery (immediately before the DM goes out), so a delivery that fails at the last step may still be counted. An automation with no personalized sends yet returns zeros; an automation not in this shop returns 404. Requires a single shop.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| automation_id | path | integer | true | none |
Example responses
200 Response
{
"automation_id": 0,
"messages_sent": 0,
"fallback_used": 0,
"fallback_rate": 0
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | PersonalizationFallbackStatsResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Personalized messages a creator was actually sent
GET /personalization/creators/{creator_id}/sent-messages
The personalized outreach messages this shop sent to one creator (the creator record's audit trail), newest first — the exact copy, whether it was fully personalized or fell back. Rows are recorded when the send engine locks the copy for delivery, so sent_at marks the delivery attempt, not a provider receipt. creator_id is the TikTok creator id (as returned by GET /automations/{id}/creators or GET /automations/{id}/sent-messages). Returns an empty list when this creator has never been personalized in this shop. Requires a single shop.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| creator_id | path | string | true | none |
| limit | query | integer | false | none |
Example responses
200 Response
{
"creator_id": "string",
"count": 0,
"messages": [
{
"automation_id": 0,
"message": "string",
"is_fallback": true,
"tone": "string",
"sent_at": "string"
}
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | PersonalizationCreatorSentMessagesResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Target Collabs
Send a single TikTok Shop Target Collab invitation to one creator by handle — convenience surface over the two-step automation create + start. For >10 invites at a time, use POST /automations/target-collab with a multi-creator audience instead. Also exposes GET/PUT /target-collabs/support-contact-default to configure a shop-level default support_contact, which the TC create surfaces fall back to when a request omits it.
Send a Target Collab invite directly
POST /target-collabs
Send a single TikTok Shop Target Collab (TC) invitation to a creator by handle. This is a convenience surface — it internally creates a single-creator TC automation and immediately starts it.
Queued semantics. The response returns immediately with status: "queued". Actual TC delivery happens asynchronously through Reacher's TC delivery worker (browser automation, the same path the portal uses). Typical end-to-end latency is a few seconds, sometimes longer under worker load. Poll GET /public/v1/automations/{automation_id} for delivery status and target_collabs.invitation_id once the worker submits.
Not for bulk. For >10 invites at a time, use POST /public/v1/automations/target-collab directly with a multi-creator audience — that's more efficient than calling this endpoint in a loop, and exposes the full TC feature set (content type, sample policy, follow-up DMs).
Required. read_write scope, Idempotency-Key header. Pass X-Dry-Run: true to validate without persisting or queueing.
Body parameter
{
"creator_handle": "string",
"product_id": "string",
"commission_rate": 1,
"shop_ads_commission_rate": 1,
"message": "string",
"invitation_name": "string",
"valid_until": "2019-08-24",
"support_contact": {
"email": "string",
"phone": "string"
}
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| Idempotency-Key | header | any | false | none |
| X-Dry-Run | header | any | false | none |
| body | body | TargetCollabDirectRequest | true | none |
Example responses
201 Response
{
"automation_id": 0,
"status": "string",
"creator_id": "string",
"creator_handle": "string",
"shop_id": 0,
"check_status_at": "string",
"queued_at": "string",
"dry_run": false
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 201 | Created | Successful Response | TargetCollabDirectResponse |
| 400 | Bad Request | Validation, missing/invalid Idempotency-Key, or multi-shop scope (x-shop-id=all). |
WriteErrorResponse |
| 403 | Forbidden | API key lacks read_write scope (WRITE_NOT_PERMITTED). |
WriteErrorResponse |
| 404 | Not Found | creator_handle could not be resolved in this shop's region (CREATOR_NOT_FOUND). |
WriteErrorResponse |
| 409 | Conflict | Idempotency conflict — same key, different body. | WriteErrorResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
| 429 | Too Many Requests | Write-tier rate limit exceeded. | WriteErrorResponse |
Get the shop's default Target Collab support contact
GET /target-collabs/support-contact-default
Read the shop-level default support_contact used as a fallback when a TC create request omits support_contact (CORE-5428).
Returns configured: false (with null fields) when no default is set — in that state TC creates still require a per-request support_contact. Requires a single shop (x-shop-id).
Example responses
200 Response
{
"shop_id": 0,
"configured": true,
"email": "string",
"phone": "string",
"updated_at": "string"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | ShopSupportContactDefaultResponse |
Set the shop's default Target Collab support contact
PUT /target-collabs/support-contact-default
Configure the shop-level default support_contact once, so TC create requests can omit it (CORE-5428). A per-request support_contact still overrides this default for that request.
email is required; phone is optional. The upsert is keyed on the shop, so re-sending the same body yields the same state. Requires read_write scope, a single shop (x-shop-id), and an Idempotency-Key header (for contract consistency with the other public-API write endpoints) — replay/conflict semantics match those writes.
Body parameter
{
"email": "string",
"phone": "string"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| Idempotency-Key | header | any | false | none |
| body | body | ShopSupportContactDefaultRequest | true | none |
Example responses
200 Response
{
"shop_id": 0,
"configured": true,
"email": "string",
"phone": "string",
"updated_at": "string"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | ShopSupportContactDefaultResponse |
| 400 | Bad Request | Multi-shop scope (x-shop-id=all or CSV) — requires a single shop. |
WriteErrorResponse |
| 403 | Forbidden | API key lacks read_write scope (WRITE_NOT_PERMITTED). |
WriteErrorResponse |
| 409 | Conflict | Idempotency conflict — same key, different body. | WriteErrorResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
| 429 | Too Many Requests | Write-tier rate limit exceeded. | WriteErrorResponse |
| 503 | Service Unavailable | Storage not yet available (migration 053 not applied). | WriteErrorResponse |
Metrics
Time-series metrics for dashboards and charts.
Time-series metrics
POST /metrics/timeseries
Fetch time-series data for one or more metrics over a date range. Returns daily/weekly/monthly data points for charting trends. Available metrics: gmv (affiliate-attributed), total_gmv (full shop from the Seller Center scrape), live_gmv (creator LIVE-attributed, from live_sessions — see POST /lives/* for the per-shop currency-aware view), sc_affiliate_live_gmv (creator LIVE GMV as Seller Center itself reports it, under By order source → Creator → Lives — order-date attributed, so it does not match live_gmv; use it to reconcile against a Seller Center export), creators, videos_posted, video_views, gmv_per_video, gmv_per_sample, creators_reached, creators_messaged, tc_invites_sent, samples_approved, sample_requests, gmv_driving_videos, new_creators_posting, open_collabs, accepted_tc_count, emails_sent, dm_responses, reply_rate. Seller Center whole-shop cards: orders, units_sold, aov, ctr, conversion_rate (aov/ctr/conversion_rate are ratios computed over the full window, not averages of daily ratios; 0 for shops not yet on the Seller Center sync). Granularity (day/week/month) is auto-detected based on the date range if not specified. IMPORTANT: 'creators' returns distinct creators PER DAY — summing daily values double-counts creators active on multiple days. For the headline distinct count over the full period, use POST /metrics/summary instead. Similarly, gmv_per_video and gmv_per_sample are daily ratios — use /metrics/summary for the period-level headline values. Dates default to the newest day with settled data for the shop (typically yesterday; up to 2 days back while a day finalizes).
Body parameter
{
"metrics": [
"gmv"
],
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"granularity": "day"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | TimeseriesRequest | true | none |
Example responses
200 Response
{
"data": {
"property1": [
{
"date": "string",
"value": 0
}
],
"property2": [
{
"date": "string",
"value": 0
}
]
},
"granularity": "string",
"start_date": "string",
"end_date": "string",
"currency": "string",
"shops_queried": [
"string"
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | TimeseriesResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Dashboard headline metrics
POST /metrics/summary
Pre-computed headline scalar metrics for a date range, matching the Reacher dashboard's top-level KPIs exactly. Use this for summary cards and headline numbers. Includes derived metrics like active_creators (distinct count, not daily sum), gmv_per_video, and gmv_per_sample, plus sc_affiliate_live_gmv (creator LIVE GMV as Seller Center reports it — order-date attributed, so it does not match live_gmv). Also includes Seller Center whole-shop cards: orders, units_sold, aov, ctr, conversion_rate (all-channel; aov/ctr/conversion_rate are ratios computed over the full window). Defaults to the last 30 days if no dates are specified. Dates default to the newest day with settled data for the shop (typically yesterday; up to 2 days back while a day finalizes).
Body parameter
{
"start_date": "2019-08-24",
"end_date": "2019-08-24"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | any | false | none |
Example responses
200 Response
{
"gmv": 0,
"total_gmv": 0,
"live_gmv": 0,
"sc_affiliate_live_gmv": 0,
"active_creators": 0,
"video_views": 0,
"videos_posted": 0,
"samples_approved": 0,
"gmv_per_video": 0,
"gmv_per_sample": 0,
"sample_requests": 0,
"gmv_driving_videos": 0,
"new_creators_posting": 0,
"open_collabs": 0,
"accepted_tc_count": 0,
"creators_reached": 0,
"creators_messaged": 0,
"tc_invites_sent": 0,
"emails_sent": 0,
"dm_responses": 0,
"reply_rate": 0,
"orders": 0,
"units_sold": 0,
"aov": 0,
"ctr": 0,
"conversion_rate": 0,
"errors": [
"string"
],
"start_date": "string",
"end_date": "string",
"currency": "string",
"shops_queried": [
"string"
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | MetricsSummaryResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Shop GMV
Full TikTok Seller Center shop GMV (ads + organic + affiliate) — daily series and window totals with channel breakdown. Distinct from POST /metrics/timeseries metric=gmv, which is affiliate-attributed only.
Daily shop GMV time series (Seller Center, full shop view)
POST /shop-gmv/timeseries
Daily GMV for one shop from the TikTok Seller Center daily rollup, including channel breakdown (video → affiliate/seller, live → affiliate/seller, product_card → shop_tab/search) and traffic (product impressions/clicks).
Differs from POST /metrics/timeseries metric=gmv — that endpoint reports affiliate-attributed GMV only (Reacher's view of creator-driven sales). This endpoint reports the total shop GMV including ads / Smart+ and organic. Use this when the customer wants numbers matching their TikTok Seller Center dashboard.
Single-shop only — set x-shop-id to a specific shop ID. Defaults to last 30 days ending yesterday. Max range 90 days (TikTok backfill depth). The newest available day is yesterday; today's row is not returned. Empty series is a normal 200 response — Seller Center coverage is still rolling out.
Body parameter
{
"start_date": "2019-08-24",
"end_date": "2019-08-24"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | ShopGmvTimeseriesRequest | true | none |
Example responses
200 Response
{
"shop_id": 0,
"currency_code": "string",
"granularity": "daily",
"start_date": "string",
"end_date": "string",
"series": [
{
"date": "string",
"gmv": 0,
"orders": 0,
"items_sold": 0,
"customers": 0,
"aov": 0,
"channels": {
"video": {
"gmv": 0,
"affiliate": 0,
"seller": 0
},
"live": {
"gmv": 0,
"affiliate": 0,
"seller": 0
},
"product_card": {
"gmv": 0,
"shop_tab": 0,
"search": 0
}
},
"traffic": {
"product_impressions": 0,
"product_clicks": 0
}
}
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | ShopGmvTimeseriesResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Shop GMV window totals (Seller Center, full shop view)
POST /shop-gmv/summary
Window totals for one shop from the TikTok Seller Center daily rollup — SUMmed across the window with the same channel hierarchy as the timeseries response.
Same coverage caveats as the timeseries endpoint. aov is recomputed as total GMV / total orders over the window (a window-correct value, not the average of daily AOVs). customers is the SUM of daily unique-customer counts — buyers who purchased on multiple days are double-counted; a true window-distinct count is not derivable from this rollup.
Body parameter
{
"start_date": "2019-08-24",
"end_date": "2019-08-24"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | any | false | none |
Example responses
200 Response
{
"shop_id": 0,
"currency_code": "string",
"start_date": "string",
"end_date": "string",
"day_count": 0,
"gmv": 0,
"orders": 0,
"items_sold": 0,
"customers": 0,
"aov": 0,
"channels": {
"video": {
"gmv": 0,
"affiliate": 0,
"seller": 0
},
"live": {
"gmv": 0,
"affiliate": 0,
"seller": 0
},
"product_card": {
"gmv": 0,
"shop_tab": 0,
"search": 0
}
},
"traffic": {
"product_impressions": 0,
"product_clicks": 0
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | ShopGmvSummaryResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Shop Health
Per-shop TikTok Shop Performance Score (SPS) and its health sub-metrics (on-time dispatch, negative-review rate, etc.) — daily trend and latest snapshot. Sourced from TikTok's official shop_performances API.
Daily Shop Performance Score (SPS) trend
POST /shop-health/timeseries
Daily Shop Performance Score for one shop from TikTok's official shop_performances/overview API — the same SPS shown in Seller Center. Each point carries sps_score (0-5), sps_tier, peer_percentile, and a dimensions breakdown of the sub-metrics (on-time dispatch, negative-review rate, etc.).
Single-shop only — set x-shop-id to a specific shop ID. Defaults to the last 30 days ending yesterday. Max range 90 days. Only shops on the official-API sync path are covered; an empty series is a normal 200 response (history builds from the first daily pull).
Body parameter
{
"start_date": "2019-08-24",
"end_date": "2019-08-24"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | ShopHealthTimeseriesRequest | true | none |
Example responses
200 Response
{
"shop_id": 0,
"start_date": "string",
"end_date": "string",
"series": [
{
"date": "string",
"sps_score": 0,
"sps_tier": "string",
"peer_percentile": 0,
"dimensions": [
{
"name": "string",
"score": 0,
"status": "string",
"status_text": "string",
"weight": 0
}
]
}
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | ShopHealthTimeseriesResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Most recent Shop Performance Score snapshot
POST /shop-health/latest
The most recent Shop Performance Score snapshot for one shop — the current sps_score (0-5), sps_tier, peer_percentile, and the per-sub-metric dimensions breakdown.
Single-shop only. snapshot is null when the shop has no SPS data yet (non-official-API shop, or the first daily pull hasn't run).
Body parameter
{}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | any | false | none |
Example responses
200 Response
{
"shop_id": 0,
"snapshot": {
"date": "string",
"sps_score": 0,
"sps_tier": "string",
"peer_percentile": 0,
"dimensions": [
{
"name": "string",
"score": 0,
"status": "string",
"status_text": "string",
"weight": 0
}
]
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | ShopHealthLatestResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Shop Performance Score metrics (per-metric status, value, thresholds)
POST /shop-health/metrics
Every stored snapshot of TikTok's six Shop Performance Score metrics for one shop in the window (NRR, NBFR, SFCR, OTDR, AHT, IM_DSAT): status (EXCELLENT/GOOD/POOR/CRITICAL/NIL), value with unit, thresholds, evaluation window, and how many problem items TikTok reported. latest_snapshot_date names the newest day; a metric absent on that day has no data. Window: a preset or explicit dates, max 365 days. Single-shop only.
Body parameter
{
"preset": "string",
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"metric_codes": [
"NRR"
]
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | SnapshotRequest | true | none |
Example responses
200 Response
{
"shop_id": 0,
"start_date": "string",
"end_date": "string",
"latest_snapshot_date": "string",
"snapshot_count": 0,
"points": [
{
"date": "string",
"metric_code": "NRR",
"metric_name": "string",
"dimension": "string",
"score": 0,
"value": 0,
"value_unit": "string",
"status": "EXCELLENT",
"status_text": "string",
"excellent_threshold": 0,
"poor_threshold": 0,
"evaluation_window_start": "string",
"evaluation_window_end": "string",
"is_top_reason": false,
"top_reason_text": "string",
"problems_upstream_total": 0,
"problems_stored": 0,
"problems_complete": true,
"problems_truncated": true
}
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | ShopHealthMetricsResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Orders, returns or chats behind one Shop Performance Score metric
POST /shop-health/problems
The problem items TikTok attributes to one metric on one snapshot day (default: the latest stored snapshot), paged and ordered by TikTok's page then item key. pagination.stored_total is what Reacher holds; upstream_total/upstream_truncated are TikTok's own count and whether it cut the list. snapshot_date is null with an empty page when nothing is stored. Single-shop only.
Body parameter
{
"metric_code": "NRR",
"snapshot_date": "2019-08-24",
"page": 1,
"page_size": 20,
"version": 1
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | ProblemsRequest | true | none |
Example responses
200 Response
{
"shop_id": 0,
"metric_code": "NRR",
"snapshot_date": "string",
"pagination": {
"page": 0,
"page_size": 0,
"stored_total": 0
},
"upstream_total": 0,
"upstream_truncated": true,
"version": 0,
"items": [
{
"item_key": "string",
"order_id": "string",
"return_order_id": "string",
"chat_record_id": "string",
"product_id": "string",
"sku_id": "string",
"product_name": "string",
"reason": "string",
"rating": 0,
"review_count": 0,
"event_time": "string",
"deliver_time": "string",
"expect_deliver_time": "string",
"actual_deliver_time": "string",
"duration_hours": 0,
"page": 0
}
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | ShopHealthProblemsResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
P&L
Merchant profit & loss straight from your TikTok Seller Center finance export: window totals as an ordered waterfall, the running P&L bucketed by day / week / bi-weekly / month, and order x SKU detail with its fee breakdown. Every figure is TikTok's own, summed and never recomputed, so any cadence reconciles to Seller Center exactly. Rows are bucketed by order PAID date in the shop's Seller Center timezone, so recent windows keep moving as orders settle — read data_status on every response for freshness. Costs TikTok cannot see are supplied separately: store cost of goods per SKU and per-unit sample cost with PUT /pnl/costs, then read POST /pnl/profit for the contribution profit they imply. POST /pnl/skus rolls the same figures up per SKU as a gross / contribution P&L (revenue and per-SKU fees less cost of goods); per-SKU ad spend is not available, so the true net bottom line stays on the summary and profit surfaces. Single-shop only, and enabled per shop on request.
Per-product P&L inputs
GET /pnl/products
The per-product side of the P&L that POST /pnl/summary reports in aggregate: every active product in the shop with its SKU pricing (sale and original price in currency units, not cents), stock, the derived discount_pct, and the affiliate commission_rate / shop_ads_commission_rate from the shop's most recent Target Collaboration config.
gmv_max is shop-level, not per product: whether GMV Max is currently running and the average ROAS actually achieved across its active campaigns. tiktok_fee_pct is the platform's flat fee assumption used by the calculator.
These are the inputs to a margin calculation, not settled money — for what TikTok actually paid out, use POST /pnl/summary or POST /pnl/orders. Single-shop only. A shop with no catalogued products returns an empty products list as a normal 200.
Example responses
200 Response
{
"products": [
{
"product_id": "string",
"title": "string",
"primary_image_url": "string",
"category_chain": [],
"brand_name": "string",
"currency": "USD",
"skus": [],
"commission": {
"commission_rate": 0,
"shop_ads_commission_rate": 0
},
"discount_pct": 0
}
],
"shop_id": 0,
"tiktok_fee_pct": 6,
"gmv_max": {
"active": false,
"avg_roas": 0,
"tooltip": "Based on average ROAS across all active campaigns in your shop."
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | PnlProductsResponse |
P&L totals for a window
POST /pnl/summary
Window totals as an ordered waterfall, summed from TikTok's own daily P&L series. Rows are bucketed by order PAID date in the shop's Seller Center timezone. Recent days keep moving as orders settle — check data_status for freshness.
Body parameter
{
"start_date": "2019-08-24",
"end_date": "2019-08-24"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | PnlSummaryRequest | true | none |
Example responses
200 Response
{
"shop_id": 0,
"seller_id": "string",
"currency": "string",
"start_date": "string",
"end_date": "string",
"days_with_data": 0,
"totals": {
"gross_sales": 0,
"refunds": 0,
"referral_fee": 0,
"affiliate": 0,
"gmv_max": 0,
"campaigns": 0,
"managed_services": 0,
"shipping_and_warehousing_cost": 0,
"others": 0,
"net_earnings": 0
},
"rollups": {
"property1": 0,
"property2": 0
},
"data_status": {
"state": "string",
"last_synced_at": "string",
"last_window": {
"start_date": "string",
"end_date": "string"
}
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | PnlSummaryResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Running P&L series
POST /pnl/timeseries
The running P&L: the same waterfall bucketed by day, week, bi-weekly or month. Buckets are summed from TikTok's daily rows, so any cadence reconciles to Seller Center exactly.
Body parameter
{
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"cadence": "day"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | PnlTimeseriesRequest | true | none |
Example responses
200 Response
{
"shop_id": 0,
"seller_id": "string",
"currency": "string",
"cadence": "string",
"series": [
{
"gross_sales": 0,
"refunds": 0,
"referral_fee": 0,
"affiliate": 0,
"gmv_max": 0,
"campaigns": 0,
"managed_services": 0,
"shipping_and_warehousing_cost": 0,
"others": 0,
"net_earnings": 0,
"period_start": "string"
}
],
"data_status": {
"state": "string",
"last_synced_at": "string",
"last_window": {
"start_date": "string",
"end_date": "string"
}
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | PnlTimeseriesResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Order-level P&L detail
POST /pnl/orders
One row per order x SKU with its fee breakdown, filterable by order source, settled state, product or SKU — the same filters applied by hand to the Seller Center export. Unsettled lines are included by default and their amounts still move.
Body parameter
{
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"order_source": "Video",
"settled": true,
"product_id": "string",
"sku_id": "string",
"limit": 100,
"offset": 0,
"amounts_fields": "standard"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | PnlOrdersRequest | true | none |
Example responses
200 Response
{
"shop_id": 0,
"seller_id": "string",
"total": 0,
"limit": 0,
"offset": 0,
"selected_fields": [
"string"
],
"orders": [
{
"order_id": "string",
"sku_id": "string",
"product_id": "string",
"product_name": "string",
"sku_name": "string",
"quantity": 0,
"order_paid_date": "string",
"order_settled_date": "string",
"order_status": "string",
"order_source": [
"string"
],
"is_settled": true,
"unsettled_reason": "string",
"estimated_settle_time": "string",
"sample_order_type": "string",
"linked_statement_id": "string",
"currency": "string",
"amounts": {}
}
],
"data_status": {
"state": "string",
"last_synced_at": "string",
"last_window": {
"start_date": "string",
"end_date": "string"
}
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | PnlOrdersResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Per-SKU gross / contribution P&L
POST /pnl/skus
One row per SKU: units sold and the fee lines from the order-level export summed over the window, joined to your cost of goods, with a gross profit and margin.
This is a GROSS / CONTRIBUTION view, not a net bottom line. The fees here are the ones TikTok books against the order itself — referral, affiliate commission, refunds, discounts and the like — and ad spend is NOT among them: TikTok does not attribute ad spend to a single SKU, so gross_profit is revenue less those per-SKU fees less COGS, and stops one step short of net earnings. For the true shop-level bottom line that includes ad spend, use POST /pnl/summary and POST /pnl/profit. If you request the net_earnings or total_expense columns they are the order-line totals and likewise exclude ad spend.
gross_profit is an upper bound while units_uncosted is non-zero — uncosted units are counted, never assumed free. Windowed by order PAID date; single shop only.
Body parameter
{
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"product_id": "string",
"sku_id": "string",
"limit": 100,
"offset": 0,
"amounts_fields": "standard",
"sort": "gross_sales"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | PnlSkusRequest | true | none |
Example responses
200 Response
{
"shop_id": 0,
"seller_id": "string",
"currency": "string",
"start_date": "string",
"end_date": "string",
"total": 0,
"limit": 0,
"offset": 0,
"selected_fields": [
"string"
],
"currency_mismatched_costs": 0,
"skus": [
{
"product_id": "string",
"sku_id": "string",
"sku_name": "string",
"product_name": "string",
"units": 0,
"amounts": {
"property1": 0,
"property2": 0
},
"cogs": 0,
"gross_profit": 0,
"gross_margin_pct": 0,
"units_costed": 0,
"units_uncosted": 0,
"currency": "string"
}
],
"data_status": {
"state": "string",
"last_synced_at": "string",
"last_window": {
"start_date": "string",
"end_date": "string"
}
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | PnlSkusResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
List stored cost inputs
GET /pnl/costs
Every cost input stored for this shop: cost of goods per SKU and per-unit sample cost per product. Returns full history — a row per effective_from — not just what is in force today, so a caller restating an old window can see which amount applied then. sku_id is null on the product-level default.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| cost_type | query | any | false | Filter to one type: cogs |
| product_id | query | any | false | Filter to one product. |
| sku_id | query | any | false | Filter to one SKU. Pass an empty string to see only product-level defaults. |
Example responses
200 Response
{
"shop_id": 0,
"costs": [
{
"id": 0,
"product_id": "string",
"sku_id": "string",
"cost_type": "string",
"amount": 0,
"currency": "string",
"effective_from": "string",
"notes": "string",
"source": "string",
"updated_at": "string"
}
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | PnlCostsResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Set cost inputs
PUT /pnl/costs
Insert or update cost inputs in bulk — the endpoint a spreadsheet or CSV import writes through. Rows are keyed on (product_id, sku_id, cost_type, effective_from): re-sending a key overwrites its amount rather than stacking a second cost onto the same units, so replaying the same import is safe. Omit sku_id to set a product-level default that applies to every SKU without one of its own. Requires read_write scope and a single shop.
Body parameter
{
"costs": [
{
"product_id": "string",
"sku_id": "string",
"cost_type": "cogs",
"amount": 0,
"currency": "USD",
"effective_from": "2019-08-24",
"notes": "string"
}
]
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | PnlCostsUpsertRequest | true | none |
Example responses
200 Response
{
"shop_id": 0,
"costs": [
{
"id": 0,
"product_id": "string",
"sku_id": "string",
"cost_type": "string",
"amount": 0,
"currency": "string",
"effective_from": "string",
"notes": "string",
"source": "string",
"updated_at": "string"
}
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | PnlCostsResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Delete a cost input
DELETE /pnl/costs/{cost_id}
Remove one stored cost by its id. The units it covered become uncosted again and drop out of contribution_profit — they are not treated as free-of-charge silently, they are reported as uncosted. Scoped to this shop, so an id belonging to another shop returns 404. Requires read_write scope and a single shop.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| cost_id | path | integer | true | none |
Example responses
200 Response
{
"shop_id": 0,
"costs": [
{
"id": 0,
"product_id": "string",
"sku_id": "string",
"cost_type": "string",
"amount": 0,
"currency": "string",
"effective_from": "string",
"notes": "string",
"source": "string",
"updated_at": "string"
}
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | PnlCostsResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Contribution profit (P&L less your costs)
POST /pnl/profit
TikTok's bottom line carried down by the costs it cannot see. net_earnings is taken from the daily series unchanged — the only source that includes GMV Max ad spend — and cost of goods and sample cost are subtracted from it. Set cadence to get the running series as well as the totals.
Units with no cost on file are COUNTED, never assumed to be zero, so contribution_profit is an upper bound while units_uncosted or sample_units_uncosted is non-zero. Use POST /pnl/costs/coverage to get the list of what is missing.
Body parameter
{
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"cadence": "total",
"sample_basis": "shipped"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | PnlProfitRequest | true | none |
Example responses
200 Response
{
"shop_id": 0,
"seller_id": "string",
"currency": "string",
"start_date": "string",
"end_date": "string",
"cadence": "string",
"sample_basis": "string",
"days_with_data": 0,
"totals": {
"net_earnings": 0,
"cogs": 0,
"sample_cost": 0,
"contribution_profit": 0,
"units": 0,
"units_costed": 0,
"units_uncosted": 0,
"units_on_refunded_lines": 0,
"sample_units": 0,
"sample_units_costed": 0,
"sample_units_uncosted": 0
},
"series": [
{
"net_earnings": 0,
"cogs": 0,
"sample_cost": 0,
"contribution_profit": 0,
"units": 0,
"units_costed": 0,
"units_uncosted": 0,
"units_on_refunded_lines": 0,
"sample_units": 0,
"sample_units_costed": 0,
"sample_units_uncosted": 0,
"period_start": "string"
}
],
"currency_mismatched_costs": 0,
"data_status": {
"state": "string",
"last_synced_at": "string",
"last_window": {
"start_date": "string",
"end_date": "string"
}
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | PnlProfitResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
What is missing before profit is trustworthy
POST /pnl/costs/coverage
The SKUs that sold and the products that shipped samples in this window with no cost on file, ordered by how many units each one represents — the worklist for making POST /pnl/profit complete, biggest impact first. coverage_pct is by units, not by SKU count, so one missing best-seller outranks fifty missing long-tail SKUs.
Body parameter
{
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"sample_basis": "shipped"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | PnlCostCoverageRequest | true | none |
Example responses
200 Response
{
"shop_id": 0,
"seller_id": "string",
"currency": "string",
"start_date": "string",
"end_date": "string",
"sample_basis": "string",
"cogs": {
"units": 0,
"units_costed": 0,
"coverage_pct": 0,
"missing_count": 0,
"missing": [
{
"product_id": "string",
"sku_id": "string",
"product_name": "string",
"sku_name": "string",
"units": 0
}
],
"truncated": true
},
"samples": {
"sample_units": 0,
"sample_units_costed": 0,
"coverage_pct": 0,
"missing_count": 0,
"missing": [
{
"product_id": "string",
"sample_units": 0
}
],
"truncated": true
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | PnlCostCoverageResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Settlement adjustments
POST /pnl/adjustments
Credits, clawbacks and manual corrections TikTok posts against a statement rather than an order. They never appear on order rows, so a P&L built only from /pnl/orders silently omits them — net_amount is the figure to carry across.
Windowed on the date TikTok raised the adjustment. settled_date is null until it reaches a payout.
Body parameter
{
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"limit": 100,
"offset": 0
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | PnlAdjustmentsRequest | true | none |
Example responses
200 Response
{
"shop_id": 0,
"seller_id": "string",
"total": 0,
"limit": 0,
"offset": 0,
"net_amount": 0,
"adjustments": [
{
"adjustment_id": "string",
"adjustment_type": "string",
"reason": "string",
"amount": 0,
"created_date": "string",
"settled_date": "string",
"linked_statement_id": "string",
"linked_payout_id": "string",
"currency": "string"
}
],
"data_status": {
"state": "string",
"last_synced_at": "string",
"last_window": {
"start_date": "string",
"end_date": "string"
}
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | PnlAdjustmentsResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Buyer-side payment breakdown
POST /pnl/customer-payments
What the CUSTOMER paid for each order x SKU, as opposed to what the seller earned: subtotal before and after discount, which party funded each discount, shipping, retail delivery fee and tax.
Paired to order lines on (order, SKU) to get a paid date, since this sheet carries none of its own. TikTok does not guarantee that pairing is 1:1, so a payment row with no matching order line falls outside the window rather than being invented into it.
Body parameter
{
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"product_id": "string",
"sku_id": "string",
"limit": 100,
"offset": 0
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | PnlCustomerPaymentsRequest | true | none |
Example responses
200 Response
{
"shop_id": 0,
"seller_id": "string",
"total": 0,
"limit": 0,
"offset": 0,
"payments": [
{
"order_id": "string",
"sku_id": "string",
"currency": "string",
"amounts": {
"property1": 0,
"property2": 0
}
}
],
"data_status": {
"state": "string",
"last_synced_at": "string",
"last_window": {
"start_date": "string",
"end_date": "string"
}
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | PnlCustomerPaymentsResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Affiliate Orders
Affiliate Center -> Orders, over the API: one row per order x SKU with the creator, the content (video / LIVE / showcase) that drove the sale, the commission model and rates, and estimated vs actual commission side by side. This is the order-level audit trail behind /creators/performance and /videos/performance. Rows are keyed on TikTok's seller and bucketed by order CREATED date in the shop's Affiliate Center timezone; status and actual amounts keep moving for weeks as commission settles, so read data_status for freshness. Single-shop only. A shop whose export collection is not yet enabled reads data_status.state == "never_run".
Affiliate order lines: creator, content and commission per order
POST /affiliate/transactions
One row per order x SKU from Affiliate Center -> Orders: which creator drove it, through which content (video / LIVE / showcase), under which commission model and rates, and the estimated vs actual commission side by side. Filter by an order-created date window, creator handle, content ID or type, product, SKU, order status or settled state — the same filters as the Affiliate Center UI. Estimated amounts are set when the order is created; actual amounts and commission_paid_at fill in as TikTok settles, typically weeks later, so recent windows keep moving — read data_status for freshness. Defaults to the last 30 complete days.
Body parameter
{
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"creator_handle": "string",
"content_id": "string",
"content_type": "string",
"product_id": "string",
"sku_id": "string",
"order_status": "string",
"settled": true,
"limit": 100,
"offset": 0
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | AffiliateTransactionsRequest | true | none |
Example responses
200 Response
{
"shop_id": 0,
"seller_id": "string",
"start_date": "string",
"end_date": "string",
"total": 0,
"limit": 0,
"offset": 0,
"transactions": [
{
"order_id": "string",
"sku_id": "string",
"product_id": "string",
"product_name": "string",
"quantity": 0,
"price": 0,
"payment_amount": 0,
"currency": "string",
"fully_refunded": true,
"payment_method": "string",
"order_status": "string",
"is_settled": true,
"creator_handle": "string",
"content_type": "string",
"content_id": "string",
"commission_model": "string",
"standard_commission_rate": 0,
"shop_ads_commission_rate": 0,
"estimated": {
"commission_base": 0,
"standard_commission": 0,
"shop_ads_commission": 0,
"cofunded_creator_bonus": 0
},
"actual": {
"commission_base": 0,
"standard_commission": 0,
"shop_ads_commission": 0,
"cofunded_creator_bonus": 0
},
"order_created_at": "string",
"paid_at": "string",
"delivered_at": "string",
"commission_paid_at": "string",
"platform": "string"
}
],
"data_status": {
"state": "string",
"last_synced_at": "string",
"last_window": {
"start_date": "string",
"end_date": "string"
}
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | AffiliateTransactionsResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Lives
Creator LIVE-attributed GMV — window totals and per-session rows from TikTok's Affiliate Center LIVE data. Distinct from the gmv field (all affiliate revenue); the same number is on POST /metrics/* as live_gmv. Single-shop, currency-aware.
LIVE metric cards with trend
POST /lives/metrics
The five LIVE performance cards the portal shows above the session table — Live GMV, Live Units Sold, Live Count, Avg Engagement Rate and Avg Viewing Duration. Each card carries its value, unit, the percent change against the immediately preceding window of equal length, and chart_data: one point per day of the window, zero-filled on days with no sessions so the series length always matches the range.
Differs from POST /lives/summary — that returns flat window totals. This returns the same totals plus period-over-period change and a daily series, and accepts the portal's filters / search so the cards can be scoped to a creator or a GMV band. Engagement rate is a decimal (0.0-1.0), durations are seconds.
Single-shop only; defaults to the last 30 days ending today. LIVE analytics is region-gated — shops outside the supported regions get a 403 REGION_NOT_SUPPORTED. A shop with no sessions returns zeroed cards as a normal 200.
Body parameter
{
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"filters": {
"gmv": {
"min": 0,
"max": 0
},
"views": {
"min": 0,
"max": 0
},
"duration": {
"min": 0,
"max": 0
},
"unitsSold": {
"min": 0,
"max": 0
},
"likes": {
"min": 0,
"max": 0
},
"comments": {
"min": 0,
"max": 0
},
"ctr": {
"min": 0,
"max": 0
},
"engagementRate": {
"min": 0,
"max": 0
}
},
"search": "string"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | any | false | none |
Example responses
200 Response
{
"success": true,
"metrics": [
{
"label": "string",
"value": 0,
"unit": "string",
"change": 0,
"comparison_text": "string",
"tooltip_text": "string",
"chart_data": [
0
]
}
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | LivesMetricsResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Products sold inside LIVE sessions
POST /lives/products
The per-product breakdown behind one or more LIVE sessions: for each product featured in the session, its LIVE GMV, units sold, orders, average order value, creator commission and refunds. This is the session x product grain — POST /lives/list gives the session totals, this explains what inside the session earned them.
Pass the key values from POST /lives/list rows in live_session_ids (up to 50 per request). Results are keyed back by session ID in request order. Sessions with no product rows — including any ID that belongs to a different shop, or a shop still on the legacy LIVE data path — return an empty products list rather than an error. Single-shop only.
Body parameter
{
"live_session_ids": [
"string"
]
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | LiveSessionProductsRequest | true | none |
Example responses
200 Response
{
"shop_id": 0,
"sessions": [
{
"live_session_id": "string",
"products": [
{
"product_id": "string",
"product_name": "string",
"cover": "string",
"categories": null,
"live_gmv": 0,
"items_sold": 0,
"orders": 0,
"avg_order_value": 0,
"commission": 0,
"refunded_gmv": 0,
"refunded_items": 0
}
]
}
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | LiveSessionProductsResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Creator LIVE-attributed GMV window totals
POST /lives/summary
Window totals for creator LIVE-attributed GMV for one shop, from customers.live_sessions (the Affiliate Center LIVE value shops see on /insights/transaction-analysis → LIVE streams).
Differs from POST /metrics/summary field gmv — that is ALL affiliate revenue (video + live + product card). This isolates the LIVE-stream slice only. The live_gmv field on /metrics/summary is the same number as a simple cross-shop scalar; this endpoint adds per-shop currency, session count, engagement and viewing duration.
Single-shop only — set x-shop-id to a specific shop ID. Defaults to the last 30 days ending today. Empty totals (live_count 0) are a normal 200 response — live-session coverage is data-presence driven.
Body parameter
{
"start_date": "2019-08-24",
"end_date": "2019-08-24"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | any | false | none |
Example responses
200 Response
{
"shop_id": 0,
"currency_code": "string",
"start_date": "string",
"end_date": "string",
"live_count": 0,
"live_gmv": 0,
"items_sold": 0,
"avg_engagement_rate": 0,
"avg_viewing_duration": 0
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | LivesSummaryResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Per-session creator LIVE-attributed GMV rows
POST /lives/list
Paginated per-session view of creator LIVE-attributed GMV for one shop — one row per affiliate LIVE session with creator, timestamps, GMV, units, and engagement.
Single-shop only. Defaults to the last 30 days ending today. Sort by live_gmv (default), start_time, units_sold or views. Empty sessions is a normal 200 response for shops without live-session data.
Body parameter
{
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"page": 1,
"page_size": 20,
"sort_by": "live_gmv",
"sort_dir": "asc"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | LivesListRequest | true | none |
Example responses
200 Response
{
"shop_id": 0,
"currency_code": "string",
"start_date": "string",
"end_date": "string",
"page": 0,
"page_size": 0,
"total": 0,
"sessions": [
{
"live_session_id": "string",
"title": "string",
"creator_handle": "string",
"start_time": "string",
"end_time": "string",
"duration_seconds": 0,
"live_gmv": 0,
"units_sold": 0,
"views": 0,
"likes": 0,
"comments": 0,
"ctr": 0,
"engagement_rate": 0,
"new_followers": 0,
"avg_viewing_duration": 0
}
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | LivesListResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Analytics
Affiliate funnel and creator level distributions.
Affiliate funnel stage detail
GET /funnel/stages/{stage_id}
Everything behind one stage of the affiliate funnel returned by GET /funnel: creator_count and percentage_of_funnel, the insights block (unique creators, total entries, conversion rate from the previous stage with its conversion_label, and median days spent in the status), the CRM group_id / group_filters that define the stage, the automation_templates available for it, and the active_automations currently working it.
stage_id accepts the stage keys from the funnel overview — e.g. sample-requested, sample-approved, content-posted, content-unfulfilled, gmv-generated, top-creators.
Set include_products=true to also get the per-product breakdown of the stage (one row per product with stage-relevant metrics such as creators_in_stage, gmv_generated, avg_views, avg_gmv, spark_code_collected); metrics that don't apply to the stage come back as null. Products are paginated independently via products_page / products_page_size and can be narrowed with product_ids.
Single-shop only. Data covers the last 90 days, matching the dashboard.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| stage_id | path | string | true | Funnel stage key, e.g. 'sample-requested' or 'gmv-generated'. |
| include_products | query | boolean | false | Also return the per-product breakdown for this stage. |
| product_ids | query | any | false | Comma-separated product IDs to narrow the per-product breakdown; ignored unless include_products=true. |
| products_page | query | integer | false | Per-product breakdown page. |
| products_page_size | query | integer | false | Per-product breakdown rows per page. |
Example responses
200 Response
{
"shop_id": 0,
"stage": {
"stage_id": "string",
"title": "string",
"description": "string",
"group_id": "string",
"creator_count": 0,
"percentage_of_funnel": 0,
"insights": {
"total_creators": 0,
"total_in_stage": 0,
"advanced_to_next_percentage": 0,
"conversion_label": "of previous status",
"median_time_in_status_days": 0
},
"automation_templates": [
{
"id": "string",
"title": "string",
"description": "string"
}
],
"active_automations": [
{
"automation_id": 0,
"automation_name": "string",
"automation_type": "string",
"sample_requests": 0,
"last_finished_at": "2019-08-24T14:15:22Z",
"status": "string",
"status_msg": "string",
"status_details": "string",
"creators_remaining": 0,
"creators_reached": 0,
"skipped": 0,
"total_creators": 0,
"crm_group_id": "string",
"crm_group_name": "string",
"ai_enabled": false,
"created_at": "2019-08-24T14:15:22Z",
"target_collab_cleanup_creators_reached": 0
}
],
"group_filters": {}
},
"products": {
"stage_id": "string",
"products": [
{
"product_id": "string",
"product_name": "string",
"image_url": "string",
"metrics": {
"property1": 0,
"property2": 0
}
}
],
"total": 0,
"page": 0,
"page_size": 0
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | FunnelStageDetailResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
CRM v2 sample-request rows, with archivedCount and lastUpdatedAt
GET /funnel/v2/requests
The paginated sample-request pipeline for one shop — the rows behind the Sample Requests board. Each row carries the creator (handle, followers, level, rising-star / fast-growing signals, CRM tags), the product, the request's status and timestamps, and the creator's performance metrics (post rate, PPS score, average views, engagement rate, GMV per sample, videos per sample).
Filter by pipeline tab (status), product, SKU, creator profile, sourcing automation, tag, date range, free-text search, and any of the metric ranges (min_* / max_*). product_ids and sku_ids are AND-ed: passing both narrows to those SKUs rather than widening. show_archived returns the archived board instead; show_expiring narrows to requests about to expire. Response also reports archivedCount (requests hidden because the creator is archived), expiringCount, lastUpdatedAt (when this shop was last observed on TikTok; null if never) and a dataFreshness stamp.
Single-shop only, and only for shops on the CRM v2 pipeline — others get a 404 and should use /samples.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| page | query | integer | false | Page number, 1-based. |
| page_size | query | integer | false | Rows per page (max 100). |
| status | query | any | false | Pipeline tab to filter to. One of: toReview, readyToShip, shipped, pendingContent, completed, cancelled. |
| product_ids | query | any | false | Comma-separated product IDs. |
| sku_ids | query | any | false | Comma-separated SKU IDs. AND-ed with product_ids, so passing both narrows to those SKUs rather than widening. |
| profile_ids | query | any | false | Comma-separated creator profile IDs. |
| automation_ids | query | any | false | Comma-separated automation IDs that sourced the request. |
| tags | query | any | false | Comma-separated CRM tags. |
| created_from | query | any | false | Earliest request date, YYYY-MM-DD (inclusive). |
| created_to | query | any | false | Latest request date, YYYY-MM-DD (inclusive). |
| search | query | any | false | Free-text search over creator handle / name. |
| sort_by | query | string | false | Sort field. |
| sort_direction | query | string | false | 'asc' or 'desc'. |
| exclude_rejected | query | boolean | false | Drop rejected requests. |
| show_archived | query | boolean | false | Return archived requests instead. |
| show_expiring | query | boolean | false | Only requests expiring soon. |
| min_post_rate | query | any | false | none |
| max_post_rate | query | any | false | none |
| min_pps_score | query | any | false | none |
| max_pps_score | query | any | false | none |
| min_avg_views | query | any | false | none |
| max_avg_views | query | any | false | none |
| min_engagement_rate | query | any | false | none |
| max_engagement_rate | query | any | false | none |
| min_live_gmv | query | any | false | none |
| max_live_gmv | query | any | false | none |
| min_shop_gmv | query | any | false | none |
| max_shop_gmv | query | any | false | none |
| min_creator_gmv | query | any | false | none |
| max_creator_gmv | query | any | false | none |
| min_avg_gmv_video | query | any | false | none |
| max_avg_gmv_video | query | any | false | none |
| min_gmv_sample | query | any | false | none |
| max_gmv_sample | query | any | false | none |
| min_videos_per_sample | query | any | false | none |
| max_videos_per_sample | query | any | false | none |
Example responses
200 Response
{
"data": [
{
"creator": {
"id": "string",
"handle": "string",
"name": "string",
"creatorImage": "string",
"followers": 0,
"creatorLevel": "string",
"fastGrowing": true,
"isRisingStar": true,
"returning": true,
"tags": [
"string"
]
},
"products": [
{
"applyId": "string",
"productId": "string",
"name": "string",
"sku": "string",
"variantName": "string",
"productImage": "string",
"status": "string",
"qty": 1,
"isRepeatedRequest": true,
"isArchived": false,
"expiresInDays": 0,
"commissionRate": 0,
"stock": 0,
"sampleAllowanceLeft": 0,
"requestedAt": "string",
"expiresAt": "string",
"isExpired": false
}
],
"aggregated": {
"unfulfilled": 0,
"postRate": 0,
"avgViews": 0,
"ppsScore": 0,
"liveGmv": 0,
"engagementRate": 0,
"shopGmv": 0,
"creatorGmv": 0,
"avgGmvPerVideo": 0,
"gmvPerSample": 0,
"videosPerSample": 0
},
"productCount": 0,
"requestDate": "string",
"expiresInDays": 0,
"source": "string"
}
],
"pagination": {
"page": 0,
"perPage": 0,
"totalItems": 0,
"totalPages": 0
},
"archivedCount": {
"creators": 0,
"products": 0,
"total": 0
},
"expiringCount": 0,
"lastUpdatedAt": "string",
"dataFreshness": {
"lastSyncedAt": "string",
"isStale": false,
"isRefreshing": false
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | ListSampleRequestsResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
CRM v2 pipeline counts, archive-inclusive, with archivedCounts per stage
GET /funnel/v2/counts
How many sample requests sit in each pipeline tab — toReview, readyToShip, shipped, pendingContent, completed, cancelled — under the filters you pass, plus the overall completionRate, the shop's approvalTarget (limit and used), archivedCount, expiringCount and a dataFreshness stamp. This is the tab-badge row above the board.
Every tab count INCLUDES requests hidden because the creator is archived, so the funnel matches TikTok's Affiliate Center. archivedCounts breaks that hidden share down per tab, and archivedCount.total is the hidden request count overall. With show_archived=true the archived rows are counted as visible, so archivedCounts comes back zeroed; to list them, pass the same flag to /funnel/v2/requests.
Accepts the same filters as /funnel/v2/requests (the counts respect them), so you can ask 'how many are in each stage for this product / date range'. Single-shop, CRM v2 shops only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| page | query | integer | false | Page number, 1-based. |
| page_size | query | integer | false | Rows per page (max 100). |
| status | query | any | false | Pipeline tab to filter to. One of: toReview, readyToShip, shipped, pendingContent, completed, cancelled. |
| product_ids | query | any | false | Comma-separated product IDs. |
| sku_ids | query | any | false | Comma-separated SKU IDs. AND-ed with product_ids, so passing both narrows to those SKUs rather than widening. |
| profile_ids | query | any | false | Comma-separated creator profile IDs. |
| automation_ids | query | any | false | Comma-separated automation IDs that sourced the request. |
| tags | query | any | false | Comma-separated CRM tags. |
| created_from | query | any | false | Earliest request date, YYYY-MM-DD (inclusive). |
| created_to | query | any | false | Latest request date, YYYY-MM-DD (inclusive). |
| search | query | any | false | Free-text search over creator handle / name. |
| sort_by | query | string | false | Sort field. |
| sort_direction | query | string | false | 'asc' or 'desc'. |
| exclude_rejected | query | boolean | false | Drop rejected requests. |
| show_archived | query | boolean | false | Return archived requests instead. |
| show_expiring | query | boolean | false | Only requests expiring soon. |
| min_post_rate | query | any | false | none |
| max_post_rate | query | any | false | none |
| min_pps_score | query | any | false | none |
| max_pps_score | query | any | false | none |
| min_avg_views | query | any | false | none |
| max_avg_views | query | any | false | none |
| min_engagement_rate | query | any | false | none |
| max_engagement_rate | query | any | false | none |
| min_live_gmv | query | any | false | none |
| max_live_gmv | query | any | false | none |
| min_shop_gmv | query | any | false | none |
| max_shop_gmv | query | any | false | none |
| min_creator_gmv | query | any | false | none |
| max_creator_gmv | query | any | false | none |
| min_avg_gmv_video | query | any | false | none |
| max_avg_gmv_video | query | any | false | none |
| min_gmv_sample | query | any | false | none |
| max_gmv_sample | query | any | false | none |
| min_videos_per_sample | query | any | false | none |
| max_videos_per_sample | query | any | false | none |
Example responses
200 Response
{
"counts": {
"toReview": 0,
"readyToShip": 0,
"shipped": 0,
"pendingContent": 0,
"completed": 0,
"cancelled": 0,
"all": 0,
"inShipment": 0,
"posted": 0,
"allApproved": 0,
"overdue": 0,
"rejected": 0,
"expired": 0,
"ignored": 0
},
"archivedCounts": {
"toReview": 0,
"readyToShip": 0,
"shipped": 0,
"pendingContent": 0,
"completed": 0,
"cancelled": 0,
"all": 0,
"inShipment": 0,
"posted": 0,
"allApproved": 0,
"overdue": 0,
"rejected": 0,
"expired": 0,
"ignored": 0
},
"completionRate": 0,
"approvalTarget": {
"limit": 0,
"used": 0
},
"archivedCount": {
"creators": 0,
"products": 0,
"total": 0
},
"expiringCount": 0,
"dataFreshness": {
"lastSyncedAt": "string",
"isStale": false,
"isRefreshing": false
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | PipelineCountsResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
CRM v2 pipeline headline metrics, pendingReview archive-inclusive
GET /funnel/v2/metrics
The headline metrics above the Sample Requests board: pendingReview (count plus how many expire soon), approvedInAutoProcess (count with period-over-period changePct and changeDirection), completionRate, and approvalTarget progress against the shop's sample-approval limit, with a dataFreshness stamp.
pendingReview.count INCLUDES requests hidden because the creator is archived, so it matches TikTok's Affiliate Center; expiringSoon and completionRate stay over the visible rows, which are the ones you can act on.
Accepts the same filters as /funnel/v2/requests. Under a sku_ids filter, notScopableBySku names the metrics that could not be narrowed — approvalTarget, whose limit and used counters are product-grain — so treat those as unscoped rather than filtered. Single-shop, CRM v2 shops only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| page | query | integer | false | Page number, 1-based. |
| page_size | query | integer | false | Rows per page (max 100). |
| status | query | any | false | Pipeline tab to filter to. One of: toReview, readyToShip, shipped, pendingContent, completed, cancelled. |
| product_ids | query | any | false | Comma-separated product IDs. |
| sku_ids | query | any | false | Comma-separated SKU IDs. AND-ed with product_ids, so passing both narrows to those SKUs rather than widening. |
| profile_ids | query | any | false | Comma-separated creator profile IDs. |
| automation_ids | query | any | false | Comma-separated automation IDs that sourced the request. |
| tags | query | any | false | Comma-separated CRM tags. |
| created_from | query | any | false | Earliest request date, YYYY-MM-DD (inclusive). |
| created_to | query | any | false | Latest request date, YYYY-MM-DD (inclusive). |
| search | query | any | false | Free-text search over creator handle / name. |
| sort_by | query | string | false | Sort field. |
| sort_direction | query | string | false | 'asc' or 'desc'. |
| exclude_rejected | query | boolean | false | Drop rejected requests. |
| show_archived | query | boolean | false | Return archived requests instead. |
| show_expiring | query | boolean | false | Only requests expiring soon. |
| min_post_rate | query | any | false | none |
| max_post_rate | query | any | false | none |
| min_pps_score | query | any | false | none |
| max_pps_score | query | any | false | none |
| min_avg_views | query | any | false | none |
| max_avg_views | query | any | false | none |
| min_engagement_rate | query | any | false | none |
| max_engagement_rate | query | any | false | none |
| min_live_gmv | query | any | false | none |
| max_live_gmv | query | any | false | none |
| min_shop_gmv | query | any | false | none |
| max_shop_gmv | query | any | false | none |
| min_creator_gmv | query | any | false | none |
| max_creator_gmv | query | any | false | none |
| min_avg_gmv_video | query | any | false | none |
| max_avg_gmv_video | query | any | false | none |
| min_gmv_sample | query | any | false | none |
| max_gmv_sample | query | any | false | none |
| min_videos_per_sample | query | any | false | none |
| max_videos_per_sample | query | any | false | none |
Example responses
200 Response
{
"pendingReview": {
"count": 0,
"expiringSoon": 0
},
"approvedInAutoProcess": {
"count": 0,
"changePct": 0,
"changeDirection": "up"
},
"completionRate": {
"rate": 0,
"changePct": 0,
"changeDirection": "up"
},
"approvalTarget": {
"monthlyLimit": 0,
"monthlyUsed": 0,
"dailyTarget": 0,
"dailyCurrent": 0,
"dailyPct": 0,
"onTrack": true
},
"dataFreshness": {
"lastSyncedAt": "string",
"isStale": false,
"isRefreshing": false
},
"notScopableBySku": [
"string"
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | MetricsResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
CRM v2 filter vocabulary
GET /funnel/v2/filter-config
The values you can actually filter the CRM v2 pipeline by for this shop — the products, sourcing automations, CRM tags and status tabs that exist in its data, plus the bounds of each metric range. Call this once to build a filter UI or to discover valid product_ids / automation_ids / tags before querying /funnel/v2/requests.
Single-shop, CRM v2 shops only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| page | query | integer | false | Page number, 1-based. |
| page_size | query | integer | false | Rows per page (max 100). |
| status | query | any | false | Pipeline tab to filter to. One of: toReview, readyToShip, shipped, pendingContent, completed, cancelled. |
| product_ids | query | any | false | Comma-separated product IDs. |
| sku_ids | query | any | false | Comma-separated SKU IDs. AND-ed with product_ids, so passing both narrows to those SKUs rather than widening. |
| profile_ids | query | any | false | Comma-separated creator profile IDs. |
| automation_ids | query | any | false | Comma-separated automation IDs that sourced the request. |
| tags | query | any | false | Comma-separated CRM tags. |
| created_from | query | any | false | Earliest request date, YYYY-MM-DD (inclusive). |
| created_to | query | any | false | Latest request date, YYYY-MM-DD (inclusive). |
| search | query | any | false | Free-text search over creator handle / name. |
| sort_by | query | string | false | Sort field. |
| sort_direction | query | string | false | 'asc' or 'desc'. |
| exclude_rejected | query | boolean | false | Drop rejected requests. |
| show_archived | query | boolean | false | Return archived requests instead. |
| show_expiring | query | boolean | false | Only requests expiring soon. |
| min_post_rate | query | any | false | none |
| max_post_rate | query | any | false | none |
| min_pps_score | query | any | false | none |
| max_pps_score | query | any | false | none |
| min_avg_views | query | any | false | none |
| max_avg_views | query | any | false | none |
| min_engagement_rate | query | any | false | none |
| max_engagement_rate | query | any | false | none |
| min_live_gmv | query | any | false | none |
| max_live_gmv | query | any | false | none |
| min_shop_gmv | query | any | false | none |
| max_shop_gmv | query | any | false | none |
| min_creator_gmv | query | any | false | none |
| max_creator_gmv | query | any | false | none |
| min_avg_gmv_video | query | any | false | none |
| max_avg_gmv_video | query | any | false | none |
| min_gmv_sample | query | any | false | none |
| max_gmv_sample | query | any | false | none |
| min_videos_per_sample | query | any | false | none |
| max_videos_per_sample | query | any | false | none |
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Response Schema
Recommended next-best automations
GET /recommendations
Reacher Recommends for one shop: the automation types the shop has not run in the current timeframe, returned as ready-to-action suggestions. Each entry carries the automation title, description, impact type (e.g. 'High Impact', 'Addon'), the navigate path to set it up, its button label, and shop_names — the shops the recommendation applies to.
Covers the four automation plays Reacher scores: Target Collab, Message + Product Card, Spark Code, and Content Flywheel. An empty array means the shop is already running all of them. Single-shop only.
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
Response Schema
Shop performance targets
GET /targets
The performance targets the shop is measured against — the goal values behind the dashboard's progress bars. Each target carries its granularity (weekly / monthly / quarterly), the period it applies from (created_at), and a targets object with the per-metric goals: target_collabs, creators_messaged, sample_requests, sample_approved, videos_posted, videos_converted, spark_codes.
Omit granularity to get the latest target for each granularity the shop has set; pass one to get that granularity's history, newest first. An empty targets array means the shop has not set any.
Read-only — targets are created and edited in the Reacher dashboard. Single-shop only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| granularity | query | any | false | Restrict to one granularity: weekly, monthly, quarterly. Omit for the latest of each. |
Example responses
200 Response
{
"targets": [
{
"created_at": "2024-01-01T00:00:00Z",
"creators_messaged": 200,
"customer_id": 1,
"granularity": "monthly",
"id": "550e8400-e29b-41d4-a716-446655440000",
"sample_approved": 80,
"sample_requests": 100,
"shop_id": 123,
"spark_codes": 10,
"target_collabs": 50,
"updated_at": "2024-01-01T00:00:00Z",
"videos_converted": 25
}
],
"total_count": 1
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | TargetsListResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Affiliate funnel overview
GET /funnel
Affiliate funnel stage counts matching the dashboard's 'Affiliate Funnel' section. Shows creators at each stage: sample requested, approved, content posted, content unfulfilled, GMV generated, and top creators (>$10k GMV). Data is based on the last 90 days.
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
Response Schema
GMV Max
TikTok Smart+ (GMV Max) campaigns and daily performance metrics for your shop.
List GMV Max campaigns
GET /gmv-max/campaigns
List all GMV Max (TikTok Smart+) campaigns for the shop(s) addressed by x-shop-id. Returns cached campaign metadata last synced from TikTok by the portal — call the portal's sync endpoints to refresh. Supports multi-shop (x-shop-id: all or comma-separated).
Example responses
200 Response
{
"data": [
{
"shop_id": 0,
"campaign_id": "string",
"campaign_name": "string",
"status": "string",
"shopping_ads_type": "string",
"budget": 0,
"roas_bid": 0,
"last_synced_at": "string",
"currency": "string"
}
],
"shops_queried": [
"string"
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | GmvMaxCampaignsResponse |
Create a GMV Max campaign
POST /gmv-max/campaigns
Create a new GMV Max (TikTok Smart+) campaign on the shop's connected TikTok Business ad account. Requires read_write scope. Single shop only — set x-shop-id to the owning shop.
The canonical body is mapped to TikTok's create payload server-side (daily_budget→budget, target_roas→ROAS bid, product_selection→ALL / CUSTOMIZED_PRODUCTS, etc.). The shop must already be connected to TikTok Business / GMV Max — an unconnected or incomplete connection returns 400 INVALID_REQUEST.
Idempotent via the Idempotency-Key header — replays of the same key + same body return the cached 201 without creating a duplicate. X-Dry-Run: true validates the body + connection and echoes the exact TikTok payload without calling TikTok.
Body parameter
{
"campaign_name": "string",
"campaign_type": "product",
"product_selection": "all",
"item_group_ids": [
"string"
],
"target_roas": 0,
"daily_budget": 0,
"schedule_type": "from_now",
"schedule_start_time": "string",
"schedule_end_time": "string",
"promotion_days": 1,
"auto_budget_enabled": true,
"affiliate_posts_enabled": true
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| Idempotency-Key | header | any | false | none |
| X-Dry-Run | header | any | false | none |
| X-Created-Via | header | any | false | none |
| body | body | CreateGmvMaxCampaignRequest | true | none |
Example responses
201 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Dry-run echo (no campaign created). | None |
| 201 | Created | Campaign created. | Inline |
| 400 | Bad Request | Invalid request / shop not connected to GMV Max. | None |
| 403 | Forbidden | API key lacks read_write scope. |
None |
| 409 | Conflict | Idempotency-Key conflict. | None |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
| 429 | Too Many Requests | Write rate limit exceeded. | None |
| 502 | Bad Gateway | TikTok rejected or failed the create. | None |
Response Schema
Daily GMV Max campaign metrics
GET /gmv-max/campaigns/{campaign_id}/metrics
Daily performance metrics (spend, impressions, clicks, orders, gross_revenue, ROAS, CPC, CPM, CTR) for one campaign over a date range. Date range may not exceed 90 days (inclusive). Defaults to the last 30 days. Multi-shop is supported — when multiple shops are addressed via x-shop-id (a comma-separated list or all), the campaign's owning shop is resolved automatically and metrics are returned for that shop.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| campaign_id | path | string | true | none |
| start_date | query | any | false | none |
| end_date | query | any | false | none |
Example responses
200 Response
{
"campaign_id": "string",
"shop_id": 0,
"data": [
{
"date": "string",
"spend": 0,
"impressions": 0,
"clicks": 0,
"orders": 0,
"gross_revenue": 0,
"cpc": 0,
"cpm": 0,
"ctr": 0,
"roas": 0,
"ad_roi": 0
}
],
"start_date": "string",
"end_date": "string",
"currency": "string"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | GmvMaxCampaignMetricsResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Daily GMV Max creative metrics (incl. video view rate)
GET /gmv-max/campaigns/{campaign_id}/creative-metrics
Daily per-creative performance for one campaign, including the video view-rate funnel: 2-second and 6-second view rates plus watch-completion rates (25/50/75/100%), all as percentages (0–100), alongside spend, impressions, clicks, conversions, revenue and ROI. Returns one row per creative per day (raw daily series — aggregate as needed). Optionally narrow to a single creative with material_id. Date range may not exceed 90 days (inclusive); defaults to the last 30 days. Multi-shop is supported — the campaign's owning shop is resolved automatically from x-shop-id.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| campaign_id | path | string | true | none |
| material_id | query | any | false | Optional: restrict to a single creative (material) id. |
| start_date | query | any | false | none |
| end_date | query | any | false | none |
Example responses
200 Response
{
"campaign_id": "string",
"shop_id": 0,
"data": [
{
"material_id": "string",
"date": "string",
"spend": 0,
"impressions": 0,
"clicks": 0,
"conversions": 0,
"revenue": 0,
"roi": 0,
"video_view_rate_2s": 0,
"video_view_rate_6s": 0,
"cost_per_order": 0,
"ctr": 0,
"video_ctr": 0,
"conversion_rate": 0,
"item_group_id": "string",
"delivery_status": "string",
"surface": "string",
"video_view_rate_p25": 0,
"video_view_rate_p50": 0,
"video_view_rate_p75": 0,
"video_view_rate_p100": 0
}
],
"start_date": "string",
"end_date": "string",
"currency": "string"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | GmvMaxCreativeMetricsResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
GMV Max dashboard KPIs
GET /gmv-max/dashboard
Aggregated GMV Max KPIs for a shop over a recent window, with previous-period comparison: spend, revenue, orders, impressions, clicks, ROAS — plus a per-day breakdown for charting. Single shop only (set x-shop-id to a specific shop ID). Mirrors the portal Dashboard exactly.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| days | query | integer | false | Window size in days (default 7). |
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Response Schema
GMV Max campaign detail
GET /gmv-max/campaigns/{campaign_id}
Detail for one campaign: name, status, ad type, budget, ROAS bid, last sync time, plus the campaign's daily metric rows (spend, impressions, clicks, orders, gross_revenue, CPC, CPM, CTR, ROAS). Single shop only — the caller must address the campaign's owning shop via x-shop-id. For multi-shop callers, use the /campaigns list endpoint to discover which shop owns a campaign before requesting its detail.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| campaign_id | path | string | true | none |
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Response Schema
Update a GMV Max campaign
PATCH /gmv-max/campaigns/{campaign_id}
Patch the mutable subset of a GMV Max campaign — daily budget, target ROAS, name, and pause/resume (operation_status). Requires read_write scope. PATCH semantics — fields the caller omits are left unchanged; at least one field must be provided.
The shop must be connected to TikTok Business / GMV Max (400 INVALID_REQUEST otherwise). Idempotent via the Idempotency-Key header. X-Dry-Run: true echoes the mapped TikTok patch without calling TikTok. Single shop only.
Body parameter
{
"campaign_name": "string",
"daily_budget": 0,
"target_roas": 0,
"operation_status": "ENABLE",
"promotion_days": 1,
"auto_budget_enabled": true
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| campaign_id | path | string | true | none |
| Idempotency-Key | header | any | false | none |
| X-Dry-Run | header | any | false | none |
| X-Created-Via | header | any | false | none |
| body | body | UpdateGmvMaxCampaignRequest | true | none |
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Campaign updated (or dry-run echo). | Inline |
| 400 | Bad Request | Invalid request / shop not connected to GMV Max. | None |
| 403 | Forbidden | API key lacks read_write scope. |
None |
| 409 | Conflict | Idempotency-Key conflict. | None |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
| 429 | Too Many Requests | Write rate limit exceeded. | None |
| 502 | Bad Gateway | TikTok rejected or failed the update. | None |
Response Schema
GMV Max creatives for a campaign
GET /gmv-max/creatives
List the synced creatives (videos, spark codes, etc.) attached to a specific GMV Max campaign, with per-creative performance summaries. Single shop only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| campaign_id | query | string | true | GMV Max campaign ID. |
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Response Schema
GMV Max spark code sync state
GET /gmv-max/spark-codes
Cached spark-code sync state for the shop: which codes are queued, in flight, succeeded, or failed against TikTok. Read-only — sync itself is JWT-only on the portal. Single shop only.
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
Response Schema
GMV Max automation quick-start templates
GET /gmv-max/templates
Hard-coded set of quick-start automation templates the portal exposes (e.g. 'Boost top performers', 'Wind down low-ROAS'). Useful as a starting point when scaffolding an automation via the Phase-2 writes API. Not shop-scoped — same set for every caller.
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
Response Schema
List GMV Max automations
GET /gmv-max/automations
List all GMV Max automations configured for the shop, with their current status, trigger frequency, boost window, and last-run summary. Single shop only — automations are per-shop.
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
Response Schema
Create a GMV Max automation
POST /gmv-max/automations
Create a new automation that watches the selected campaign(s) and fires creative boosts when its conditions match. Requires read_write scope. Idempotent via the Idempotency-Key header — replays of the same key + same body return the cached 201 instead of creating a duplicate row.
X-Dry-Run: true validates the body and echoes the would-be row without touching the DB. Single shop only — set x-shop-id to the owning shop.
Every set_up_creative_boost action requires a total_creative_boost_cost guardrail (lifetime spend cap) — missing one returns 422 TOTAL_BUDGET_CAP_REQUIRED. Each campaign_id can only belong to one active automation at a time — conflicts return 422 CAMPAIGN_ALREADY_ASSIGNED.
Body parameter
{
"name": "string",
"template_type": "string",
"trigger_frequency": "daily",
"campaign_ids": [
"string"
],
"conditions": [
{
"metric": "creative_roi",
"operator": "lt",
"value": 0,
"lookback_days": 3
}
],
"actions": [
{
"action_type": "set_up_creative_boost",
"params": {}
}
],
"guardrails": [
{
"rule_type": "total_creative_boost_cost",
"operator": "lt",
"value": 0
}
],
"boost_start_date": "2019-08-24",
"boost_end_date": "2019-08-24"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| Idempotency-Key | header | any | false | none |
| X-Dry-Run | header | any | false | none |
| body | body | AutomationCreateRequestPublic | true | none |
Example responses
201 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Dry-run echo (no automation created). | None |
| 201 | Created | Automation created. | Inline |
| 400 | Bad Request | Invalid request. | None |
| 403 | Forbidden | API key lacks read_write scope. |
None |
| 409 | Conflict | Idempotency-Key conflict. | None |
| 422 | Unprocessable Entity | Validation error (cap missing, campaign conflict, etc.). | None |
| 429 | Too Many Requests | Write rate limit exceeded. | None |
Response Schema
GMV Max automation detail
GET /gmv-max/automations/{automation_id}
Detail for one automation: full configuration (conditions, actions, guardrails) plus its 10 most recent runs. Single shop only — automation_ids are scoped per shop.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| automation_id | path | integer | true | none |
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Response Schema
Update a GMV Max automation
PUT /gmv-max/automations/{automation_id}
Patch an existing automation. Only active, non-expired automations are editable — stopped, deleted, or past-end-date rows return 422 with AUTOMATION_NOT_EDITABLE or AUTOMATION_EXPIRED.
PATCH semantics — fields the caller does NOT include are left unchanged. Sending null for boost_start_date / boost_end_date clears the boost window (both dates must be sent together).
X-Dry-Run: true echoes the patch without writing. Idempotent via the Idempotency-Key header. Single shop only.
Body parameter
{
"name": "string",
"trigger_frequency": "daily",
"campaign_ids": [
"string"
],
"conditions": [
{
"metric": "creative_roi",
"operator": "lt",
"value": 0,
"lookback_days": 3
}
],
"actions": [
{
"action_type": "set_up_creative_boost",
"params": {}
}
],
"guardrails": [
{
"rule_type": "total_creative_boost_cost",
"operator": "lt",
"value": 0
}
],
"boost_start_date": "2019-08-24",
"boost_end_date": "2019-08-24"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| automation_id | path | integer | true | none |
| Idempotency-Key | header | any | false | none |
| X-Dry-Run | header | any | false | none |
| body | body | AutomationUpdateRequestPublic | true | none |
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Automation updated (or dry-run echo). | Inline |
| 403 | Forbidden | API key lacks read_write scope. |
None |
| 404 | Not Found | Automation not found in this shop. | None |
| 409 | Conflict | Idempotency-Key conflict. | None |
| 422 | Unprocessable Entity | Validation error / automation not editable. | None |
| 429 | Too Many Requests | Write rate limit exceeded. | None |
Response Schema
Delete (soft) a GMV Max automation
DELETE /gmv-max/automations/{automation_id}
Soft-delete an automation (status='deleted'). The row remains in the DB but is excluded from list / detail views. Re-deleting an already-deleted automation is a no-op that still returns 200 (idempotent on the row itself).
Pending boost rows queued by this automation are cancelled in the background — best-effort, not awaited here. Single shop only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| automation_id | path | integer | true | none |
| Idempotency-Key | header | any | false | none |
| X-Dry-Run | header | any | false | none |
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Automation deleted (or already deleted). | Inline |
| 403 | Forbidden | API key lacks read_write scope. |
None |
| 404 | Not Found | Automation not found in this shop. | None |
| 409 | Conflict | Idempotency-Key conflict. | None |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
| 429 | Too Many Requests | Write rate limit exceeded. | None |
Response Schema
GMV Max automation run history
GET /gmv-max/automations/{automation_id}/runs
Full run history for one automation (most recent first), including trigger source, start/finish timestamps, success/failure status, and per-run summary metrics. Single shop only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| automation_id | path | integer | true | none |
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Response Schema
GMV Max automation activity log
GET /gmv-max/automations/{automation_id}/activities
Paginated per-event activity log for one automation (campaign boost / cancel events the automation produced), plus an aggregate summary across the full history. Supports the same status and search filters the portal does. Single shop only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| automation_id | path | integer | true | none |
| status | query | any | false | Filter by activity status (matches portal). |
| search | query | any | false | Free-text search across activity rows. |
| page | query | integer | false | none |
| page_size | query | integer | false | none |
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Response Schema
Stop a GMV Max automation
POST /gmv-max/automations/{automation_id}/stop
Mark an automation status='stopped' (terminal — no resume). Already-stopped automations are returned unchanged (idempotent on the row itself, independent of the Idempotency-Key header).
Boost cancellation against TikTok is best-effort and runs in a background thread on the portal side; this endpoint does not wait for it. Single shop only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| automation_id | path | integer | true | none |
| Idempotency-Key | header | any | false | none |
| X-Dry-Run | header | any | false | none |
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Automation stopped (or already stopped). | Inline |
| 403 | Forbidden | API key lacks read_write scope. |
None |
| 404 | Not Found | Automation not found in this shop. | None |
| 409 | Conflict | Idempotency-Key conflict. | None |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
| 429 | Too Many Requests | Write rate limit exceeded. | None |
Response Schema
Sync specific spark codes to TikTok
POST /gmv-max/spark-codes/sync
Synchronously authorise the listed spark codes against the shop's TikTok Business ad account. Each code fires one TikTok /tt_video/authorize/ call:
- On success → code's
sync_statusflips tosynced. - On TikTok QPS / rate-limit → code is left
pendingso the offline CRJ retries it; the response counts this inqueued. - On hard error →
failedwith the error string.
Up to 100 codes per request. Shops without an active TikTok Business connection return 422 TIKTOK_NOT_CONNECTED. Single shop only.
Body parameter
{
"spark_codes": [
"string"
]
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| Idempotency-Key | header | any | false | none |
| X-Dry-Run | header | any | false | none |
| body | body | SparkCodeSyncRequestPublic | true | none |
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Sync attempted; see results for per-code outcome. |
Inline |
| 403 | Forbidden | API key lacks read_write scope. |
None |
| 409 | Conflict | Idempotency-Key conflict. | None |
| 422 | Unprocessable Entity | Shop not connected to TikTok Business. | None |
| 429 | Too Many Requests | Write rate limit exceeded. | None |
Response Schema
Queue every unsynced spark code for sync
POST /gmv-max/spark-codes/sync-all
Queue every spark code for the shop that isn't already synced. Writes pending rows to gmv_max_spark_code_sync; the offline CRJ fires the TikTok /tt_video/authorize/ calls on its next run.
Returns immediately with {queued, skipped, message}. Shops without an active TikTok Business connection return 422 TIKTOK_NOT_CONNECTED. Single shop only.
Body parameter
{}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| Idempotency-Key | header | any | false | none |
| X-Dry-Run | header | any | false | none |
| body | body | any | false | none |
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Codes queued for async sync. | Inline |
| 403 | Forbidden | API key lacks read_write scope. |
None |
| 409 | Conflict | Idempotency-Key conflict. | None |
| 422 | Unprocessable Entity | Shop not connected to TikTok Business. | None |
| 429 | Too Many Requests | Write rate limit exceeded. | None |
Response Schema
Daily product-level GMV Max metrics (per product, per campaign)
POST /gmv-max/products/timeseries
Daily GMV Max metrics broken down to the product (SPU / item_group_id) level for one shop — cost, gross revenue (GMV), SKU orders, ROI, and cost-per-order per product per day. This is the grain behind TikTok Seller Center's per-campaign Product table.
Optionally filter to a single campaign_id and/or item_group_id. item_group_id (aliased as product_id) is the join key to the product / Seller Center product datasets.
Single-shop only — set x-shop-id to a specific shop ID. Defaults to the last 30 days ending yesterday; max range 90 days. Empty data is a normal 200 (a shop may have no GMV Max campaigns).
roi and cost_per_order are TikTok's stored daily values — for window totals use /gmv-max/products/summary, which recomputes them from the summed bases.
Body parameter
{
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"campaign_id": "string",
"item_group_id": "string"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | GmvMaxProductTimeseriesRequest | true | none |
Example responses
200 Response
{
"shop_id": 0,
"currency": "string",
"start_date": "string",
"end_date": "string",
"data": [
{
"date": "string",
"campaign_id": "string",
"item_group_id": "string",
"product_id": "string",
"cost": 0,
"gross_revenue": 0,
"orders": 0,
"roi": 0,
"ad_roi": 0,
"cost_per_order": 0
}
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | GmvMaxProductTimeseriesResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Per-video GMV Max spend and performance (across campaigns)
POST /gmv-max/videos/summary
GMV Max ad spend and performance at the video (creative) grain for one shop — one row per TikTok video across every campaign it delivered in during the window: spend, orders, cost per order, ROI, revenue, impressions, clicks, CTR (ad click rate), video CTR (product click rate), latest delivery status, surface, the video's posted date and creator when it is an affiliate video, and whether it is already on the shop's exclusion list. This is the per-creative export a media buyer pulls from Ads Manager by hand.
Totals are SUMs over the window; cost_per_order and roi are recomputed from the summed bases; ctr / video_ctr are impressions-weighted. Filter with campaign_id and min_spend (e.g. min_spend: 10 with orders == 0 to find creatives to exclude), sort with sort_by / sort_dir, page with page / page_size (max 200). Exclude a video with POST /gmv-max/excluded-videos (or /bulk).
Single-shop only. Defaults to the last 30 days ending yesterday; max range 90 days. Empty data is a normal 200.
Body parameter
{
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"campaign_id": "string",
"min_spend": 0,
"sort_by": "spend",
"sort_dir": "asc",
"page": 1,
"page_size": 50
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | GmvMaxVideoSummaryRequest | true | none |
Example responses
200 Response
{
"shop_id": 0,
"currency": "string",
"start_date": "string",
"end_date": "string",
"data": [
{
"video_id": "string",
"campaign_ids": [
"string"
],
"item_group_id": "string",
"posted_date": "string",
"creator_name": "string",
"title": "string",
"spend": 0,
"revenue": 0,
"orders": 0,
"cost_per_order": 0,
"roi": 0,
"impressions": 0,
"clicks": 0,
"ctr": 0,
"video_ctr": 0,
"delivery_status": "string",
"surface": "string",
"first_active_date": "string",
"last_active_date": "string",
"is_excluded": true,
"exclusion_status": "string"
}
],
"pagination": {
"total_count": 0,
"page": 0,
"page_size": 0,
"total_pages": 0
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | GmvMaxVideoSummaryResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Product-level GMV Max window totals + GMV Max Ads overview
POST /gmv-max/products/summary
Per-product window totals for one shop, plus an account-level overview — the Seller Center GMV Max Ads overview card (total cost, SKU orders, cost per order, gross revenue, ROI).
Products carry per-product cost + GMV + SKU orders (SUMmed over the window) with cost_per_order and roi recomputed from the summed bases, and the owning campaign's name / status / budget / target ROI (= ROAS bid) joined in. Sorted by cost descending.
Overview is derived from the same per-product sums, so it reconciles with the product rows. (Note: product-level cost can differ slightly from the campaign-metrics cost — TikTok attributes them differently; CORE-4486.)
Single-shop only. Same window defaults/caps as the timeseries endpoint. Optionally filter to a single campaign_id.
Body parameter
{
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"campaign_id": "string"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | any | false | none |
Example responses
200 Response
{
"shop_id": 0,
"currency": "string",
"start_date": "string",
"end_date": "string",
"overview": {
"cost": 0,
"gross_revenue": 0,
"orders": 0,
"cost_per_order": 0,
"roi": 0,
"ad_roi": 0
},
"products": [
{
"campaign_id": "string",
"campaign_name": "string",
"status": "string",
"budget": 0,
"target_roi": 0,
"item_group_id": "string",
"product_id": "string",
"cost": 0,
"gross_revenue": 0,
"orders": 0,
"cost_per_order": 0,
"roi": 0,
"ad_roi": 0
}
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | GmvMaxProductSummaryResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
GMV Max campaign settings (normalized)
GET /gmv-max/campaigns/{campaign_id}/settings
The campaign's current settings, normalized from TikTok's raw campaign/gmv_max/info payload into a stable snake_case object: status, target_roas, daily_budget, schedule window, auto_budget_enabled, product_selection, roi_protection_enabled, affiliate_posts_enabled, and placements. Settings TikTok did not report are null. Single shop only — set x-shop-id to the campaign's owning shop. 404 if the campaign is not found in this shop.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| campaign_id | path | string | true | none |
Example responses
200 Response
{
"data": {
"status": "string",
"target_roas": 0,
"daily_budget": 0,
"schedule_type": "string",
"schedule_start_time": {},
"schedule_end_time": {},
"promotion_days": {},
"auto_budget_enabled": true,
"product_selection": {},
"roi_protection_enabled": true,
"affiliate_posts_enabled": true,
"placements": {}
},
"currency": "string"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | GmvMaxCampaignSettingsResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
GMV Max creative delivery-status breakdown
GET /gmv-max/campaigns/{campaign_id}/delivery-status
Creative counts and spend for one campaign grouped by delivery status, computed from each creative's LATEST daily metric row. Statuses are bucketed from TikTok's raw creative_delivery_status into a canonical set (delivering, not_delivering, in_review, rejected, inactive, unknown); NULL or unrecognised statuses bucket as unknown. Sorted by spend descending. Empty data is a normal 200. Single shop only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| campaign_id | path | string | true | none |
Example responses
200 Response
{
"campaign_id": "string",
"shop_id": 0,
"data": [
{
"status": "delivering",
"creative_count": 0,
"spend": 0
}
],
"currency": "string"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | GmvMaxCampaignDeliveryStatusResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
GMV Max spend by delivery surface
GET /gmv-max/campaigns/{campaign_id}/spend-by-surface
Ad spend and distinct-creative counts for one campaign grouped by delivery surface (product_card, affiliate, brand, unknown) over a date range. NULL / unrecognised surface_bucket values bucket as unknown. Date range may not exceed 90 days (inclusive); defaults to the last 30 days. Sorted by spend descending. Empty data is a normal 200. Single shop only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| campaign_id | path | string | true | none |
| start_date | query | any | false | none |
| end_date | query | any | false | none |
Example responses
200 Response
{
"campaign_id": "string",
"shop_id": 0,
"data": [
{
"surface": "product_card",
"spend": 0,
"creative_count": 0
}
],
"start_date": "string",
"end_date": "string",
"currency": "string"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | GmvMaxSpendBySurfaceResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
GMV Max campaign settings change log
GET /gmv-max/campaigns/{campaign_id}/changes
Paginated, append-only log of settings changes for one campaign, newest first. Each row carries the changed field, its old_value and new_value (JSON), and the changed_at timestamp. Empty data is a normal 200. Single shop only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| campaign_id | path | string | true | none |
| page | query | integer | false | none |
| page_size | query | integer | false | none |
Example responses
200 Response
{
"data": [
{
"field": "string",
"old_value": {},
"new_value": {},
"changed_at": "string"
}
],
"pagination": null
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | GmvMaxCampaignChangesResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
List GMV Max excluded creators
GET /gmv-max/excluded-creators
List the creators excluded from this shop's GMV Max bottom-of-funnel delivery — both manually excluded (source: manual) and auto-detected (source: auto_bof). Ordered applied first, then pending, then failed; newest first within each status. Single shop only (set x-shop-id to a specific shop ID).
Example responses
200 Response
{
"data": [
{
"handle": "string",
"source": "string",
"reason": "string",
"bof_confidence": 0,
"excluded_video_count": 0,
"applied_status": "string",
"decided_by": "string",
"created_at": "2019-08-24T14:15:22Z",
"updated_at": "2019-08-24T14:15:22Z"
}
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | GmvMaxExcludedCreatorsListResponse |
Exclude a creator from GMV Max
POST /gmv-max/excluded-creators
Manually exclude a creator (by TikTok handle) from this shop's GMV Max bottom-of-funnel delivery. Idempotent on (shop, handle): re-excluding an already-excluded creator is a no-op upsert that returns the existing row. Requires read_write scope and an Idempotency-Key. Single shop only.
Body parameter
{
"handle": "string"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| Idempotency-Key | header | any | false | none |
| body | body | GmvMaxExcludeCreatorRequest | true | none |
Example responses
200 Response
{
"data": {
"handle": "string",
"source": "string",
"reason": "string",
"bof_confidence": 0,
"excluded_video_count": 0,
"applied_status": "string",
"decided_by": "string",
"created_at": "2019-08-24T14:15:22Z",
"updated_at": "2019-08-24T14:15:22Z"
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | GmvMaxExcludeCreatorWriteResponse |
| 400 | Bad Request | Bad Request | WriteErrorResponse |
| 403 | Forbidden | Forbidden | WriteErrorResponse |
| 409 | Conflict | Conflict | WriteErrorResponse |
| 422 | Unprocessable Entity | Unprocessable Entity | WriteErrorResponse |
| 429 | Too Many Requests | Too Many Requests | WriteErrorResponse |
| 500 | Internal Server Error | Internal Server Error | WriteErrorResponse |
Get GMV Max BOF auto-exclude settings
GET /gmv-max/bof-settings
Read the shop's GMV Max bottom-of-funnel auto-exclude toggle. Defaults to auto_exclude_enabled: false for shops that have never set it. Single shop only.
Example responses
200 Response
{
"data": {
"shop_id": 0,
"auto_exclude_enabled": true
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | GmvMaxBofSettingsResponse |
Update GMV Max BOF auto-exclude settings
PUT /gmv-max/bof-settings
Enable or disable automatic exclusion of bottom-of-funnel creators for this shop's GMV Max delivery. Upserts the shop's toggle and returns the new value. Requires read_write scope and an Idempotency-Key. Single shop only.
Body parameter
{
"auto_exclude_enabled": true
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| Idempotency-Key | header | any | false | none |
| body | body | GmvMaxBofSettingsUpdateRequest | true | none |
Example responses
200 Response
{
"data": {
"shop_id": 0,
"auto_exclude_enabled": true
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | GmvMaxBofSettingsResponse |
| 400 | Bad Request | Bad Request | WriteErrorResponse |
| 403 | Forbidden | Forbidden | WriteErrorResponse |
| 409 | Conflict | Conflict | WriteErrorResponse |
| 422 | Unprocessable Entity | Unprocessable Entity | WriteErrorResponse |
| 429 | Too Many Requests | Too Many Requests | WriteErrorResponse |
| 500 | Internal Server Error | Internal Server Error | WriteErrorResponse |
Remove a GMV Max creator exclusion
DELETE /gmv-max/excluded-creators/{handle}
Remove a creator from this shop's GMV Max exclusion list, restoring them to bottom-of-funnel delivery. handle is the creator's TikTok handle (from GET /gmv-max/excluded-creators). Removing a creator who isn't excluded is a no-op that still returns 200 with removed: false. Requires read_write scope and an Idempotency-Key. Single shop only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| handle | path | string | true | The excluded creator's TikTok handle. |
| Idempotency-Key | header | any | false | none |
Example responses
200 Response
{
"data": {
"handle": "string",
"removed": true
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | GmvMaxExcludedCreatorRemoveResponse |
| 400 | Bad Request | Bad Request | WriteErrorResponse |
| 403 | Forbidden | Forbidden | WriteErrorResponse |
| 409 | Conflict | Conflict | WriteErrorResponse |
| 422 | Unprocessable Entity | Unprocessable Entity | WriteErrorResponse |
| 429 | Too Many Requests | Too Many Requests | WriteErrorResponse |
| 500 | Internal Server Error | Internal Server Error | WriteErrorResponse |
List GMV Max excluded videos
GET /gmv-max/excluded-videos
List the individual videos (creatives) excluded from this shop's GMV Max delivery. Unlike creator exclusions, a video exclusion takes ONE creative off spend and leaves the creator's other videos live. Ordered applied first, then pending, then failed; newest first within each status. applied_status tells you whether TikTok has confirmed the exclusion (applied), it is waiting for the 4-hourly reconcile (pending), the video is not in any active campaign (no_creatives), or an actively delivering placement could not be excluded (failed). Single shop only.
Example responses
200 Response
{
"data": [
{
"video_id": "string",
"source": "string",
"reason": "string",
"excluded_campaign_count": 0,
"applied_status": "string",
"decided_by": "string",
"created_at": "2019-08-24T14:15:22Z",
"updated_at": "2019-08-24T14:15:22Z"
}
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | GmvMaxExcludedVideosListResponse |
Exclude a video from GMV Max
POST /gmv-max/excluded-videos
Exclude ONE video (creative) from this shop's GMV Max delivery, by TikTok video_id, without excluding its creator — use this to cut an unprofitable creative (e.g. zero orders at $10+ spend) while the creator's other videos keep delivering. The reconcile job removes the creative from every active campaign it is delivering in within ~4 hours and verifies it flipped to EXCLUDED. Idempotent on (shop, video_id): re-excluding an already excluded video keeps its current applied_status. Requires read_write scope and an Idempotency-Key. Single shop only. For many videos at once use POST /gmv-max/excluded-videos/bulk.
Body parameter
{
"video_id": "string",
"reason": "string"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| Idempotency-Key | header | any | false | none |
| body | body | GmvMaxExcludeVideoRequest | true | none |
Example responses
200 Response
{
"data": {
"video_id": "string",
"source": "string",
"reason": "string",
"excluded_campaign_count": 0,
"applied_status": "string",
"decided_by": "string",
"created_at": "2019-08-24T14:15:22Z",
"updated_at": "2019-08-24T14:15:22Z"
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | GmvMaxExcludeVideoWriteResponse |
| 400 | Bad Request | Bad Request | WriteErrorResponse |
| 403 | Forbidden | Forbidden | WriteErrorResponse |
| 409 | Conflict | Conflict | WriteErrorResponse |
| 422 | Unprocessable Entity | Unprocessable Entity | WriteErrorResponse |
| 429 | Too Many Requests | Too Many Requests | WriteErrorResponse |
| 500 | Internal Server Error | Internal Server Error | WriteErrorResponse |
Exclude many videos from GMV Max
POST /gmv-max/excluded-videos/bulk
Exclude a list of videos (creatives) from this shop's GMV Max delivery in one call — paste the video ids from an Ads Manager export or from the GMV Max video summary tool. Up to 500 valid ids per call; duplicates are collapsed, already-excluded ids are counted in already_excluded, and inputs that are not a numeric TikTok video id come back in invalid (nothing is silently dropped). Each excluded creative comes off spend on the next reconcile (~4h) while its creator's other videos keep delivering. Requires read_write scope and an Idempotency-Key. Single shop only.
Body parameter
{
"video_ids": [
"string"
],
"reason": "string"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| Idempotency-Key | header | any | false | none |
| body | body | GmvMaxExcludeVideosBulkRequest | true | none |
Example responses
200 Response
{
"data": {
"requested": 0,
"excluded": 0,
"already_excluded": 0,
"invalid": [
"string"
],
"excluded_video_ids": [
"string"
]
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | GmvMaxBulkVideoExclusionResponse |
| 400 | Bad Request | Bad Request | WriteErrorResponse |
| 403 | Forbidden | Forbidden | WriteErrorResponse |
| 409 | Conflict | Conflict | WriteErrorResponse |
| 422 | Unprocessable Entity | Unprocessable Entity | WriteErrorResponse |
| 429 | Too Many Requests | Too Many Requests | WriteErrorResponse |
| 500 | Internal Server Error | Internal Server Error | WriteErrorResponse |
Remove a GMV Max video exclusion
DELETE /gmv-max/excluded-videos/{video_id}
Remove a video from this shop's GMV Max exclusion list. video_id is the TikTok video id (from GET /gmv-max/excluded-videos). Reacher stops enforcing the exclusion; TikTok does not automatically re-add a creative it has already EXCLUDED, so re-adding it to a campaign is done in Ads Manager. Removing a video that isn't excluded is a no-op that still returns 200 with removed: false. Requires read_write scope and an Idempotency-Key. Single shop only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| video_id | path | string | true | The excluded video's TikTok video id. |
| Idempotency-Key | header | any | false | none |
Example responses
200 Response
{
"data": {
"video_id": "string",
"removed": true
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | GmvMaxExcludedVideoRemoveResponse |
| 400 | Bad Request | Bad Request | WriteErrorResponse |
| 403 | Forbidden | Forbidden | WriteErrorResponse |
| 409 | Conflict | Conflict | WriteErrorResponse |
| 422 | Unprocessable Entity | Unprocessable Entity | WriteErrorResponse |
| 429 | Too Many Requests | Too Many Requests | WriteErrorResponse |
| 500 | Internal Server Error | Internal Server Error | WriteErrorResponse |
Meta Ads
Cross-channel Meta Ads rev-share campaigns: campaign settings + creator roster, the per-campaign leaderboard (attributed GMV, ad spend, impressions, commission from the attribution ledger), Stripe creator payouts + history, and the Meta media library. All money is reported in cents in the shop's Meta ad account currency. Single shop only. Distinct from GMV Max (TikTok Smart+ ads) and from Creator Community campaign payments at /campaigns/payments/*.
List Meta Ads rev-share campaigns
GET /meta-ads/campaigns
List the shop's Meta Ads (Cross-channel) rev-share campaigns, newest first, optionally filtered by status. Each row carries its lifecycle settings (commission base/rate, attribution window, usage-rights and whitelist grants) plus lightweight rollups: active_creators, lifetime attributed_revenue_cents, and unpaid commission_owed_cents. Single shop only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| status | query | any | false | Filter by lifecycle status: draft |
Example responses
200 Response
{
"campaigns": [
{
"id": "string",
"short_id": "string",
"shop_id": 0,
"name": "string",
"status": "string",
"commission_base": "string",
"commission_rate": 0,
"commission_cap_cents": 0,
"attribution_window": "string",
"start_date": "string",
"end_date": "string",
"usage_grant_on": true,
"whitelist_grant_on": true,
"whitelist_path": "spark_code",
"created_at": "string",
"updated_at": "string",
"active_creators": 0,
"attributed_revenue_cents": 0,
"commission_owed_cents": 0
}
],
"currency": "string"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | MetaAdsCampaignsResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Meta Ads campaign detail
GET /meta-ads/campaigns/{campaign_id}
Full detail for one rev-share campaign: its settings plus the creator roster (opt-in status, whitelist grant, resolved TikTok handle/name/avatar per creator). Single shop only — address the campaign's owning shop via x-shop-id.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| campaign_id | path | string | true | none |
Example responses
200 Response
{
"campaign": {
"id": "string",
"short_id": "string",
"shop_id": 0,
"name": "string",
"status": "string",
"commission_base": "string",
"commission_rate": 0,
"commission_cap_cents": 0,
"attribution_window": "string",
"start_date": "string",
"end_date": "string",
"usage_grant_on": true,
"whitelist_grant_on": true,
"whitelist_path": "spark_code",
"created_at": "string",
"updated_at": "string",
"active_creators": 0,
"attributed_revenue_cents": 0,
"commission_owed_cents": 0
},
"roster": [
{
"campaign_id": "string",
"creator_id": "string",
"invite_status": "string",
"invited_at": "string",
"accepted_at": "string",
"activated_at": "string",
"partnership_ad_code": "string",
"whitelist_granted": false,
"creator_handle": "string",
"creator_name": "string",
"avatar_url": "string"
}
],
"currency": "string"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | MetaAdsCampaignDetailResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Meta Ads campaign leaderboard + totals
GET /meta-ads/campaigns/{campaign_id}/rollups
The Creators-tab view for one campaign: five summary-card totals (attributed GMV, impressions/views, GMV per video, ad spend, commission owed) plus a per-creator leaderboard with each creator's attributed GMV, ad spend, impressions, distinct attributed ads, lifetime vs. outstanding commission, and Partnership-ad whitelist status. Every metric is Meta-side (from the attribution ledger) — TikTok organic stats are not mixed in. All cents are in the shop's Meta ad account currency (echoed as currency). Single shop only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| campaign_id | path | string | true | none |
| page | query | integer | false | 1-indexed leaderboard page. |
| page_size | query | integer | false | Leaderboard rows per page. Defaults to the maximum so a caller that ignores paging still receives a full page; read creator_total / total_pages to walk the rest. |
Example responses
200 Response
{
"totals": {
"gmv_cents": 0,
"views": 0,
"gmv_per_video_cents": 0,
"ad_spend_cents": 0,
"commission_owed_cents": 0,
"ads": 0
},
"creators": [
{
"creator_id": "string",
"rank": 0,
"creator_handle": "string",
"creator_name": "string",
"avatar_url": "string",
"instagram_handle": "string",
"invite_status": "string",
"gmv_cents": 0,
"ad_spend_cents": 0,
"payout_earned_cents": 0,
"payout_outstanding_cents": 0,
"payout_payable_cents": 0,
"payout_status": "paid",
"videos": 0,
"views": 0,
"whitelist_granted": true,
"whitelist_status": "string"
}
],
"creator_total": 0,
"filtered_total": 0,
"page": 1,
"page_size": 100,
"total_pages": 1,
"currency": "string"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | MetaAdsCampaignRollupsResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Meta Ads creator payout balances
GET /meta-ads/payouts
Per-creator rev-share payout balances for the shop (the Meta Ads Payouts tab), plus summary totals: total owed, ready to pay, and paid in the last 30 days. These are Meta rev-share Stripe payouts and are distinct from Creator Community campaign payments at /campaigns/payments/*. All cents are in the shop's Meta ad account currency (echoed as currency). Single shop only.
Example responses
200 Response
{
"payouts": [
{
"creator_id": "string",
"creator_handle": "string",
"creator_name": "string",
"balance_owed_cents": 0,
"status": "string",
"tax_status": "unknown",
"last_payout_at": "string"
}
],
"total_owed_cents": 0,
"ready_cents": 0,
"paid_period_cents": 0,
"currency": "string"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | MetaAdsPayoutsResponse |
Meta Ads payout history
GET /meta-ads/payouts/history
Logged Stripe transfers to creators for the shop's Meta Ads rev-share payouts, newest first. Each row is one transfer (amount, method, Stripe transfer id, timestamp). All cents are in the shop's Meta ad account currency. Single shop only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| limit | query | integer | false | Max rows to return. |
Example responses
200 Response
{
"history": [
{
"id": "string",
"creator_id": "string",
"creator_handle": "string",
"creator_name": "string",
"amount_cents": 0,
"method": "string",
"stripe_transfer_id": "string",
"created_at": "string"
}
],
"currency": "string"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | MetaAdsPayoutHistoryResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Meta Ads media library
GET /meta-ads/media-library
Creator videos the shop has uploaded to its Meta ad library, newest first, scoped to the currently connected ad account. Each item carries the source usage-right id, the Meta asset id, the asset name (which ends with RCHR_{tracking_code} behind the shop's own naming template), the tracking_code to build rc_code from, and the rev-share campaign it's assigned to (if any). Single shop only.
Example responses
200 Response
{
"items": [
{
"usage_right_id": "string",
"asset_id": "string",
"asset_name": "string",
"tracking_code": "string",
"campaign_id": "string",
"created_at": "string"
}
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | MetaAdsMediaLibraryResponse |
Meta connection status
GET /meta-ads/status
Whether this shop's Meta integration is live, and what it is wired to: the Facebook Page, the Instagram Business account, the ad account and the Business Manager. This is the cheap call — it reads the stored authorization rather than fanning out to Meta, with a single best-effort Instagram profile fetch layered on top (its failure degrades the ig object, never the response).
connected: false covers both never-connected and revoked/expired-and-not-yet-repaired; a shop in the latter state answers 409 META_REAUTH_REQUIRED on the endpoints that call Meta. Poll this before the network-bound reads. Single shop only.
Example responses
200 Response
{
"connected": true,
"needs_reauth": false,
"page": {
"id": "string",
"name": "string"
},
"ig": {
"id": "string",
"username": "string"
},
"ad_account": {
"id": "string",
"name": "string"
},
"business": {
"id": "string",
"name": "string"
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | StatusResponse |
Meta aggregate dashboard payload
GET /meta-ads/summary
Everything the portal's Meta dashboard header renders, in one call: the connected Instagram account (with follower / media counts and recent engagement), the Page, the ad account (with its currency and account status), the Business Manager, plus counts of recent own and tagged Instagram media.
Where /meta-ads/status is a database read, this fans out across several Graph edges — so it is served stale-while-revalidate from the same Valkey cache the portal uses (fresh under 5 minutes, usable-but-refreshing under 30, rebuilt inline only when cold), and invalidated immediately by any connection change. Every sub-object is open-schema: new fields can appear without a breaking change, and a sub-fetch that fails comes back as an empty object rather than failing the call. Single shop only.
Example responses
200 Response
{
"ig": {},
"page": {},
"ad_account": {},
"business": {},
"recent_own_media_count": 0,
"recent_tagged_media_count": 0
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | SummaryResponse |
Meta paid-ad performance
GET /meta-ads/ad-performance
Marketing API performance for the shop's connected ad account over a preset window: account-level totals (impressions, clicks, reach, spend, CTR, CPM, conversions) plus a per-ad table carrying the same metrics alongside each ad's creative — thumbnail, headline, body copy, link, call-to-action, and the branded-content partner's Instagram account for Partnership ads.
conversions is the sum of every entry in Meta's actions breakdown, because the insights edge exposes no single conversions field — read it as total attributed actions, not purchases. spend and the derived rates are in currency, the ad account's own currency, which need not match the shop's TikTok currency.
This is paid Meta data straight from the Marketing API and is unrelated to the rev-share attribution figures at /meta-ads/campaigns/{campaign_id}/rollups, which come from Reacher's own ledger — do not add them together. Sub-fetches are best-effort: a failing insights edge yields zeros and an empty ad list rather than an error. Returns 400 when the shop has no ad account linked. Single shop only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| date_preset | query | string | false | Meta Marketing API reporting window. One of: last_14d, last_28d, last_30d, last_3d, last_7d, last_90d, last_month, last_quarter, maximum, this_month, this_quarter, today, yesterday. |
Example responses
200 Response
{
"account_id": "string",
"account_name": "string",
"currency": "string",
"date_preset": "last_30d",
"totals": {
"impressions": 0,
"clicks": 0,
"reach": 0,
"spend": 0,
"ctr": 0,
"cpm": 0,
"conversions": 0
},
"ads": [
{
"id": "string",
"name": "string",
"status": "string",
"effective_status": "string",
"created_time": "string",
"campaign_id": "string",
"adset_id": "string",
"creative_id": "string",
"thumbnail_url": "string",
"headline": "string",
"message": "string",
"link_url": "string",
"cta_type": "string",
"partner_ig_user_id": "string",
"partner_ig_username": "string",
"video_id": "string",
"video_url": "string",
"impressions": 0,
"clicks": 0,
"reach": 0,
"spend": 0,
"ctr": 0,
"cpm": 0,
"conversions": 0
}
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | AdPerformanceResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Meta ad accounts available to this connection
GET /meta-ads/ad-accounts
Every ad account the connected Meta user can manage, read live from Meta rather than from stored state, each with its name, currency, account status and owning Business Manager. is_current (and the top-level current_ad_account_id) marks the one this shop's ads and /meta-ads/ad-performance figures are read from.
The list is the source of truth for what an account switch could target; switching itself stays in the portal. Requires a live Meta grant — a shop needing reconnection answers 409 META_REAUTH_REQUIRED. Single shop only.
Example responses
200 Response
{
"accounts": [
{
"account_id": "string",
"name": "string",
"currency": "string",
"account_status": 0,
"business_id": "string",
"business_name": "string",
"is_current": false
}
],
"current_ad_account_id": "string"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | AdAccountsResponse |
Facebook Pages available to this connection
GET /meta-ads/pages
Every Facebook Page the connected Meta user administers, read live from Meta, each resolved to its linked Instagram Business account (ig_user_id / ig_username, with has_instagram as the quick flag). is_current marks the Page this shop is connected through.
The Instagram link matters beyond display: Partnership ads and creator whitelisting both run through the Page's IG account, so a Page with has_instagram: false leaves the connection functionally incomplete even while /meta-ads/status reports connected: true. Single shop only.
Example responses
200 Response
{
"pages": [
{
"page_id": "string",
"name": "string",
"ig_user_id": "string",
"ig_username": "string",
"has_instagram": false,
"is_current": false
}
],
"current_page_id": "string"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | PagesResponse |
Instagram posts that @mention this account
GET /meta-ads/instagram/tagged-media
Up to 50 recent Instagram posts tagging the connected Business account — the organic creator content mentioning the brand, which is where whitelisting and Partnership-ad candidates are usually found. Each row carries the caption, media type, permalink, timestamp, the posting handle, and public like_count / comments_count.
Meta restricts this edge to owner-visible fields, so media_url and thumbnail_url are not available for tagged posts (they are owner-only) — render the permalink for click-through. The public engagement counts here are the only engagement signal available for content the brand did not post; per-media /insights will refuse it. owner is best-effort and may be absent when Meta withholds it. Single shop only.
Example responses
200 Response
{
"data": [
{
"id": "string",
"caption": "string",
"media_type": "string",
"permalink": "string",
"timestamp": "string",
"username": "string",
"owner": {},
"like_count": 0,
"comments_count": 0
}
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | TaggedMediaResponse |
The connected Instagram account's own posts
GET /meta-ads/instagram/own-media
The 24 most recent posts published by the connected Instagram Business account, newest first, with caption, media type, media and thumbnail URLs, permalink, timestamp and public engagement counts.
Unlike tagged media, these are owned posts — so each id here is a valid media_id for /meta-ads/instagram/media/{media_id}/insights, which is the only way to get reach and saves. Media and thumbnail URLs are short-lived signed Meta CDN links; mirror the bytes if you need them to persist. Rows are passed through exactly as Meta returns them. Single shop only.
Example responses
200 Response
{
"data": [
{}
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | InstagramOwnMediaResponse |
Insights for one owned Instagram post
GET /meta-ads/instagram/media/{media_id}/insights
Reach and saves for a single Instagram post, returned as a flat metrics map so new metrics can be added without a breaking change.
Meta serves per-media insights only for media owned by the connected account. Ask for a tagged post — anything from /meta-ads/instagram/tagged-media — and the answer is 422 INSIGHTS_NOT_AVAILABLE; that is Meta's rule, not a Reacher restriction, and the public engagement counts on the tagged-media row are the substitute. Source media_id values from /meta-ads/instagram/own-media. Single shop only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| media_id | path | string | true | IG media ID, as returned by /meta-ads/instagram/own-media. |
Example responses
200 Response
{
"media_id": "string",
"metrics": {}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | MediaInsightsResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Public profile for any Instagram business handle
GET /meta-ads/instagram/business-discovery
Resolve an Instagram handle to its public profile — follower count, post count, bio, display name, avatar and IG user ID — using the connected account's Graph access. The handle does not need any relationship with the brand, which makes this the sizing check before reaching out to a creator.
Meta only resolves Business and Creator accounts through this edge: a personal account, a private account, or a handle that does not exist all come back as 404 alike, and no distinction between those cases is available. Pass the handle with or without a leading @.
For repeated or typeahead lookups prefer /meta-ads/instagram/creator-lookup, which returns the same profile from a 5-minute cache and so does not spend Meta API quota per keystroke. Single shop only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| username | query | string | true | Instagram handle to look up; a leading @ is accepted. |
Example responses
200 Response
{
"username": "string",
"name": "",
"biography": "",
"profile_picture_url": "",
"followers_count": 0,
"media_count": 0,
"ig_user_id": ""
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | InstagramBusinessDiscoveryResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Instagram creator lookup (cached)
GET /meta-ads/instagram/creator-lookup
Resolve an Instagram handle to a creator profile — IG user ID, handle, name, follower count and avatar — shaped as a suggestions list so the response stays stable as more resolution sources are added. Today exactly one source contributes, Meta's business discovery, so the list holds at most one entry.
Results are cached in Valkey for 5 minutes per shop and query, which is what makes this the endpoint to call on keystroke; /meta-ads/instagram/business-discovery hits Meta every time and returns richer fields.
A handle that cannot be resolved — nonexistent, private, or a personal rather than Business/Creator account — returns an empty suggestions list rather than a 404, so a typeahead never has to treat a miss as an error. verified is always null: Meta's discovery edge does not expose it. Single shop only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| query | query | string | true | Instagram handle or partial name; a leading @ is accepted. |
Example responses
200 Response
{
"suggestions": [
{
"ig_user_id": "string",
"username": "string",
"name": "string",
"followers_count": 0,
"verified": true,
"profile_picture_url": "string",
"source": "string"
}
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | CreatorLookupResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
AI Search
Multi-modal creator search backed by the same retrieval pipeline as the portal: profile (natural-language), transcript (spoken-word), video (visual), and lookalike (creator->creator). GET /ai-search/capabilities reports which modes the shop's region supports; transcript/video/lookalike auto-enable per region as their indexes backfill. CSV export (profile results) has a 50,000-row hard cap.
Search creators with natural language (profile mode)
POST /ai-search/creators
Search the global TikTok creator universe with a natural-language query. Returns paginated creator results scored against the query, with optional browse mode when query is omitted (returns top creators in the shop's region). Requires a single x-shop-id — the shop's region determines which regional creator table is searched. Launched regions use the v3 profile pipeline; other regions fall back to the v2 pipeline (profile is never region-gated). Units: the gmv field is in US dollars; post_rate/engagement_rate are on a 0–100 scale (NOT 0–1). Filter on an exact GMV/post-rate via the flat params (min_gmv, min_post_rate, …) or the equivalent nested filters.
Body parameter
{
"min_gmv": 0,
"max_gmv": 0,
"min_units_sold": 0,
"max_units_sold": 0,
"min_post_rate": 100,
"max_post_rate": 100,
"min_engagement_rate": 100,
"max_engagement_rate": 100,
"min_average_views": 0,
"max_average_views": 0,
"min_followers": 0,
"max_followers": 0,
"has_email": true,
"categories": [
"string"
],
"gender": [
"string"
],
"creator_ethnicity": [
"string"
],
"age_range": [
"string"
],
"community": [
"string"
],
"creator_level": [
"string"
],
"languages": [
"string"
],
"audience_age": [
"string"
],
"audience_gender": [
"string"
],
"content_style": [
"string"
],
"production_quality": [
"string"
],
"personality_tone": [
"string"
],
"face_visibility": [
"string"
],
"body_type": [
"string"
],
"hair_type": [
"string"
],
"query": "string",
"filters": {},
"page": 1,
"page_size": 20,
"disable_handle_pin": false
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | AISearchCreatorsRequest | true | none |
Example responses
200 Response
{
"data": [
{
"creator_name": "string",
"categories": [
"string"
],
"follower_count": 0,
"gmv": 0,
"shop_gmv": 0,
"post_rate": 0,
"engagement_rate": 0,
"average_views": 0,
"units_sold": 0,
"bio": "string",
"top_videos": [
{
"video_id": "string",
"tiktok_url": "string",
"views": 0,
"match_type": "string",
"snippet": "string"
}
],
"match_count": 0,
"match_score": 0
}
],
"pagination": {
"total": 0,
"page": 0,
"page_size": 0
},
"exact_handle_match": false,
"exact_handle": "string"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | AISearchCreatorsResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Search creators by what they say (transcript mode)
POST /ai-search/transcript
Find creators whose video transcripts match a natural-language phrase. match_sources selects spoken audio and/or on-screen text (defaults to audio). Matched videos carry match_type and a snippet. Requires a single x-shop-id; availability is gated per region.
Body parameter
{
"query": "string",
"match_sources": [
"audio"
],
"filters": {},
"page": 1,
"page_size": 20
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | AISearchTranscriptRequest | true | none |
Example responses
200 Response
{
"data": [
{
"creator_name": "string",
"categories": [
"string"
],
"follower_count": 0,
"gmv": 0,
"shop_gmv": 0,
"post_rate": 0,
"engagement_rate": 0,
"average_views": 0,
"units_sold": 0,
"bio": "string",
"top_videos": [
{
"video_id": "string",
"tiktok_url": "string",
"views": 0,
"match_type": "string",
"snippet": "string"
}
],
"match_count": 0,
"match_score": 0
}
],
"pagination": {
"total": 0,
"page": 0,
"page_size": 0
},
"exact_handle_match": false,
"exact_handle": "string"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | AISearchCreatorsResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Search creators by visual content (video mode)
POST /ai-search/video
Find creators whose video content matches a text description and/or a reference image. Supply query, a base64 image, or both (at least one is required). For binary file uploads use the multipart POST /ai-search/video/upload endpoint instead. Requires a single x-shop-id; availability is gated per region.
Body parameter
{
"query": "string",
"image": "string",
"filters": {},
"page": 1,
"page_size": 20
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | AISearchVideoRequest | true | none |
Example responses
200 Response
{
"data": [
{
"creator_name": "string",
"categories": [
"string"
],
"follower_count": 0,
"gmv": 0,
"shop_gmv": 0,
"post_rate": 0,
"engagement_rate": 0,
"average_views": 0,
"units_sold": 0,
"bio": "string",
"top_videos": [
{
"video_id": "string",
"tiktok_url": "string",
"views": 0,
"match_type": "string",
"snippet": "string"
}
],
"match_count": 0,
"match_score": 0
}
],
"pagination": {
"total": 0,
"page": 0,
"page_size": 0
},
"exact_handle_match": false,
"exact_handle": "string"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | AISearchCreatorsResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Find creators similar to seed creators (lookalike mode)
POST /ai-search/lookalike
Find creators similar to a seed set. Seed from any of: seed_creator_ids (handles or ids, up to 50), a seed_crm_group_id, a seed_list_id, or a text query. CRM group / list seeds are resolved to creators server-side, scoped to your shop. Seeds are excluded from the results. Requires a single x-shop-id; availability is gated per region.
Body parameter
{
"seed_creator_ids": [
"string"
],
"seed_crm_group_id": "string",
"seed_list_id": 0,
"query": "string",
"filters": {},
"page": 1,
"page_size": 20
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | AISearchLookalikeRequest | true | none |
Example responses
200 Response
{
"data": [
{
"creator_name": "string",
"categories": [
"string"
],
"follower_count": 0,
"gmv": 0,
"shop_gmv": 0,
"post_rate": 0,
"engagement_rate": 0,
"average_views": 0,
"units_sold": 0,
"bio": "string",
"top_videos": [
{
"video_id": "string",
"tiktok_url": "string",
"views": 0,
"match_type": "string",
"snippet": "string"
}
],
"match_count": 0,
"match_score": 0
}
],
"pagination": {
"total": 0,
"page": 0,
"page_size": 0
},
"exact_handle_match": false,
"exact_handle": "string"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | AISearchCreatorsResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Which AI-search modes are available for your shop
GET /ai-search/capabilities
Report which search modes are available for the caller's shop region. profile is always true; transcript / video / lookalike auto-enable per region as their indexes finish backfilling. Requires a single x-shop-id.
Example responses
200 Response
{
"region": "string",
"modes": {
"profile": true,
"transcript": true,
"video": true,
"lookalike": true
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | AISearchCapabilitiesResponse |
Export creator search results as CSV
POST /ai-search/export
Export up to 50,000 matching creators as CSV. The response is a streaming attachment; the X-Creator-Row-Count response header reports the actual row count. CSV only — XLSX is not supported on the public API. Requires a single x-shop-id. The CSV includes a numeric gmv column in US dollars (the exact GMV, same value /ai-search/creators returns) — parse THIS for GMV, not gmv_segment. To filter server-side by an exact GMV, set min_gmv / max_gmv (or a numeric range under filters.performance.gmv); it is honored the same way the portal search does — a $2,000 floor keeps everyone earning $2,000+ rather than dropping a whole band. NOTE (breaking change vs the old export): gmv_segment is no longer a band like "$1K-$5K" — it is now a rounded USD display figure (e.g. "$120", "$2.1K", "$1.9M") derived from gmv, so anything parsing it as a band must switch to the numeric gmv column. min_post_rate/max_post_rate (aka the automations endpoint's fulfillment_rate) are on a 0–100 scale, not 0–1.
Body parameter
{
"min_gmv": 0,
"max_gmv": 0,
"min_units_sold": 0,
"max_units_sold": 0,
"min_post_rate": 100,
"max_post_rate": 100,
"min_engagement_rate": 100,
"max_engagement_rate": 100,
"min_average_views": 0,
"max_average_views": 0,
"min_followers": 0,
"max_followers": 0,
"has_email": true,
"categories": [
"string"
],
"gender": [
"string"
],
"creator_ethnicity": [
"string"
],
"age_range": [
"string"
],
"community": [
"string"
],
"creator_level": [
"string"
],
"languages": [
"string"
],
"audience_age": [
"string"
],
"audience_gender": [
"string"
],
"content_style": [
"string"
],
"production_quality": [
"string"
],
"personality_tone": [
"string"
],
"face_visibility": [
"string"
],
"body_type": [
"string"
],
"hair_type": [
"string"
],
"query": "string",
"creator_ids": [
"string"
],
"filters": {}
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | AISearchExportRequest | true | none |
Example responses
422 Response
{
"detail": [
{
"loc": [
"string"
],
"msg": "string",
"type": "string"
}
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | None |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Valid AI-search filters for your region
GET /ai-search/filters
The filter vocabulary the /ai-search/* endpoints accept for your shop's region — call this before building a filters payload rather than guessing at keys or enum spellings.
filters maps each categorical field (product categories, follower age and gender, content language, production quality, face visibility, hasEmail, …) to its allowed {label, value} options. sliders gives the numeric ranges — min, max and step for averageViews, engagementRate, gmv, unitsSold, postRate and followers.
The response is region-stripped: a filter whose backing column has effectively no data in your region is omitted entirely, because applying it would return zero creators regardless of the range. postRate is absent for most non-US/UK regions and the community hashtag filter is absent where the hashtag pipeline hasn't tagged enough creators — treat anything missing here as unsupported for your shop.
Region comes from the shop, so this needs a single x-shop-id.
Example responses
200 Response
{
"region": "US",
"filters": {
"property1": [
{
"label": "string",
"value": "string"
}
],
"property2": [
{
"label": "string",
"value": "string"
}
]
},
"sliders": {
"property1": {
"min": 0,
"max": 0,
"step": 0
},
"property2": {
"min": 0,
"max": 0,
"step": 0
}
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | FiltersResponse |
Community-hashtag autocomplete
GET /ai-search/hashtags
Autocomplete for the community-hashtag filter: the hashtags creators in your region actually post under, each with the number of creators using it, ordered by that count.
Omit q for the most-used hashtags in the region — the head of the list, which is what the portal dropdown shows before you type. Pass q to substring-match (a leading # is optional and case is ignored). Feed the returned hashtag values into the community filter on /ai-search/creators.
limit caps the rows returned (max 100). Returns 404 for regions where the community filter is unavailable — the same regions where community is missing from GET /ai-search/filters.
Region comes from the shop, so this needs a single x-shop-id.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| q | query | any | false | Substring to match; omit for the region's top hashtags. |
| limit | query | integer | false | Maximum hashtags to return (max 100). |
Example responses
200 Response
{
"region": "US",
"query": "string",
"results": [
{
"hashtag": "string",
"creator_count": 0
}
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | HashtagAutocompleteResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Creator Messages
Read the shop's creator DM inbox (conversation list + per-conversation message threads, both paginated), read inbox unread/unreplied stats, and reply to creators programmatically (e.g. from an AI agent). Replies require the read_write scope and only work in conversations a creator has already opened.
List creator conversations
GET /creator-messages/conversations
The shop's creator DM inbox. Use unreplied_only=true to get conversations awaiting a reply (what an AI agent typically iterates).
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| offset | query | integer | false | none |
| limit | query | integer | false | none |
| unread_only | query | boolean | false | none |
| unreplied_only | query | boolean | false | none |
Example responses
200 Response
{
"data": [
{
"creator_handle": "string",
"last_message_text": "string",
"last_message_time": "string",
"last_message_sender": "string",
"unread_count": 0
}
],
"offset": 0,
"limit": 0,
"has_more": true,
"total_count": 0,
"unread_conversations": 0,
"unreplied_conversations": 0
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | CreatorConversationsResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Inbox unread and unreplied stats
GET /creator-messages/stats
Shop-level counts for the creator DM inbox: total conversations, conversations with unread messages, conversations awaiting a shop reply, and the total unread-message count (the badge number). unread_conversations counts conversations; unread_messages sums the unread messages inside them — they are NOT the same. For per-creator unread detail, page GET /conversations?unread_only=true.
Example responses
200 Response
{
"total_conversations": 0,
"unread_conversations": 0,
"unreplied_conversations": 0,
"unread_messages": 0,
"has_data": true
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | CreatorMessageStatsResponse |
Get the message thread with a creator
GET /creator-messages/conversations/{creator_handle}/messages
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| creator_handle | path | string | true | none |
| page | query | integer | false | none |
Example responses
200 Response
{
"creator_handle": "string",
"data": [
{
"id": 0,
"sender": "string",
"content_type": "string",
"text": "string",
"sent_at": "string",
"sent_via": "string",
"image": {
"url": "string",
"width": 0,
"height": 0
},
"product_card": {
"product_id": "string",
"product_name": "string",
"image_url": "string"
},
"target_collaboration_card": {
"invitation_group_id": "string"
},
"free_sample_card": {
"apply_id": "string"
},
"crm_text_with_image_card": {
"title": "string",
"content": "string",
"url": "string"
},
"crm_text_with_products_card": {
"title": "string",
"content": "string",
"products": [
{
"product_id": "string",
"product_name": "string",
"image_url": "string"
}
]
}
}
],
"page": 0,
"has_more": true,
"page_size": 0,
"total_count": 0,
"total_pages": 0,
"has_previous": false
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | CreatorMessagesResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Send a text reply to a creator
POST /creator-messages/conversations/{creator_handle}/reply
Sends a plain-text DM to the creator in an EXISTING conversation (the creator must have an open thread with the shop — TikTok does not allow cold-opening a DM). Idempotency-Key required. X-Dry-Run: true validates and echoes without contacting TikTok.
Body parameter
{
"message": "string"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| creator_handle | path | string | true | none |
| Idempotency-Key | header | any | false | none |
| X-Dry-Run | header | any | false | none |
| body | body | CreatorReplyRequest | true | none |
Example responses
200 Response
{
"dry_run": true,
"would_send_to": "string",
"message": "string"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Dry-run — validated and echoed, nothing sent. | CreatorReplyDryRunResponse |
| 201 | Created | Reply sent to the creator. | CreatorReplyResponse |
| 400 | Bad Request | Invalid request. | None |
| 403 | Forbidden | API key lacks read_write scope (WRITE_NOT_PERMITTED). |
None |
| 404 | Not Found | No existing conversation with this creator for the shop. | None |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
| 429 | Too Many Requests | Write rate limit exceeded. | None |
| 502 | Bad Gateway | TikTok rejected or failed the send. | None |
Send an image reply to a creator
POST /creator-messages/conversations/{creator_handle}/reply/image
Send a TikTok IMAGE message. Provide an HTTPS image_url; we fetch it server-side, upload to TikTok, and dispatch into the existing conversation. Same auth/scope/idempotency/rate-limit/X-Dry-Run semantics as the text reply. v1: no caption (send a text reply separately if you also want copy).
Body parameter
{
"image_url": "stringstri"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| creator_handle | path | string | true | none |
| Idempotency-Key | header | any | false | none |
| X-Dry-Run | header | any | false | none |
| body | body | CreatorReplyImageRequest | true | none |
Example responses
200 Response
{
"dry_run": true,
"would_send_to": "string",
"image_url": "string"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Dry-run — validated and echoed, nothing fetched or sent. | CreatorReplyImageDryRunResponse |
| 201 | Created | Image uploaded to TikTok and reply sent to the creator. | CreatorReplyImageResponse |
| 400 | Bad Request | Invalid image_url (scheme, IP, content-type, or size). | None |
| 403 | Forbidden | API key lacks read_write scope. |
None |
| 404 | Not Found | No existing conversation with this creator. | None |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
| 429 | Too Many Requests | Write rate limit exceeded. | None |
| 502 | Bad Gateway | Image fetch failed, or TikTok rejected the send. | None |
Send a product-card reply to a creator
POST /creator-messages/conversations/{creator_handle}/reply/product
Send a TikTok PRODUCT_CARD message linking one of THIS shop's products. We verify the product_id belongs to the shop's catalog. Same auth/scope/idempotency/rate-limit/X-Dry-Run semantics as the text reply. No caption (send a text reply separately for copy).
Body parameter
{
"product_id": "string"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| creator_handle | path | string | true | none |
| Idempotency-Key | header | any | false | none |
| X-Dry-Run | header | any | false | none |
| body | body | CreatorReplyProductRequest | true | none |
Example responses
200 Response
{
"dry_run": true,
"would_send_to": "string",
"product_id": "string"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Dry-run — validated and echoed, nothing sent. | CreatorReplyProductDryRunResponse |
| 201 | Created | Product card sent to the creator. | CreatorReplyProductResponse |
| 400 | Bad Request | Invalid request, or product_id not in this shop's catalog. | None |
| 403 | Forbidden | API key lacks read_write scope. |
None |
| 404 | Not Found | No existing conversation with this creator. | None |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
| 429 | Too Many Requests | Write rate limit exceeded. | None |
| 502 | Bad Gateway | TikTok rejected or failed the send. | None |
Stage a draft reply on a creator conversation
POST /creator-messages/draft
Persist a reply on the conversation WITHOUT delivering it to the creator. The draft surfaces in the Reacher inbox for a human to review and either send via the existing /reply* endpoints or discard via DELETE /drafts/{id}. Idempotency-Key required. X-Dry-Run: true validates and echoes without persisting.
Body parameter
{
"creator_handle": "string",
"text": "string",
"image_url": "stringstri",
"product_id": "string"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| Idempotency-Key | header | any | false | none |
| X-Dry-Run | header | any | false | none |
| body | body | CreateDraftRequest | true | none |
Example responses
200 Response
{
"dry_run": true,
"would_create_for_handle": "string",
"content_type": "string",
"text": "string",
"image_url": "string",
"product_id": "string"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Dry-run — validated and echoed, nothing persisted. | CreateDraftDryRunResponse |
| 201 | Created | Draft staged on the conversation. | CreateDraftResponse |
| 400 | Bad Request | Invalid body (multiple content fields set, none set, etc.). | None |
| 403 | Forbidden | API key lacks read_write scope. |
None |
| 404 | Not Found | No existing conversation with this creator for the shop. | None |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
| 429 | Too Many Requests | Write rate limit exceeded. | None |
List staged drafts on a conversation
GET /creator-messages/conversations/{creator_handle}/drafts
Drafts for the given creator on this shop, newest first. Drafts only — does NOT return sent messages (see GET /conversations/{handle}/messages for those).
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| creator_handle | path | string | true | none |
| page | query | integer | false | none |
| page_size | query | integer | false | none |
Example responses
200 Response
{
"data": [
{
"id": 0,
"conversation_id": 0,
"content_type": "string",
"text_content": "string",
"payload": {},
"created_at": "string",
"expires_at": "string",
"created_by_api_key_id": 0
}
],
"page": 0,
"page_size": 0,
"total": 0,
"has_more": true
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | DraftListResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Discard a staged draft
DELETE /creator-messages/drafts/{draft_id}
Remove a draft by id. 404 if the id is unknown, 403 if the draft belongs to a different shop than the caller's x-shop-id. Idempotency-Key is NOT required for delete (delete is naturally idempotent — a second DELETE just returns 404).
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| draft_id | path | integer | true | none |
| X-Dry-Run | header | any | false | none |
Example responses
422 Response
{
"detail": [
{
"loc": [
"string"
],
"msg": "string",
"type": "string"
}
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Dry-run — validated and echoed, nothing deleted. | None |
| 204 | No Content | Draft removed. | None |
| 403 | Forbidden | API key lacks read_write scope, or draft belongs to a different shop. |
None |
| 404 | Not Found | Draft not found. | None |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
| 429 | Too Many Requests | Write rate limit exceeded. | None |
Send a staged draft to the creator
POST /creator-messages/drafts/{draft_id}/send
Deliver a previously staged draft to the creator and remove it. This is the confirm step of a draft-then-confirm flow: the message body comes from the draft row, never from this request, so what the operator reviewed is what is sent. The draft is claimed (removed) before the send so the same id cannot go out twice, even from two concurrent requests; a draft TikTok refuses (including the daily / weekly messaging caps, returned as 429) is put back for the inbox. Idempotency-Key required. X-Dry-Run: true resolves the draft and checks ownership without contacting TikTok.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| draft_id | path | integer | true | none |
| Idempotency-Key | header | any | false | none |
| X-Dry-Run | header | any | false | none |
Example responses
200 Response
{
"dry_run": true,
"would_send_draft_id": 0,
"conversation_id": 0,
"content_type": "string",
"text": "string",
"image_url": "string",
"product_id": "string"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Dry-run — draft resolved and echoed, nothing sent. | SendDraftDryRunResponse |
| 201 | Created | Draft delivered to the creator and removed. | SendDraftResponse |
| 400 | Bad Request | Draft content is no longer sendable (e.g. product left the catalog, image URL rejected), or the Idempotency-Key is missing. | None |
| 403 | Forbidden | API key lacks read_write scope, or the draft belongs to a different shop. |
None |
| 404 | Not Found | Draft not found, expired, already sent, or discarded. | None |
| 409 | Conflict | Idempotency conflict, or another request is sending this draft right now (DRAFT_ALREADY_CLAIMED). |
None |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
| 429 | Too Many Requests | Write rate limit exceeded, or TikTok's daily / weekly messaging cap reached (the draft is kept). | None |
| 502 | Bad Gateway | SEND_FAILED: the send did not go through and the draft is kept; SEND_FAILED_DRAFT_LOST: it did not go through and the draft could not be put back; IMAGE_FETCH_FAILED: the draft's image URL could not be fetched; SENT_NOT_RECORDED: TikTok accepted it but Reacher could not record it (the draft is consumed; do not resend). |
None |
Campaigns
Create and manage Creator Community Campaigns — Retainer, Challenge, Leaderboard, and Live GMV Challenge types. Full surface: CRUD, creator accept/reject/reactivate/remove, cross-shop add-to-campaign (move) with region + same-customer guards, content tracking, request-more-content, deposit-intent + settlement with full idempotency + dry-run + audit logging on the money-moving path.
List campaigns
GET /campaigns
Paginated list of the shop's creator campaigns with status/type filters and sortable columns. Returns counts per status tab (all/active/past/draft) and per type (retainer/challenge/leaderboard).
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| page | query | integer | false | none |
| page_size | query | integer | false | none |
| status | query | any | false | UI alias: 'active' (= published), 'past' (= ended), 'draft' (= unpublished drafts), or 'archived'. |
| campaign_type | query | any | false | Filter: retainer |
| search | query | any | false | none |
| date_from | query | any | false | YYYY-MM-DD; start_date >= date_from |
| date_to | query | any | false | YYYY-MM-DD; end_date <= date_to |
| sort_by | query | any | false | campaign_name |
| sort_order | query | string | false | none |
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Response Schema
Create a campaign
POST /campaigns
Create a Retainer / Challenge / Leaderboard / Live GMV Challenge campaign. X-Dry-Run: true validates the body and echoes what would be submitted without writing any rows. Image fields take HTTPS URL strings — host the image yourself and pass the URL.
The 201 response includes an invite_link field — the public URL the caller can share with creators to bring them into the campaign. Subdomain is picked by creator_source: legacy social_army campaigns use https://soco.reacherapp.com; everything else (my_community, etc.) uses https://creator.reacherapp.com. Full pattern: {base}/campaigns/{shop_id}/{uuid_id}. Every campaign endpoint that returns a campaign payload carries the same field — POST, GET list, GET single, GET detail — so callers can lift it directly without constructing the URL themselves.
Body parameter
{
"campaign_name": "string",
"campaign_type": "retainer",
"creator_source": "my_community",
"start_date": "string",
"end_date": "string",
"description": "string",
"status": "published",
"pricing": {
"campaign_type": "retainer",
"posts": 1,
"payment_per_creator": 0,
"reward_type": "cash",
"metric_type": "gmv",
"minimum_gmv_required": 0,
"minimum_gmv_required_enabled": false,
"minimum_views_required": 0,
"minimum_views_required_enabled": false,
"minimum_videos_required": 0
},
"products": {
"all_selected": false,
"items": [
{
"product_id": "string",
"tap_link": "string",
"product_name": "string"
}
],
"use_first_product_image": true,
"custom_image": "string",
"campaign_image": "string"
},
"creators": [
{
"property1": "string",
"property2": "string"
}
],
"window_url": "string",
"is_available_to_all": false,
"requires_approval": false,
"exclusive_participation": false,
"creator_level": [
"string"
],
"support_email": "string",
"short_header_message": "string",
"content_guidelines": {
"property1": [
"string"
],
"property2": [
"string"
]
},
"inspiration_links": [
"string"
],
"has_tiered_payout": false,
"payout_structure": {},
"grace_period": 365,
"reminders": {
"enabled": false,
"message_before_3_days": "string",
"message_before_1_day": "string"
},
"email_templates": {
"enabled": true,
"application": {},
"acceptance": {},
"rejection": {}
}
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| Idempotency-Key | header | any | false | none |
| X-Dry-Run | header | any | false | none |
| body | body | CampaignCreateRequest | true | none |
Example responses
201 Response
{
"campaign_id": 0,
"uuid_id": "string",
"status": "created",
"invite_link": "string"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Dry-run echo (no campaign created). | None |
| 201 | Created | Successful Response | CampaignCreatedResponse |
| 400 | Bad Request | Invalid request. | None |
| 403 | Forbidden | API key lacks read_write scope. |
None |
| 409 | Conflict | Idempotency-Key conflict. | None |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
| 429 | Too Many Requests | Write rate limit exceeded. | None |
List managed creators across all campaigns
GET /campaigns/creators
All creators currently linked to the shop's campaigns. Includes overview metrics (total creators, multi-campaign creators, overall Return-On-Campaign-Spend) plus a paginated per-creator list.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| page | query | integer | false | none |
| page_size | query | integer | false | none |
| search | query | any | false | none |
| sort_by | query | any | false | none |
| sort_order | query | string | false | none |
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Response Schema
List shop-wide creator content
GET /campaigns/content
All videos posted by creators across the shop's campaigns. Returns overview metrics (total posts, views, orders, GMV, wallet balance) plus a paginated content list. Use the campaign-detail endpoint for a campaign-scoped view.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| page | query | integer | false | none |
| page_size | query | integer | false | none |
| search | query | any | false | none |
| sort_by | query | any | false | none |
| sort_order | query | string | false | none |
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Response Schema
Get marketplace wallet balance
GET /campaigns/payments/wallet-balance
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
Response Schema
Payment / settlement history
GET /campaigns/payments/history
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| page | query | integer | false | none |
| page_size | query | integer | false | none |
| search | query | any | false | none |
| sort_by | query | any | false | none |
| sort_order | query | string | false | none |
Example responses
200 Response
{
"overview": {
"property1": {
"value": 0,
"description": "string"
},
"property2": {
"value": 0,
"description": "string"
}
},
"data": [
{
"creator_name": "string",
"campaign_name": "",
"paid_amount": "string",
"reward_type": "cash",
"paid_at": "string",
"note": "",
"tiktok_username": "string",
"currency": "USD"
}
],
"pagination": {
"page": 0,
"page_size": 0,
"total_count": 0,
"total_pages": 0
},
"currency": "USD"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Settled payments, newest first. Every amount — the rows and the overview balance — is denominated in currency. |
PaymentHistoryResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Wallet deposit history
GET /campaigns/payments/deposits
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| page | query | integer | false | none |
| page_size | query | integer | false | none |
| sort_by | query | any | false | none |
| sort_order | query | string | false | none |
Example responses
200 Response
{
"overview": {
"property1": {
"value": 0,
"description": "string"
},
"property2": {
"value": 0,
"description": "string"
}
},
"data": [
{
"date": "string",
"amount": "string"
}
],
"pagination": {
"page": 0,
"page_size": 0,
"total_count": 0,
"total_pages": 0
},
"currency": "USD"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Wallet deposits, newest first. Every amount — the rows and the overview total — is denominated in currency. |
DepositHistoryResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Get one campaign (edit-view shape)
GET /campaigns/{campaign_id}
Returns the campaign in the same shape PATCH /campaigns/{id} accepts.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| campaign_id | path | integer | true | none |
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Response Schema
Update an existing campaign
PATCH /campaigns/{campaign_id}
Modify campaign fields. campaign_type and creator_source are immutable post-create — pass them and you'll get 400 IMMUTABLE_FIELD.
Body parameter
{
"campaign_name": "string",
"start_date": "string",
"end_date": "string",
"description": "string",
"status": "published",
"pricing": {
"campaign_type": "retainer",
"posts": 1,
"payment_per_creator": 0,
"reward_type": "cash",
"metric_type": "gmv",
"minimum_gmv_required": 0,
"minimum_gmv_required_enabled": false,
"minimum_views_required": 0,
"minimum_views_required_enabled": false,
"minimum_videos_required": 0
},
"products": {
"all_selected": false,
"items": [
{
"product_id": "string",
"tap_link": "string",
"product_name": "string"
}
],
"use_first_product_image": true,
"custom_image": "string",
"campaign_image": "string"
},
"creators": [
{
"property1": "string",
"property2": "string"
}
],
"window_url": "string",
"is_available_to_all": true,
"requires_approval": true,
"exclusive_participation": true,
"creator_level": [
"string"
],
"support_email": "string",
"short_header_message": "string",
"content_guidelines": {
"property1": [
"string"
],
"property2": [
"string"
]
},
"inspiration_links": [
"string"
],
"has_tiered_payout": true,
"payout_structure": {},
"grace_period": 365,
"reminders": {
"enabled": false,
"message_before_3_days": "string",
"message_before_1_day": "string"
},
"email_templates": {
"enabled": true,
"application": {},
"acceptance": {},
"rejection": {}
}
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| campaign_id | path | integer | true | none |
| Idempotency-Key | header | any | false | none |
| X-Dry-Run | header | any | false | none |
| body | body | CampaignUpdateRequest | true | none |
Example responses
200 Response
{
"campaign_id": 0,
"status": "updated",
"participant_sync": {
"applies_to": "string",
"fields": [
"string"
],
"updated": 0,
"unchanged": 0,
"skipped_paid": 0
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | CampaignUpdatedResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Soft-delete a campaign
DELETE /campaigns/{campaign_id}
Sets status='deleted'. The row remains in the DB but is hidden from list/detail views. Idempotent.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| campaign_id | path | integer | true | none |
| Idempotency-Key | header | any | false | none |
| X-Dry-Run | header | any | false | none |
Example responses
200 Response
{
"campaign_id": 0,
"status": "deleted"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | CampaignDeletedResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Get the full campaign detail view
GET /campaigns/{campaign_id}/detail
Full campaign detail: campaign metadata, applied/active creators with stage + payment-due + per-creator actions, aggregated stats (GMV, views, orders, payouts), and a content snippet. Equivalent to what the portal's campaign-detail page renders.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| campaign_id | path | integer | true | none |
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Response Schema
Get ranked leaderboard standings for a campaign
GET /campaigns/{campaign_id}/leaderboard
Ranked creator standings for a Leaderboard (contest) campaign: each creator's rank, weighted composite_score with a per-metric score_breakdown, and the raw GMV / views / videos / units stats. When the campaign has a currently-live (or recently-ended) micro-challenge, its windowed blitz board is nested under micro_challenge. Standings are paginated; total_creators is the full participant count. Scores come from the same shared scorer the dashboard and public share page use, so ranks agree across every surface. Single-shop only (the shop sets the response currency).
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| campaign_id | path | integer | true | none |
| page | query | integer | false | Page number (1-indexed). |
| page_size | query | integer | false | Standings per page (max 100). |
Example responses
200 Response
{
"campaign_id": 0,
"campaign_name": "",
"scoring_mode": "single",
"metric_type": "gmv",
"weighted_metrics": [
{}
],
"start_date": "string",
"end_date": "string",
"currency_code": "USD",
"currency_symbol": "$",
"standings": [
{
"rank": 0,
"creator_id": "string",
"handle": "string",
"creator_name": "string",
"avatar_url": "string",
"composite_score": 0,
"score_breakdown": [
{
"metric_type": "string",
"weight": 0,
"contribution": 0,
"raw_value": 0
}
],
"gmv": 0,
"views": 0,
"videos_posted": 0,
"units_sold": 0,
"avg_views_per_post": 0,
"live_gmv": 0,
"live_session_count": 0,
"combined_gmv": 0,
"frozen": false
}
],
"micro_challenge": {
"micro_campaign_id": 0,
"name": "",
"window_start_at": "string",
"window_end_at": "string",
"status": "live",
"scoring_mode": "single",
"metric_type": "gmv",
"standings": [
{
"rank": 0,
"creator_id": "string",
"handle": "string",
"creator_name": "string",
"avatar_url": "string",
"composite_score": 0,
"score_breakdown": [
{
"metric_type": "string",
"weight": 0,
"contribution": 0,
"raw_value": 0
}
],
"gmv": 0,
"views": 0,
"videos_posted": 0,
"units_sold": 0,
"avg_views_per_post": 0,
"live_gmv": 0,
"live_session_count": 0,
"combined_gmv": 0,
"frozen": false
}
]
},
"total_creators": 0,
"standings_frozen": false,
"standings_frozen_at": "string",
"standings_frozen_reason": "string",
"standings_period_end": "string",
"values_windowed": true,
"as_of": "string",
"pagination": {
"page": 0,
"page_size": 0,
"total_count": 0,
"total_pages": 0
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | CampaignLeaderboardResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Accept a creator into a campaign
POST /campaigns/{campaign_id}/creators/{creator_id}/accept
Sets the creator's CampaignCreatorMapping.status='active'. Sends an acceptance email + SMS to the creator (fire-and-forget) — these are SKIPPED on X-Dry-Run: true.
Body parameter
{
"message": "string"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| campaign_id | path | integer | true | none |
| creator_id | path | integer | true | none |
| Idempotency-Key | header | any | false | none |
| X-Dry-Run | header | any | false | none |
| body | body | any | false | none |
Example responses
200 Response
{
"success": true,
"code": "ok",
"data": {}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | CreatorStateChangeResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Reject a creator from a campaign
POST /campaigns/{campaign_id}/creators/{creator_id}/reject
Sets CampaignCreatorMapping.status='rejected'. Sends a rejection email + SMS to the creator (fire-and-forget) — SKIPPED on dry-run.
Body parameter
{
"message": "string"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| campaign_id | path | integer | true | none |
| creator_id | path | integer | true | none |
| Idempotency-Key | header | any | false | none |
| X-Dry-Run | header | any | false | none |
| body | body | any | false | none |
Example responses
200 Response
{
"success": true,
"code": "ok",
"data": {}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | CreatorStateChangeResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Reactivate a previously-rejected creator
POST /campaigns/{campaign_id}/creators/{creator_id}/reactivate
Reverses a reject: status goes back to active. No new notification is sent.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| campaign_id | path | integer | true | none |
| creator_id | path | integer | true | none |
| Idempotency-Key | header | any | false | none |
| X-Dry-Run | header | any | false | none |
Example responses
200 Response
{
"success": true,
"code": "ok",
"data": {}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | CreatorStateChangeResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Remove a creator from a campaign
POST /campaigns/creators/{creator_id}/remove
Removes the creator from ONE campaign (terminal removed status). The campaign lives in the x-shop-id shop; pass its id in the body. Removed creators disappear from the creator's portal views.
Paid/completed creators are blocked (409) — their payout ledger is preserved and never overwritten.
Idempotent: removing an already-removed creator returns 200 with code='already_removed' (no error). Combined with the Idempotency-Key replay, repeated calls are always safe.
X-Dry-Run: true validates + echoes the intended action without writing or sending the optional SMS.
Body parameter
{
"campaign_id": 0,
"message": "string"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| creator_id | path | integer | true | none |
| Idempotency-Key | header | any | false | none |
| X-Dry-Run | header | any | false | none |
| body | body | any | false | none |
Example responses
200 Response
{
"success": true,
"code": "ok",
"data": {}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Removed (or idempotent already-removed). | RemoveCreatorResponse |
| 400 | Bad Request | Invalid request / missing single shop. | None |
| 403 | Forbidden | API key lacks read_write scope. |
None |
| 404 | Not Found | Mapping/campaign not in this shop, or shop not owned by the key's customer. | None |
| 409 | Conflict | Paid/completed creator (ledger preserved), or Idempotency-Key conflict. | None |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
| 429 | Too Many Requests | Write rate limit exceeded. | None |
Add a creator to another campaign (move)
POST /campaigns/creators/{creator_id}/add-to-campaign
Adds the creator to a target campaign — purely additive (never removes them from the source campaign). The SOURCE shop is your x-shop-id; the TARGET shop + campaign are in the body.
Restrictions:
- Region — the target shop must be region-compatible with the source shop. GLOBAL and US are interchangeable; every other region must match exactly. Mismatch → 409.
- Same customer — the target shop must belong to your API key's customer (cross-customer target → opaque 404).
- No double-add — if the creator is already ACTIVE (or paid/completed) in the target → 409. A passive/terminal-inactive mapping (viewed/pending/invited/applied/removed/rejected/archived/withdrawn) is UPGRADED to active with NO duplicate row (
pg_advisory_xact_lockguards it; apaid_atrow is never overwritten).
Rewards are recomputed server-side from the TARGET campaign. notify (default true) sends the creator an acceptance-style notification — SKIPPED on X-Dry-Run.
Body parameter
{
"target_campaign_id": 0,
"target_shop_id": 0,
"notify": true
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| creator_id | path | integer | true | none |
| Idempotency-Key | header | any | false | none |
| X-Dry-Run | header | any | false | none |
| body | body | AddToCampaignRequest | true | none |
Example responses
200 Response
{
"success": true,
"code": "ok",
"data": {}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Added or upgraded to active. | AddToCampaignResponse |
| 400 | Bad Request | Invalid request / missing single shop / target campaign not available. | None |
| 403 | Forbidden | API key lacks read_write scope, or creator not on the source shop's roster. |
None |
| 404 | Not Found | Target shop/campaign not found, or not owned by the key's customer. | None |
| 409 | Conflict | Region mismatch, already-active in target, or Idempotency-Key conflict. | None |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
| 429 | Too Many Requests | Write rate limit exceeded. | None |
Get a single video's full detail by id
POST /campaigns/content/view
Body parameter
{
"video_id": "string"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | ViewVideoContentRequest | true | none |
Example responses
200 Response
{
"status": "success",
"data": [
{}
],
"count": 0
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | VideoContentResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
List a creator-campaign mapping's posted videos
POST /campaigns/content/tracker-vids
Used by the settlement screen to enumerate the videos a creator posted under a specific campaign.
Body parameter
{
"campaign_creator_mapping_id": 0
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | TrackerVideosRequest | true | none |
Example responses
200 Response
{
"status": "success",
"data": [
{}
],
"count": 0
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | TrackerVideosResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Archive a creator's content tracker
POST /campaigns/content/archive
Soft-deletes a CampaignCreatorMapping's content tracker so it no longer surfaces in campaign content lists.
Body parameter
{
"campaign_creator_mapping_id": 0
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| Idempotency-Key | header | any | false | none |
| X-Dry-Run | header | any | false | none |
| body | body | ArchiveTrackerRequest | true | none |
Example responses
200 Response
{
"status": "string",
"message": "string"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | ArchiveTrackerResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Request more content from a creator
POST /campaigns/content/request-more
Updates the creator's posts requirement and minimum GMV target on their CampaignCreatorMapping, then fires a notification (email + SMS) asking for additional posts — notifications SKIPPED on dry-run.
Body parameter
{
"creator_id": 0,
"campaign_creator_mapping_id": 0,
"campaign_id": 0,
"additional_posts": 1,
"new_total_payout": 0,
"minimum_gmv_target": 0,
"tiktok_username": "string",
"creator_status": "pending"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| Idempotency-Key | header | any | false | none |
| X-Dry-Run | header | any | false | none |
| body | body | RequestMoreContentRequest | true | none |
Example responses
200 Response
{
"status": "success"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | RequestMoreContentResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Create a Stripe Checkout session to top up the marketplace wallet
POST /campaigns/payments/deposit-intent
Returns a Stripe Checkout session_id + redirect_url. Creating the intent does NOT move money — money moves only when the user completes the hosted checkout. X-Dry-Run: true validates the body without calling Stripe.
Body parameter
{
"amount": 100000,
"currency": "USD",
"success_url": "string",
"cancel_url": "string"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| Idempotency-Key | header | any | false | none |
| X-Dry-Run | header | any | false | none |
| body | body | CreateDepositIntentRequest | true | none |
Example responses
201 Response
{
"session_id": "string",
"redirect_url": "string"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 201 | Created | Successful Response | DepositIntentResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Settle a creator payment
POST /campaigns/payments/settle
Triggers a real Stripe transfer + wallet debit when reward_type='cash'. reward_type='custom' records the settlement only — no money moves. Idempotency-Key is REQUIRED and the inner PaymentService.settle runs claim/release semantics so a retry with the same key can never double-pay. Every successful settlement emits an audit.campaigns.settle log line for on-call reconciliation. X-Dry-Run: true skips the Stripe call entirely.
Body parameter
{
"creator_id": 0,
"campaign_id": 0,
"amount": 100000,
"currency": "str",
"reward_type": "string",
"campaign_creator_mapping_id": 0,
"metadata": {}
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| Idempotency-Key | header | any | false | none |
| X-Dry-Run | header | any | false | none |
| body | body | SettlePaymentRequest | true | none |
Example responses
201 Response
{
"success": true,
"transfer_id": "string",
"amount": 0,
"currency": "string",
"paid_at": "string",
"wallet_balance": 0
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 201 | Created | Successful Response | SettlementResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Archive a campaign
POST /campaigns/{campaign_id}/archive
Sets status='archived' — preserves the row in list/detail views but marks it as no longer active.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| campaign_id | path | integer | true | none |
| Idempotency-Key | header | any | false | none |
| X-Dry-Run | header | any | false | none |
Example responses
200 Response
{
"campaign_id": 0,
"status": "archived"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | CampaignArchivedResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
List campaign creators' Discord handles
GET /campaigns/creators/discord
For creators linked to your Creator Community campaigns, returns each creator's TikTok handle alongside their linked Discord handle — so you can match Discord server members to the TikTok Shop creators you work with.
One row per (campaign, creator): a creator in several of your campaigns appears once per campaign, with campaign_id / campaign_name for context. Discord is creator-provided and optional; by default only creators who have linked a Discord account are returned. Set with_discord_only=false to include creators without one (discord_handle and discord_user_id will be null).
By default every currently-linked creator is returned except those rejected / removed / withdrawn from a campaign; pass active_only=true to restrict to creators accepted into a campaign (active or settled). Single shop only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| page | query | integer | false | Page number (1-indexed). |
| page_size | query | integer | false | Rows per page (max 100). |
| campaign_id | query | any | false | Restrict to a single campaign you own. Must belong to the shop in x-shop-id, otherwise the result is simply empty. |
| with_discord_only | query | boolean | false | Return only creators who have linked a Discord account. Set false to include creators without one (their Discord fields are null). |
| active_only | query | boolean | false | Restrict to creators accepted into a campaign (active or settled). Default returns all linked creators except rejected / removed / withdrawn. |
Example responses
200 Response
{
"data": [
{
"tiktok_handle": "string",
"discord_handle": "string",
"discord_user_id": "string",
"campaign_id": 0,
"campaign_name": "string"
}
],
"pagination": null
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | CampaignCreatorDiscordResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Social Intelligence
Market intelligence across the TikTok Shop ecosystem — sellers, products, creators, videos, benchmarks. These endpoints require Social Intelligence access to be enabled for your account — contact Reacher to request access.
Seller category taxonomy
GET /social-intelligence/sellers/categories
List all seller (brand) categories and subcategories on TikTok Shop.
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
Response Schema
List sellers (brands) on TikTok Shop
GET /social-intelligence/sellers
Paginated list of sellers across the TikTok Shop ecosystem. Filter by category, search by name, sort by gmv28d, gmvAllTime, etc. Includes a yourBrand field showing your shop's rank in the same list.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| page | query | integer | false | none |
| page_size | query | integer | false | none |
| search | query | any | false | none |
| category | query | any | false | none |
| subcategory | query | any | false | none |
| sort_by | query | any | false | e.g. gmv28d, gmvAllTime, creators, videos, rating |
| sort_order | query | string | false | none |
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Response Schema
Get seller detail
GET /social-intelligence/sellers/{seller_id}
Detailed metrics for a single seller (brand) on TikTok Shop.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| seller_id | path | string | true | none |
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Response Schema
List creators selling for a seller
GET /social-intelligence/sellers/{seller_id}/creators
Creators who have driven GMV for this seller. Filter by GMV, follower count, shop posts, post rate, demographic categories.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| seller_id | path | string | true | none |
| page | query | integer | false | none |
| page_size | query | integer | false | none |
| search | query | any | false | none |
| sort_by | query | any | false | gmv28d, followers, shopPosts, postRate, engagement |
| sort_order | query | string | false | none |
| min_gmv | query | any | false | none |
| max_gmv | query | any | false | none |
| min_gmv_28d | query | any | false | none |
| max_gmv_28d | query | any | false | none |
| min_followers | query | any | false | none |
| max_followers | query | any | false | none |
| min_units_sold | query | any | false | none |
| max_units_sold | query | any | false | none |
| min_post_rate | query | any | false | none |
| max_post_rate | query | any | false | none |
| min_shop_posts | query | any | false | none |
| max_shop_posts | query | any | false | none |
| categories | query | any | false | Comma-separated category names |
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Response Schema
List products from a seller
GET /social-intelligence/sellers/{seller_id}/products
All products in this seller's catalog with sales metrics.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| seller_id | path | string | true | none |
| page | query | integer | false | none |
| page_size | query | integer | false | none |
| search | query | any | false | none |
| sort_by | query | any | false | gmv28d, unitsSold, rating, creators, videos |
| sort_order | query | string | false | none |
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Response Schema
List videos for a seller
GET /social-intelligence/sellers/{seller_id}/videos
Videos featuring products from this seller. Includes AI-analyzed content tags (hookType, sellingPoints, contentAnalysis) for top performers.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| seller_id | path | string | true | none |
| page | query | integer | false | none |
| page_size | query | integer | false | none |
| search | query | any | false | none |
| sort_by | query | any | false | gmv, views, likes, engagement, date |
| sort_order | query | string | false | none |
| time_range | query | any | false | Predefined window. Use start_date/end_date for custom ranges. |
| min_gmv | query | any | false | none |
| max_gmv | query | any | false | none |
| start_date | query | any | false | none |
| end_date | query | any | false | none |
| min_engagement | query | any | false | none |
| max_engagement | query | any | false | none |
| min_views | query | any | false | none |
| max_views | query | any | false | none |
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Response Schema
Product category taxonomy
GET /social-intelligence/products/categories
List all product categories and subcategories on TikTok Shop.
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
Response Schema
List products on TikTok Shop
GET /social-intelligence/products
Paginated list of products across the TikTok Shop ecosystem. Filter by category, search by name, sort by gmv28d, unitsSold, etc.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| page | query | integer | false | none |
| page_size | query | integer | false | none |
| search | query | any | false | none |
| category | query | any | false | none |
| subcategory | query | any | false | none |
| sort_by | query | any | false | gmv28d, unitsSold, rating, creators, videos |
| sort_order | query | string | false | none |
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Response Schema
Export products
GET /social-intelligence/products/export
Export the product list in one call — same filters as GET /products, but without pagination. Returns JSON rows by default; pass format=csv for a downloadable file.
Capped at 1000 rows for most customers; truncated: true in the JSON response means the cap clipped the result. Consumes one of the shop's daily exports, a quota shared with portal exports.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| format | query | string | false | Output format. json returns rows; csv returns a downloadable file. |
| search | query | any | false | none |
| category | query | any | false | none |
| subcategory | query | any | false | none |
| sort_by | query | any | false | gmv28d, unitsSold, rating, creators, videos |
| sort_order | query | string | false | none |
Example responses
200 Response
{
"data": [
null
],
"row_count": 0,
"row_limit": 0,
"truncated": true,
"columns": [
"string"
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | SiExportResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Export creators selling a product
GET /social-intelligence/products/{product_id}/creators/export
Export every creator driving GMV for a product — same filters as GET /products/{product_id}/creators, without pagination. JSON rows by default; format=csv for a file. Consumes one daily export.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| product_id | path | string | true | none |
| format | query | string | false | Output format. json returns rows; csv returns a downloadable file. |
| search | query | any | false | none |
| sort_by | query | any | false | gmv28d, followers, shopPosts, postRate |
| sort_order | query | string | false | none |
| seller_id | query | any | false | none |
| min_gmv | query | any | false | none |
| max_gmv | query | any | false | none |
| min_gmv_28d | query | any | false | none |
| max_gmv_28d | query | any | false | none |
| min_followers | query | any | false | none |
| max_followers | query | any | false | none |
| min_units_sold | query | any | false | none |
| max_units_sold | query | any | false | none |
| min_post_rate | query | any | false | none |
| max_post_rate | query | any | false | none |
| min_shop_posts | query | any | false | none |
| max_shop_posts | query | any | false | none |
| categories | query | any | false | Comma-separated category names |
Example responses
200 Response
{
"data": [
null
],
"row_count": 0,
"row_limit": 0,
"truncated": true,
"columns": [
"string"
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | SiExportResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Export a seller's creators
GET /social-intelligence/sellers/{seller_id}/creators/export
Export every creator working with a seller — same filters as GET /sellers/{seller_id}/creators, without pagination. JSON rows by default; format=csv for a file. Consumes one daily export.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| seller_id | path | string | true | none |
| format | query | string | false | Output format. json returns rows; csv returns a downloadable file. |
| search | query | any | false | none |
| sort_by | query | any | false | gmv28d, followers, shopPosts, postRate |
| sort_order | query | string | false | none |
| min_gmv | query | any | false | none |
| max_gmv | query | any | false | none |
| min_gmv_28d | query | any | false | none |
| max_gmv_28d | query | any | false | none |
| min_followers | query | any | false | none |
| max_followers | query | any | false | none |
| min_units_sold | query | any | false | none |
| max_units_sold | query | any | false | none |
| min_post_rate | query | any | false | none |
| max_post_rate | query | any | false | none |
| min_shop_posts | query | any | false | none |
| max_shop_posts | query | any | false | none |
| categories | query | any | false | Comma-separated category names |
Example responses
200 Response
{
"data": [
null
],
"row_count": 0,
"row_limit": 0,
"truncated": true,
"columns": [
"string"
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | SiExportResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Get product detail
GET /social-intelligence/products/{product_id}
Detailed metrics for a single product on TikTok Shop.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| product_id | path | string | true | none |
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Response Schema
List creators selling a product
GET /social-intelligence/products/{product_id}/creators
Creators who have driven GMV for this product. Pass seller_id to scope to a specific seller's affiliate creators.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| product_id | path | string | true | none |
| page | query | integer | false | none |
| page_size | query | integer | false | none |
| search | query | any | false | none |
| sort_by | query | any | false | gmv28d, followers, shopPosts, postRate |
| sort_order | query | string | false | none |
| seller_id | query | any | false | none |
| min_gmv | query | any | false | none |
| max_gmv | query | any | false | none |
| min_gmv_28d | query | any | false | none |
| max_gmv_28d | query | any | false | none |
| min_followers | query | any | false | none |
| max_followers | query | any | false | none |
| min_units_sold | query | any | false | none |
| max_units_sold | query | any | false | none |
| min_post_rate | query | any | false | none |
| max_post_rate | query | any | false | none |
| min_shop_posts | query | any | false | none |
| max_shop_posts | query | any | false | none |
| categories | query | any | false | Comma-separated category names |
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Response Schema
List videos for a product
GET /social-intelligence/products/{product_id}/videos
Videos featuring this product. Includes AI-analyzed content tags (hookType, sellingPoints, contentAnalysis) for top performers.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| product_id | path | string | true | none |
| page | query | integer | false | none |
| page_size | query | integer | false | none |
| search | query | any | false | none |
| sort_by | query | any | false | gmv, views, likes, engagement, date |
| sort_order | query | string | false | none |
| time_range | query | any | false | none |
| min_gmv | query | any | false | none |
| max_gmv | query | any | false | none |
| start_date | query | any | false | none |
| end_date | query | any | false | none |
| min_engagement | query | any | false | none |
| max_engagement | query | any | false | none |
| min_views | query | any | false | none |
| max_views | query | any | false | none |
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Response Schema
Creator category taxonomy
GET /social-intelligence/creators/categories
List all creator content categories tracked on TikTok Shop.
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
Response Schema
Trending videos across TikTok Shop
GET /social-intelligence/videos/trending
Top-performing videos across the entire TikTok Shop ecosystem. Filter by category, time range, GMV, views, engagement. Includes AI-analyzed content tags for top performers.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| page | query | integer | false | none |
| page_size | query | integer | false | none |
| search | query | any | false | none |
| category | query | any | false | none |
| subcategory | query | any | false | none |
| sort_by | query | any | false | gmv, views, likes, engagement, date |
| sort_order | query | string | false | none |
| time_range | query | any | false | none |
| min_gmv | query | any | false | none |
| max_gmv | query | any | false | none |
| start_date | query | any | false | none |
| end_date | query | any | false | none |
| min_engagement | query | any | false | none |
| max_engagement | query | any | false | none |
| min_views | query | any | false | none |
| max_views | query | any | false | none |
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Response Schema
Get a competitor video's transcript
GET /social-intelligence/videos/{video_id}/transcript
The spoken-audio transcript of a Social Intelligence (competitor) video — one of the videos surfaced by the seller / product / trending video endpoints. Pass a video_id from one of those lists. Returns available: false when no transcript is held yet (e.g. no_speech, still processing, or the video isn't in our SI corpus). For your OWN shop's videos use the video creative-analysis endpoint (/videos/{video_id}/analysis) instead — that one carries the transcript plus the full creative breakdown.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| video_id | path | string | true | none |
Example responses
200 Response
{
"video_id": "string",
"seller_id": "string",
"available": true,
"transcript": "string",
"transcript_language": "string",
"transcript_status": "string"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | SIVideoTranscriptResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Benchmark overview vs ecosystem
GET /social-intelligence/insights/overview
Compares your shop's performance against TikTok Shop ecosystem benchmarks for your GMV segment. Includes content unfulfilled metrics and funnel data.
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
Response Schema
Your shop's metrics vs the ecosystem
GET /social-intelligence/my-benchmarks
Your shop's seven headline metrics — GMV, videos posted, video views, active creators, GMV per video, GMV per sample, average videos per creator — each with its current value, period-over-period percent_change, a daily shop_timeseries, and the matching ecosystem benchmark_avg / benchmark_p90 and benchmark_timeseries.
percentile_all ranks you against every tracked shop; percentile_segment ranks you inside your own GMV segment (gmv_segment), which is the fairer comparison. Precomputed daily — computed_date is the snapshot the numbers come from.
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
Response Schema
Your creator-outreach funnel vs the Reacher average
GET /social-intelligence/my-funnel
Your shop's outreach funnel — DMs sent, TC invites sent, samples requested, samples approved, videos posted, videos converted — with each stage's value, the Reacher-wide benchmark_avg, and the stage-to-stage conversion_rate against benchmark_conversion_rate.
Stages converting below the benchmark are flagged status: action_required and carry a recommendation. biggest_dropoff_stage names the weakest link. Also returns content_unfulfilled — creators who took a sample and never posted.
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
Response Schema
GMV-segment benchmark distributions
GET /social-intelligence/insights/benchmarks
The raw ecosystem benchmark distribution for one GMV segment, independent of your own shop — average and p90 for each headline metric plus a daily benchmark_timeseries.
Pass any segment, not just your own: all (every shop), segment_1 ($0–5K), segment_2 ($5K–50K), segment_3 ($50K–100K), segment_4 ($100K+). Use this to size the gap to the tier above you; use /my-benchmarks for where you sit today.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| segment | query | string | false | GMV segment key. One of: all, segment_1, segment_2, segment_3, segment_4. |
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Response Schema
Community-wide creator directory
GET /social-intelligence/creators
Every creator tracked in your region's TikTok Shop ecosystem — not just your affiliates. Each row carries the profile (handle, name, avatar, follower count, content categories) and windowed performance (GMV, average views, shop posts, engagement rate) over a 1-, 7- or 28-day window.
isMyAffiliate marks creators already in your CRM; set hide_my_affiliates=true to return only new prospects. Results are capped at 1000 rows — capped: true with totalMatching above that means you should narrow with search / category before paging.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| page | query | integer | false | none |
| page_size | query | integer | false | none |
| search | query | any | false | none |
| category | query | any | false | none |
| subcategory | query | any | false | none |
| sort_by | query | any | false | gmv, avgViews, shopPosts, engagement, followers |
| sort_order | query | string | false | none |
| window_days | query | integer | false | Metric window in days. Only 1, 7, 28 are backed by data; anything else falls back to 28. The window is echoed back as windowDays. |
| hide_my_affiliates | query | boolean | false | Exclude creators already affiliated with your shop. |
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Response Schema
Creator data freshness for your region
GET /social-intelligence/last-updated
When the community creator dataset was last synced for your shop's region. Use it to decide whether a re-poll is worthwhile — the directory refreshes on a schedule, not continuously. lastUpdated is null when no sync has landed for the region yet.
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
Response Schema
Community creator profile
GET /social-intelligence/creators/{handle}
Ecosystem-wide profile for one creator by TikTok handle: name, avatar, TikTok URL, region, content categories, and windowed performance (GMV, average views, shop posts, engagement rate, followers).
This is the community view — what the creator does across all brands, which is the only view that exists for creators you have never worked with. For their history with your shop, use the CRM endpoints.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| handle | path | string | true | none |
| window_days | query | integer | false | Metric window in days. Only 1, 7, 28 are backed by data; anything else falls back to 28. The window is echoed back as windowDays. |
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Response Schema
A creator's shop videos
GET /social-intelligence/creators/{handle}/videos
Videos this creator posted for TikTok Shop brands, newest or top-performing first. Each row is the standard video card — views, likes, comments, shares, engagement, GMV, product, thumbnail, TikTok URL — plus brandName, the brand the video was made for.
Pass seller_id to restrict to one brand's videos, or days to window relative to the creator's most recent post. Capped at 500 rows (capped flags truncation).
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| handle | path | string | true | none |
| page | query | integer | false | none |
| page_size | query | integer | false | none |
| sort_by | query | any | false | gmv, views, likes, engagement, date |
| sort_order | query | string | false | none |
| days | query | any | false | Lookback anchored on the creator's latest video. Omit for all time. |
| seller_id | query | any | false | Restrict to one brand's videos. |
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Response Schema
Brands a creator has worked with
GET /social-intelligence/creators/{handle}/brands
The creator's per-brand breakdown — every seller they have posted for, with videos, gmv, unitsSold, avgViews and latestVideoAt for each. The competitive-overlap view: who else is already working with this creator, and how well it is going.
Pass days to window relative to the creator's most recent post, or search to filter by brand name. total is the full brand count, not just the current page.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| handle | path | string | true | none |
| page | query | integer | false | none |
| page_size | query | integer | false | none |
| days | query | any | false | Lookback anchored on the creator's latest video. Omit for all time. |
| search | query | any | false | Filter by brand name. |
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Response Schema
Export trending videos
POST /social-intelligence/videos/trending/export
Export the trending-video list in one call — same filters as GET /social-intelligence/videos/trending, but without pagination. Pass video_ids to export a specific selection instead.
Returns JSON rows by default; pass format: "csv" for a downloadable file. Capped at 1000 rows for most customers; truncated: true in the JSON response means the cap clipped the result. Read-only, but it consumes one of the shop's daily exports — a quota shared with portal exports.
Body parameter
{
"video_ids": [
"string"
],
"search": "string",
"category": "string",
"subcategory": "string",
"sort_by": "string",
"sort_order": "desc",
"time_range": "string",
"min_gmv": 0,
"max_gmv": 0,
"start_date": "string",
"end_date": "string",
"min_engagement": 0,
"max_engagement": 0,
"min_views": 0,
"max_views": 0,
"format": "json"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | TrendingVideosExportBody | true | none |
Example responses
200 Response
{
"data": [
null
],
"row_count": 0,
"row_limit": 0,
"truncated": true,
"columns": [
"string"
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | SiExportResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
List the shop's favorited brands or products
GET /social-intelligence/favorites
The shop's Social Intelligence watchlist for one entity type, most recently added first. Returns bare IDs — feed a brand ID into the seller endpoints or a product ID into the product endpoints to resolve it.
Favorites are per shop, not per user: everyone on the account sees the same watchlist. Read-only — no read_write scope needed. Single-shop only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| entity_type | query | string | true | brand (a TikTok Shop seller) or product. |
Example responses
200 Response
{
"entity_type": "string",
"entity_ids": [
"string"
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | FavoritesListResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Add a brand or product to the shop's watchlist
POST /social-intelligence/favorites
Favorite one competitor brand or one product so it surfaces in the shop's Social Intelligence watchlist.
Idempotent: favoriting something already on the list is a no-op that still returns 200, so a client does not have to read the list first. The ID is not validated against the SI catalog — an unknown ID is stored and simply resolves to nothing on read.
Favorites are per shop, so this is visible to everyone on the account. Requires read_write scope. Single-shop only.
Body parameter
{
"entity_type": "string",
"entity_id": "string"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| Idempotency-Key | header | any | false | none |
| body | body | FavoriteWriteBody | true | none |
Example responses
200 Response
{
"ok": true,
"entity_type": "string",
"entity_id": "string"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | FavoriteWriteResponse |
| 400 | Bad Request | Validation error, or a missing/oversized Idempotency-Key. | None |
| 403 | Forbidden | API key lacks read_write scope (WRITE_NOT_PERMITTED). |
None |
| 404 | Not Found | Resource does not exist, or belongs to another shop. | None |
| 409 | Conflict | Idempotency conflict, or the resource already exists. | None |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
| 429 | Too Many Requests | Write-tier rate limit (10/min, 50/hour, 100/day) exceeded. | None |
Remove a brand or product from the shop's watchlist
DELETE /social-intelligence/favorites/{entity_type}/{entity_id}
Un-favorite one brand or product.
Returns 404 when the ID is not on this shop's watchlist — including when it is on another shop's — so a caller can neither delete nor probe a watchlist it does not own. Requires read_write scope. Single-shop only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| entity_type | path | string | true | brand (a TikTok Shop seller) or product. |
| entity_id | path | string | true | Seller ID or product ID. |
| Idempotency-Key | header | any | false | none |
Example responses
200 Response
{
"ok": true,
"entity_type": "string",
"entity_id": "string"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | FavoriteWriteResponse |
| 400 | Bad Request | Validation error, or a missing/oversized Idempotency-Key. | None |
| 403 | Forbidden | API key lacks read_write scope (WRITE_NOT_PERMITTED). |
None |
| 404 | Not Found | Resource does not exist, or belongs to another shop. | None |
| 409 | Conflict | Idempotency conflict, or the resource already exists. | None |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
| 429 | Too Many Requests | Write-tier rate limit (10/min, 50/hour, 100/day) exceeded. | None |
Discord
Post to your connected Discord server — list channels, post a message now, schedule one or a recurring (e.g. weekly) series, and read back scheduled / sent messages with their engagement. Requires a connected Discord integration; posting needs a read_write key. Supports text, a bold title, mentions, and base64 image / file attachments.
List the shop's Discord channels
GET /discord/channels
Every text / announcement channel in the shop's connected Discord server, with can_post telling you where the Reacher bot can actually post. Use a channel's id as channel_id when posting.
404 if the shop has not connected Discord. Single shop only.
Example responses
200 Response
{
"data": {
"discord_guild_id": "string",
"channels": [
{
"id": "string",
"name": "string",
"type": 0,
"position": 0,
"parent_id": "string",
"parent_name": "string",
"can_post": true
}
]
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | DiscordChannelsResponse |
Post a Discord message now, or schedule one
POST /discord/messages
Post a message to a channel immediately, schedule it for later, or start a recurring series (e.g. a weekly announcement).
- Now: omit
scheduled_for— the response is the finalsent/failedrecord. - Scheduled: set
scheduled_for. - Recurring: set
scheduled_for(first fire) andrecurrence(e.g.{"frequency": "weekly", "end_type": "never"}).
Idempotency-Key is required so a retry can't double-post. X-Dry-Run: true validates without posting or scheduling. Attach up to 10 images / files via images (each base64-encoded, ≤ 8MB) — e.g. a video-breakdown image.
Body parameter
{
"channel_id": "string",
"content": "string",
"title": "string",
"mention": {
"type": "none",
"role_id": "string"
},
"scheduled_for": "2019-08-24T14:15:22Z",
"timezone": "string",
"recurrence": {
"frequency": "daily",
"end_type": "never",
"until": "2019-08-24",
"occurrences": 0
},
"campaign_id": 0,
"sender_user_id": "string",
"images": [
{
"filename": "string",
"content_type": "string",
"data_base64": "string"
}
]
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| Idempotency-Key | header | any | false | none |
| X-Dry-Run | header | any | false | none |
| body | body | DiscordMessageCreateRequest | true | none |
Example responses
201 Response
{
"data": {
"id": 0,
"channel_id": "string",
"channel_name": "string",
"title": "string",
"content": "string",
"mention": {
"type": "none",
"role_id": "string"
},
"campaign_id": 0,
"attachments": [
{
"filename": "string",
"content_type": "string",
"size_bytes": 0
}
],
"sender": {
"type": "brand",
"user_id": "string",
"display_name": "string",
"avatar_url": "string"
},
"status": "string",
"scheduled_for": "2019-08-24T14:15:22Z",
"timezone": "string",
"recurrence": {
"frequency": "daily",
"end_type": "never",
"until": "2019-08-24",
"occurrences": 0
},
"paused": false,
"series_id": 0,
"occurrence_num": 0,
"occurrences_sent": 0,
"discord_message_id": "string",
"message_url": "string",
"sent_at": "2019-08-24T14:15:22Z",
"failure_reason": "string",
"failure_code": "string",
"audience_count": 0,
"reaction_count": 0,
"reply_count": 0,
"link_click_count": 0,
"upcoming_occurrences": [
"2019-08-24T14:15:22Z"
],
"created_at": "2019-08-24T14:15:22Z",
"updated_at": "2019-08-24T14:15:22Z"
},
"dry_run": false
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 201 | Created | Successful Response | DiscordMessageWriteResponse |
| 400 | Bad Request | Validation error, multi-shop key, or missing/invalid Idempotency-Key. | WriteErrorResponse |
| 403 | Forbidden | API key lacks read_write scope (WRITE_NOT_PERMITTED). |
WriteErrorResponse |
| 404 | Not Found | Shop has no Discord integration, or message not found in this shop. | WriteErrorResponse |
| 409 | Conflict | Idempotency conflict. | WriteErrorResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
| 429 | Too Many Requests | Write-tier rate limit exceeded. | WriteErrorResponse |
List scheduled, sent, and failed messages
GET /discord/messages
Discord messages this shop has scheduled or posted through Reacher, with their engagement (reaction_count, reply_count, audience_count) once delivered. counts totals each tab. Single shop only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| tab | query | string | false | Which set to return. |
| page | query | integer | false | Page number (1-indexed). |
| page_size | query | integer | false | Rows per page (max 100). |
Enumerated Values
| Parameter | Value |
|---|---|
| tab | scheduled |
| tab | sent |
| tab | failed |
Example responses
200 Response
{
"data": [
{
"id": 0,
"channel_id": "string",
"channel_name": "string",
"title": "string",
"content": "string",
"mention": {
"type": "none",
"role_id": "string"
},
"campaign_id": 0,
"attachments": [
{
"filename": "string",
"content_type": "string",
"size_bytes": 0
}
],
"sender": {
"type": "brand",
"user_id": "string",
"display_name": "string",
"avatar_url": "string"
},
"status": "string",
"scheduled_for": "2019-08-24T14:15:22Z",
"timezone": "string",
"recurrence": {
"frequency": "daily",
"end_type": "never",
"until": "2019-08-24",
"occurrences": 0
},
"paused": false,
"series_id": 0,
"occurrence_num": 0,
"occurrences_sent": 0,
"discord_message_id": "string",
"message_url": "string",
"sent_at": "2019-08-24T14:15:22Z",
"failure_reason": "string",
"failure_code": "string",
"audience_count": 0,
"reaction_count": 0,
"reply_count": 0,
"link_click_count": 0,
"upcoming_occurrences": [
"2019-08-24T14:15:22Z"
],
"created_at": "2019-08-24T14:15:22Z",
"updated_at": "2019-08-24T14:15:22Z"
}
],
"counts": {
"scheduled": 0,
"sent": 0,
"failed": 0
},
"pagination": {
"total_count": 0,
"page": 0,
"page_size": 0,
"total_pages": 0
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | DiscordMessageListResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Get one message with its engagement
GET /discord/messages/{message_id}
One scheduled or delivered message. For a recurring series' parent, upcoming_occurrences lists the next fire times. A message id that isn't this shop's reads as 404. Single shop only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| message_id | path | integer | true | Message id from a list / create response. |
Example responses
200 Response
{
"data": {
"id": 0,
"channel_id": "string",
"channel_name": "string",
"title": "string",
"content": "string",
"mention": {
"type": "none",
"role_id": "string"
},
"campaign_id": 0,
"attachments": [
{
"filename": "string",
"content_type": "string",
"size_bytes": 0
}
],
"sender": {
"type": "brand",
"user_id": "string",
"display_name": "string",
"avatar_url": "string"
},
"status": "string",
"scheduled_for": "2019-08-24T14:15:22Z",
"timezone": "string",
"recurrence": {
"frequency": "daily",
"end_type": "never",
"until": "2019-08-24",
"occurrences": 0
},
"paused": false,
"series_id": 0,
"occurrence_num": 0,
"occurrences_sent": 0,
"discord_message_id": "string",
"message_url": "string",
"sent_at": "2019-08-24T14:15:22Z",
"failure_reason": "string",
"failure_code": "string",
"audience_count": 0,
"reaction_count": 0,
"reply_count": 0,
"link_click_count": 0,
"upcoming_occurrences": [
"2019-08-24T14:15:22Z"
],
"created_at": "2019-08-24T14:15:22Z",
"updated_at": "2019-08-24T14:15:22Z"
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | DiscordMessageResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Delete a scheduled message
DELETE /discord/messages/{message_id}
Delete a scheduled message (or a whole recurring series by its parent id). An already-sent message can be deleted from the record too; it does not unsend it in Discord. A foreign message id reads as 404.
Requires read_write scope. Idempotency-Key is optional (a delete is naturally repeatable); X-Dry-Run: true checks the message exists and is yours without deleting it. Single shop only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| message_id | path | integer | true | Message id to delete. |
| Idempotency-Key | header | any | false | none |
| X-Dry-Run | header | any | false | none |
Example responses
200 Response
{
"data": {
"ok": true,
"deleted_id": 0
},
"dry_run": false
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | DiscordDeleteResponse |
| 400 | Bad Request | Validation error, multi-shop key, or missing/invalid Idempotency-Key. | WriteErrorResponse |
| 403 | Forbidden | API key lacks read_write scope (WRITE_NOT_PERMITTED). |
WriteErrorResponse |
| 404 | Not Found | Shop has no Discord integration, or message not found in this shop. | WriteErrorResponse |
| 409 | Conflict | Idempotency conflict. | WriteErrorResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
| 429 | Too Many Requests | Write-tier rate limit exceeded. | WriteErrorResponse |
Account & Billing
Connection and data-collection health for one shop
GET /shops/{shop_id}/health
Whether Reacher is still collecting for a shop, so a consumer can tell "this shop genuinely had no activity" from "we stopped collecting for it" — the two look identical on every other endpoint.
is_collecting is the one-field answer; failure_reason explains a false (banned / account_dead / shop_punished / permission_denied / affiliate_access_missing / login_issue) and onboarding_status covers shops that never finished setup. region_supported is false for shops in a region Reacher does not operate in — those never collect at all.
shop_id must be one of your own shops. Send x-shop-id: all to poll any of them without re-issuing the request per shop.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| shop_id | path | integer | true | One of your shop IDs. |
Example responses
200 Response
{
"shop_id": 0,
"shop_name": "string",
"status": "string",
"is_collecting": true,
"is_logged_in": true,
"is_banned": true,
"failure_reason": "string",
"onboarding_status": "string",
"region": "string",
"detected_region": "string",
"region_supported": true,
"last_login_time": "2019-08-24T14:15:22Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | ShopConnectionHealthResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Subscription and access state for your shops
GET /account/subscription
Your account's billable seats with live Stripe billing state, so a consumer can answer "is this account still entitled to the data I'm reading?" without screen-scraping the portal.
Each seat carries plan, unit_amount (minor units), status, the live stripe_status, current_period_end, trial_end, cancel_at and access_expires_on — the cancel-grace date after which a canceled seat stops granting access.
Only seats linked to shops this key can reach are returned, plus any unassigned seats (which name no shop). Read collection_method and attempt_count before treating past_due as a payment failure: invoice-billed customers sit in past_due legitimately, and attempt_count == 0 means Stripe never attempted a charge.
Read-only — plan changes and cancellation are portal-only.
Example responses
200 Response
{
"has_stripe_customer": true,
"data": [
{
"subscription_item_id": "string",
"shop_id": 0,
"shop_name": "string",
"plan": "string",
"interval": "string",
"unit_amount": 0,
"status": "string",
"stripe_status": "string",
"current_period_end": "string",
"trial_end": "string",
"cancel_at": "string",
"access_expires_on": "string",
"next_payment_attempt": "string",
"collection_method": "string",
"attempt_count": 0
}
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | AccountSubscriptionResponse |
Who this connection is and what it can reach
GET /whoami
Confirms the connection works and reports exactly what it can do: the account, the shops in scope, and the granted scopes.
shops is the shops this KEY can reach, which is not always what the account owns — a connector authorized for two shops reports two. Read scopes before attempting a write: a key without read_write gets a 403 from every write endpoint.
Cheap and side-effect free, so it is the right first call to verify a connection rather than a real query that might fail for its own reasons.
Example responses
200 Response
{
"customer_id": 0,
"shops": [
{
"shop_id": 0,
"shop_name": "string"
}
],
"shop_count": 0,
"scopes": [
"string"
],
"can_write": true
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | WhoamiResponse |
Resolved plan entitlements for your shops
GET /account/limits
The per-category limits actually in force for each of your shops — CRM, automations and email automations — with any support-granted Extra Limits already folded in. This is the resolved number, not the advertised plan number, so a consumer can size a batch before it gets clamped.
limits is category → limit type → value; the types are typically default (what a new automation is created with), minimum and maximum (the enforced ceiling). A category missing for a tier means the plan expresses no opinion, not a limit of zero.
Covers every shop in x-shop-id — send all for the whole account.
Example responses
200 Response
{
"data": [
{
"shop_id": 0,
"shop_name": "string",
"plan": "string",
"limits": {
"property1": {
"property1": 0,
"property2": 0
},
"property2": {
"property1": 0,
"property2": 0
}
}
}
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | AccountLimitsResponse |
Stripe invoice history
GET /account/invoices
Your account's billing history straight from Stripe — settled invoices plus the previewed upcoming charge for each live subscription — newest first. Drafts and voided invoices are excluded: they are not real payment history.
Read live from Stripe by customer rather than from Reacher's webhook-populated tables, so it cannot go stale when a webhook is missed. amount is in the minor units of the customer's Stripe billing currency (the currency itself is not carried on this surface). invoice_pdf links are Stripe-hosted and time-limited.
Account-scoped: invoices bill the account, not an individual shop, so the result is the same for any x-shop-id.
Example responses
200 Response
{
"has_stripe_customer": true,
"data": [
{
"id": "string",
"amount": 0,
"status": "string",
"due_date": "string",
"billing_month": "string",
"plans": {
"property1": 0,
"property2": 0
},
"invoice_pdf": "string"
}
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | AccountInvoicesResponse |
Email send capacity for this shop
GET /automations/email-capacity
Today's email send capacity for a single shop — the email twin of GET /automations/outreach-capacity — so a consumer can pre-check before queuing email outreach and schedule the remainder for tomorrow.
emails_sent_today counts today's sends; daily_limit is the denominator the portal's daily-send bar uses, derived from the shop's effective plan entitlement.
tier_limits is that entitlement in full (default / minimum / maximum, Extra Limits grants applied). Note the enforced cap is per email automation, stored on the automation itself and clamped into this range when it is written — so a shop running several automations can exceed daily_limit in aggregate. A null field means the tier expresses no such limit, not zero.
Requires a single shop.
Example responses
200 Response
{
"shop_id": 0,
"emails_sent_today": 0,
"daily_limit": 0,
"percent_used": 0,
"tier_limits": {
"default": 0,
"minimum": 0,
"maximum": 0
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | EmailCapacityResponse |
Cohort Analysis
Cohort retention grid
GET /cohorts/grid
The retention grid for one shop: creators grouped by the month they first posted (rows), tracked across month-offsets M0..M6 (columns). Each cell carries raw counts — posted (creators who posted), gmv_count (creators who drove GMV) and total_videos — so a consumer derives % Posting / % Driving GMV / videos-per-creator itself. Omit product_id for the latest all-products snapshot, or pass one to live-aggregate that product's cohorts. Single-shop only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| product_id | query | any | false | Optional product filter; omit for the all-products grid. |
Example responses
200 Response
{
"shop_id": 0,
"product_id": "string",
"computed_date": "2019-08-24",
"offsets": [
0
],
"cohorts": [
{
"cohort_month": "2019-08-24",
"affiliates": 0,
"cells": [
{
"offset": 0,
"posted": 0,
"gmv_count": 0,
"total_videos": 0
}
]
}
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | CohortGridResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Creators behind a cohort cell
GET /cohorts/creators
Drill-down for one clicked cell (cohort × offset): the creators it represents. direction=active returns the creators who qualified at that offset (the cell's numerator); direction=lapsed returns the cohort members who did NOT — the re-engagement target list. Capped at 500 rows (capped flags truncation). Single-shop only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| cohort_month | query | string(date) | true | Cohort start month (YYYY-MM-01). |
| offset | query | integer | true | Months since start (M0..M6). |
| metric | query | string | false | Which cell was clicked: 'posting' or 'gmv'. |
| direction | query | string | false | 'active' (qualified) or 'lapsed' (re-engagement targets). |
| product_id | query | any | false | Optional product filter (match the grid). |
Example responses
200 Response
{
"creators": [
{
"creator_key": "string",
"creator_display_name": "string",
"videos_posted": 0,
"gmv": "0"
}
],
"capped": false,
"cap": 500,
"direction": "active"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | CohortCreatorsResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Which outreach sourced a cohort
GET /cohorts/attribution
First-touch attribution for one cohort: which automations first reached its creators, with each automation's creators_sourced and share of the cohort. Single-shop only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| cohort_month | query | string(date) | true | Cohort start month (YYYY-MM-01). |
| product_id | query | any | false | Optional product filter (match the grid). |
Example responses
200 Response
{
"cohort_month": "2019-08-24",
"cohort_size": 0,
"attributed": 0,
"unattributed": 0,
"automations": [
{
"automation_id": 0,
"automation_name": "string",
"automation_type": "string",
"creators_sourced": 0,
"share": 0,
"first_run": "2019-08-24",
"last_run": "2019-08-24"
}
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | CohortAttributionResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Repost-recency buckets
GET /cohorts/repost
Buckets the shop's recent affiliates by repost recency — actively-reposting / posted-once / lapsed-reposter — over a recency window_days. Buckets genuinely shift with the window. Single-shop only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| window_days | query | integer | false | Recency window separating actively-reposting from lapsed. |
Example responses
200 Response
{
"window_days": 0,
"lookback_days": 120,
"population": 0,
"reengageable": 0,
"buckets": [
{
"bucket": "string",
"creators": 0,
"posts": 0
}
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | RepostBehaviorResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Resolve a cohort/repost segment to creator handles
GET /cohorts/segment
Resolves a segment — a cohort cell (source=cohort_cell) or a repost bucket set (source=repost) — to the underlying creator handles, for exporting or piping into outreach. Single-shop only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| source | query | string | true | none |
| cohort_month | query | any | false | cohort_cell only: cohort start month. |
| offset | query | any | false | cohort_cell only: month offset. |
| metric | query | string | false | none |
| direction | query | string | false | none |
| buckets | query | any | false | repost only: comma-separated bucket keys. |
| window_days | query | integer | false | repost only: recency window. |
Example responses
200 Response
{
"handles": [
"string"
],
"total": 0,
"resolved": 0,
"unresolved": 0,
"capped": false,
"cap": 10000
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | SegmentHandlesResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Weekly Report
Full weekly affiliate report for one shop
POST /weekly-report
The complete affiliate performance report for one shop over a date window — the same payload the Reacher portal renders and exports.
Includes affiliate GMV, units sold, GMV per video and GMV per sample (each with the previous equal-length period and its % change); recruitment counters (creators reached, sample requests, samples approved, DM / TC / email reply rates); performance counters (videos posted, video views, creators posting, creators converting); the creator-level distribution (L0-L7); six top-product leaderboards (GMV, units, sample requests, approvals, conversions, growth); top creators; top videos; and the rule-based recommendations.
Single-shop only — set x-shop-id to a specific shop ID. The window defaults to the last 7 settled days and is capped at 90 days; end_date must be at least 1 day in the past. An end_date past the shop's newest settled day is clamped to it, which can make the window shorter than requested (the 7-day default included) — the response's start_date/end_date always report the window actually used, and the period-over-period comparison follows that same length. Returns 404 when the shop has no activity in the settled part of the window, and when the requested window lies entirely past the settled day — that message names the newest day the shop is reportable through, so a caller can retry against a window that works.
Body parameter
{
"start_date": "2019-08-24",
"end_date": "2019-08-24"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | WeeklyReportBody | true | none |
Example responses
200 Response
{
"id": 0,
"shop_id": 0,
"shop_name": "string",
"customer_id": 0,
"start_date": "string",
"end_date": "string",
"currency_symbol": "$",
"affiliate_gmv": 0,
"affiliate_gmv_prev_week": 0,
"affiliate_gmv_pct_change": 0,
"gmv_per_video": 0,
"gmv_per_video_prev_week": 0,
"gmv_per_video_pct_change": 0,
"gmv_per_sample": 0,
"gmv_per_sample_prev_week": 0,
"gmv_per_sample_pct_change": 0,
"units_sold": 0,
"units_sold_prev_week": 0,
"units_sold_pct_change": 0,
"total_creators_reached": 0,
"total_sample_requests": 0,
"total_samples_approved": 0,
"creators_added_to_showcase": 0,
"dm_reply_rate": 0,
"tc_reply_rate": 0,
"email_open_rate": 0,
"email_reply_rate": 0,
"videos_posted": 0,
"videos_posted_prev_week": 0,
"videos_posted_pct_change": 0,
"video_views": 0,
"creators_posting_videos": 0,
"creators_converting": 0,
"creators_converting_prev_week": 0,
"creators_converting_pct_change": 0,
"videos_generating_sales": 0,
"creator_levels": {
"l0": 0,
"l1": 0,
"l2": 0,
"l3": 0,
"l4": 0,
"l5": 0,
"l6": 0,
"l7": 0
},
"top_products_by_gmv": [],
"top_products_by_units": [],
"top_products_by_sample_requests": [],
"top_products_by_approvals": [],
"top_products_by_conversions": [],
"top_products_by_growth": [],
"top_creators": [],
"top_videos": [],
"recommendations": []
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | WeeklyReportData |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Recommended actions for one shop
POST /weekly-report/recommendations
The recommended-actions block of the weekly report on its own — cheaper than the full report when that is all you need.
Each action carries a type (e.g. reactivate_creators, amplify_videos, prioritize_products), a headline title, a one-line description, and the items it refers to (creator, video or product, each with a display label, image and a formatted metric). Generation is rule-based over the same top-N data the report uses.
Single-shop only — set x-shop-id to a specific shop ID. The window defaults to the last 7 settled days and is capped at 90 days. An empty actions list is a normal 200 for a shop with no qualifying activity.
Body parameter
{
"start_date": "2019-08-24",
"end_date": "2019-08-24"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | WeeklyReportBody | true | none |
Example responses
200 Response
{
"shop_id": 0,
"actions": []
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | RecommendedActionsResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Cross-shop agency roll-up
POST /weekly-report/agency-view
One row per shop for the window — affiliate GMV, videos posted, video views, videos converted, video conversion rate, active creators, GMV per video and GMV per sample, each with its % change against the previous equal-length period. This is the portal's Agency View table.
Covers every shop this API key can access, so it works with x-shop-id: all, a comma-separated list, or a single shop ID — a key scoped to a subset of shops only ever sees that subset. Sortable by any of: affiliate_gmv, videos_posted, video_views, active_creators, gmv_per_video, gmv_per_sample, video_conversion_rate, shop_name; search filters on shop name; results are paginated (page / page_size, max 100) and total_pagination is the number of shops you can see after filtering.
The window defaults to the last 7 settled days.
Body parameter
{
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"page": 1,
"page_size": 10,
"sort_field": "affiliate_gmv",
"sort_order": "desc",
"search": "string"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | AgencyViewBody | true | none |
Example responses
200 Response
{
"data": [
{
"shop_id": 0,
"shop_name": "string",
"affiliate_gmv": 0,
"affiliate_gmv_pct_change": 0,
"videos_posted": 0,
"videos_posted_pct_change": 0,
"video_views": 0,
"video_views_pct_change": 0,
"videos_converted": 0,
"video_conversion_rate": 0,
"video_conversion_rate_pct_change": 0,
"active_creators": 0,
"active_creators_pct_change": 0,
"gmv_per_video": 0,
"gmv_per_video_pct_change": 0,
"gmv_per_sample": 0,
"gmv_per_sample_pct_change": 0,
"currency_symbol": "$"
}
],
"total_pagination": 0,
"page": 0,
"page_size": 0
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | AgencyViewResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
CRM Roster
List the CRM creator roster
GET /crm/creators
The shop's My Creators table: one row per creator (the most recently updated of their creator × product records), carrying the sample / content lifecycle status, lifetime and 28-day GMV, commission, fulfillment, video and live counts, and CRM tags.
Filter with any combination of status (repeatable display labels), stage (a canonical funnel stage, which overrides status), product_id, tags (creator carries ANY) and tags_all (carries ALL), plus creator_handle for a case-insensitive handle search. Sort with sort_by / sort_dir; the default is GMV descending.
start_date/end_date window the metric columns (video_gmv, total_video_views, videos_posted) — pass both or neither. Status, tags and lifetime gmv are always as-of-now.
Set include_products=true to attach each creator's product cards (title, image, status, remaining sample stock). Per-product GMV and the videos themselves are deliberately not attached — they are the two heaviest reads in this surface; fetch them per creator from GET /crm/content.
Changed 2026-09: the roster returns every creator filed under this shop. It previously dropped anyone whose row in Reacher's global creator registry had been marked inactive — an outreach-side, cross-shop flag that hid creators this shop had earned GMV from. Expect more rows than before on shops with long CRM histories; no field or filter semantics changed.
Single-shop only. Creator contact details are never returned: no real name, shipping address, phone or email. creator_name is the public TikTok handle.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| page | query | integer | false | 1-based page number. |
| page_size | query | integer | false | Rows per page (max 100). |
| status | query | any | false | Repeatable status label. One of: ['Sample Requested', 'Sample Approved', 'Ready to Ship', 'Sample Shipped', 'Content Pending', 'Completed', 'Sample Request Rejected', 'Sample Request Expired', 'Content Unfulfilled', 'Idle', 'Posted Video', 'Sold Products', 'GMV Generated', 'Showcasing Product', 'Livestreamed']. NOTE: ['Posted Video', 'Sold Products', 'GMV Generated', 'Showcasing Product', 'Livestreamed'] are ACTIVITY-METRIC filters, not pipeline-status filters — they match on sales/GMV/video/livestream activity regardless of the creator's curr_status, so a returned row's status will NOT equal one of these labels (e.g. 'Sold Products' can return a 'Showcasing Product' creator who has sales). The other labels filter on curr_status directly. |
| stage | query | any | false | Canonical funnel stage id; overrides status with that stage's label set. One of: ['sample-requests', 'sample-requested', 'approved-samples', 'sample-approved', 'content-pending', 'content-unfulfilled', 'content-posted', 'generated-gmv', 'gmv-generated']. |
| product_id | query | any | false | Restrict to one product. |
| tags | query | any | false | Repeatable. Creators carrying ANY of these CRM tags. |
| tags_all | query | any | false | Repeatable. Creators carrying ALL of these CRM tags. |
| creator_handle | query | any | false | Case-insensitive substring search on the TikTok handle. |
| sort_by | query | any | false | Sort column. One of: ['video_num', 'live_num', 'fulfillment_rate', 'gmv', 'video_release_date', 'creator_gmv', 'follower_num', 'video_gmv', 'total_video_views', 'videos_posted', 'avg_views', 'affiliate_gmv_28d', 'units_sold', 'commission']. |
| sort_dir | query | string | false | Sort direction. |
| start_date | query | any | false | Start of the metric window. Requires end_date. |
| end_date | query | any | false | End of the metric window. Requires start_date. |
| include_products | query | boolean | false | Attach each creator's product cards. |
Enumerated Values
| Parameter | Value |
|---|---|
| sort_dir | asc |
| sort_dir | desc |
Example responses
200 Response
{
"data": [
{
"id": "string",
"creator_id": "string",
"creator_name": "string",
"avatar_url": "string",
"follower_num": 0,
"tags": [
"string"
],
"bio": "string",
"categories": [
"string"
],
"curr_status": "string",
"status": "string",
"expired_in": 0,
"fulfillment_status": 0,
"fulfillment_rate": 0,
"sample_received_num": 0,
"product_id": "string",
"product_title": "string",
"sku_id": "string",
"sku_left_num": 0,
"gmv": 0,
"creator_gmv": 0,
"video_gmv": 0,
"affiliate_gmv_28d": 0,
"refund_gmv": 0,
"commission": 0,
"commission_rate": 0,
"estimate_commission": 0,
"units_sold": 0,
"item_sold": 0,
"refund_item_sold": 0,
"product_sold": 0,
"video_num": 0,
"live_num": 0,
"videos_posted": 0,
"total_video_views": 0,
"content_video_views": 0,
"avg_views": 0,
"engagement_rate": 0,
"video_release_date": "2019-08-24T14:15:22Z",
"video_url": "string",
"updated_at": "2019-08-24T14:15:22Z",
"products": [
{
"product_id": "string",
"product_title": "string",
"sku_image": "string",
"status": "string",
"requested_date": "string",
"expires_in": 0,
"quantity": 0
}
]
}
],
"pagination": {
"total_count": 0,
"page": 0,
"page_size": 0,
"total_pages": 0
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | CrmRosterResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Get one creator's CRM profile
GET /crm/creators/{creator_id}
The Creator Profile drawer for one roster creator: identity and follower count, top products by GMV, shop performance (total / video / live GMV, units sold, videos and lives posted), affiliate performance (28-day GMV, engagement rate, average views, post rate, brands worked with, PPS score), the current sales-metric cards, and the CRM Groups the creator belongs to.
creator_id is the value from GET /crm/creators. The profile is resolved through the creator's handle, so it spans every creator_id the CRM, content and affiliate syncs filed the creator under — a creator whose content landed under a second id still reports their full video GMV here.
Inferred demographics (gender, age range, ethnicity, likely location) shown in the portal are omitted. Single-shop only. Creator contact details are never returned: no real name, shipping address, phone or email. creator_name is the public TikTok handle.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| creator_id | path | string | true | Creator id from GET /crm/creators. |
Example responses
200 Response
{
"data": {
"creator_id": "string",
"creator_name": "string",
"handle": "string",
"avatar_url": "string",
"tiktok_url": "string",
"tags": [
"string"
],
"follower_num": 0,
"creator_level": "string",
"shop_gmv": 0,
"affiliate_gmv_28d": 0,
"creator_gmv": 0,
"has_shop_data": true,
"top_products": [
{}
],
"shop_performance": {},
"affiliate_performance": {},
"sales_metrics": {},
"groups": [
{}
]
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | CrmCreatorDetailResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
List a creator's CRM content
GET /crm/content
Every piece of content one creator posted for this shop, per product, with views, likes, comments and paid_orders_count — the attributed-order count TikTok reports for that video. Reads analytics.crm_content_data, the same source behind the portal's expanded creator row.
creator_id is required (this is a per-creator drill-down, not a shop-wide content feed — use GET /videos for that); narrow further with product_id. Ordered newest first.
Product titles are not returned: the underlying join resolves a single title per creator rather than per product, so it would be wrong on any creator working on more than one. Join product_id against GET /crm/creators for titles.
Single-shop only. Creator contact details are never returned: no real name, shipping address, phone or email. creator_name is the public TikTok handle.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| creator_id | query | string | true | Creator id from GET /crm/creators. |
| product_id | query | any | false | Restrict to content for one product. |
| page | query | integer | false | 1-based page number. |
| page_size | query | integer | false | Items per page (max 100). |
Example responses
200 Response
{
"data": [
{
"content_id": "string",
"creator_id": "string",
"product_id": "string",
"content_type": "string",
"content_desc": "string",
"content_url": "string",
"thumbnail_url": "string",
"views": 0,
"likes": 0,
"comments": 0,
"paid_orders_count": 0,
"posted_time": "2019-08-24T14:15:22Z"
}
],
"pagination": {
"total_count": 0,
"page": 0,
"page_size": 0,
"total_pages": 0
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | CrmContentResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
List a creator's CRM status transitions
GET /crm/creators/{creator_id}/history
The audit log of lifecycle changes for one creator on this shop, from customers.crm_creator_status_history — each row is a previous_status → new_status move with the timestamp the sync detected it, plus display labels for both. Use it to measure how long creators sit in a stage, or to reconstruct when a sample was approved, shipped or went unfulfilled.
The grain is (creator, product): a creator collaborating on three products has three independent transition chains, so filter by product_id to follow one. Ordered newest first.
Single-shop only. Creator contact details are never returned: no real name, shipping address, phone or email. creator_name is the public TikTok handle.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| creator_id | path | string | true | Creator id from GET /crm/creators. |
| product_id | query | any | false | Restrict to one product's chain. |
| page | query | integer | false | 1-based page number. |
| page_size | query | integer | false | Transitions per page (max 200). |
Example responses
200 Response
{
"data": [
{
"product_id": "string",
"previous_status": "string",
"previous_status_label": "string",
"new_status": "string",
"new_status_label": "string",
"transition_detected_at": "2019-08-24T14:15:22Z"
}
],
"pagination": {
"total_count": 0,
"page": 0,
"page_size": 0,
"total_pages": 0
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | CrmStatusHistoryResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Halo Effect Tracker
Which halo channels are connected
GET /halo/channels
The prerequisite call: which of this shop's four data channels are wired up, and which have actually landed data. Correlations are only computed for channels flagged here, so a null amazon correlation on a shop with amazon: false is expected, not a failure.
amazon / shopify mean an active authorization exists; the matching *_has_data flags mean rows have arrived. Connected but not-yet-populated is the normal state for the first few hours after a brand links a store. Single-shop only.
Example responses
200 Response
{
"shop_id": 0,
"tiktok": true,
"amazon": true,
"shopify": true,
"branded_search": true,
"amazon_has_data": true,
"shopify_has_data": true
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | HaloChannelsResponse |
ASIN / Shopify-product catalog to filter by
GET /halo/products
Every Amazon ASIN and Shopify product this shop has off-platform revenue rows for — the value set for the amazon_asins and shopify_product_ids filters on the timeseries, analysis and branded-search endpoints. Omit channel to get both catalogs in one call; a catalog the shop has no data for comes back as an empty list.
There is no TikTok catalog: TikTok halo inputs (views, GMV) are only stored shop-wide, so TikTok is never product-filterable and passing channel=tiktok is rejected. search substring-matches ASIN and product name case-insensitively. Single-shop only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| channel | query | any | false | Limit to one channel; omit to get both catalogs. |
| search | query | any | false | Case-insensitive substring match on ASIN / product name. |
| limit | query | integer | false | Max rows per channel. |
Example responses
200 Response
{
"shop_id": 0,
"amazon": [
{
"asin": "string",
"marketplace_id": "string"
}
],
"shopify": [
{
"product_id": "string",
"product_name": "string"
}
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | HaloProductsResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Aligned daily series across all four channels
POST /halo/timeseries
Every halo channel on one contiguous date axis: TikTok views and GMV, Amazon revenue, Shopify revenue, branded-search volume and click share. dates[i] indexes every other array, so the arrays can be plotted or diffed element-wise without re-joining on date.
A null means no data for that day; a 0 means a real zero — the distinction is preserved deliberately, and channels the shop hasn't connected are null throughout. Pass amazon_asins / shopify_product_ids to scope revenue (and branded search) to specific products; omit them for shop totals.
TikTok points are only daily-resolved for the most recent ~30 days — beyond that TikTok's stored series is monthly-bucketed and cannot be aligned to days, so tiktok_views / tiktok_gmv come back null for the out-of-coverage tail while the revenue series stay complete. Defaults to the last 30 days ending yesterday; max 366. Single-shop only.
Body parameter
{
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"amazon_asins": [
"string"
],
"shopify_product_ids": [
"string"
]
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | HaloWindowRequest | true | none |
Example responses
200 Response
{
"shop_id": 0,
"start_date": "string",
"end_date": "string",
"dates": [
"string"
],
"tiktok_views": [
0
],
"tiktok_gmv": [
0
],
"amazon_revenue": [
0
],
"shopify_revenue": [
0
],
"branded_search_terms": [
0
],
"branded_search_click_share": [
0
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | HaloTimeseriesResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Halo correlation and incremental lift
POST /halo/analysis
The flagship halo read — how much off-TikTok revenue moved with TikTok activity over the window, and how confidently that can be claimed. Four things come back:
summary — base_sales is the average daily Amazon+Shopify revenue over the 30 days immediately BEFORE the window (the pre-period run rate). incremental_revenue is the window's revenue minus that run rate carried across the days that have data — the revenue above baseline, and the number to quote as halo lift. It goes negative when the window underperformed the prior 30 days. relationship_strength is the Pearson r between daily TikTok views and daily combined off-platform revenue; views_explain is r squared, readable as 'views explain N% of the day-to-day revenue swing'.
channel_correlations — the same regression per off-platform channel, each with r, a two-sided p_value (below 0.05 is the usual bar for calling it real) and a plain-English label. TikTok GMV is deliberately absent: it is driven by the same views it would be correlated against, so it correlates by construction and is direct attribution, not halo. It appears under attribution instead.
branded_search_correlation — TikTok views vs Amazon branded search, the earliest and cleanest halo signal. Null when the shop has no branded-search tracking.
attribution — raw revenue sums per channel for the window, unmodelled.
lag_days shifts TikTok views forward before correlating, so a video today can be matched against an Amazon order three days later; sweep 0-14 and keep the strongest r. Any r is null when fewer than 5 aligned day-pairs have data on both sides, or when a channel is not connected — check GET /halo/channels first. Correlation is not causation: a strong r with a plausible lag is evidence, not proof.
Defaults to the last 30 days ending yesterday; max 366, though TikTok views are only daily-resolved for the most recent ~30 days, so wider windows weaken the regression rather than strengthen it. Single-shop only.
Body parameter
{
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"amazon_asins": [
"string"
],
"shopify_product_ids": [
"string"
],
"lag_days": 0
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | HaloAnalysisRequest | true | none |
Example responses
200 Response
{
"shop_id": 0,
"start_date": "string",
"end_date": "string",
"lag_days": 0,
"summary": {
"base_sales": 0,
"incremental_revenue": 0,
"relationship_strength": 0,
"views_explain": 0
},
"channel_correlations": [
{
"channel": "string",
"r": 0,
"p_value": 0,
"label": "string"
}
],
"branded_search_correlation": {
"channel": "string",
"r": 0,
"p_value": 0,
"label": "string"
},
"attribution": {
"tiktok_gmv": 0,
"amazon": 0,
"shopify": 0,
"total": 0
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | HaloAnalysisResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Branded-search detail and its TikTok correlation
POST /halo/branded-search
Amazon branded search is the cleanest halo signal there is: nobody searches a brand by name unless something put it in their head, and on TikTok-driven brands that something is usually a video. This returns the daily branded-search volume and click share for the window, the window totals, the peak day, and the Pearson correlation against TikTok views at the requested lag_days — the same regression the analysis endpoint runs.
top_search_terms is always null: Amazon reports branded-search volume per ASIN per day, not the query strings, so there is no term list to return. The field exists so it can be filled later without a breaking change.
Pass asins to scope to specific products; omit for every tracked ASIN. An empty series means branded search isn't tracked for this shop (check branded_search on GET /halo/channels). Single-shop only.
Body parameter
{
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"asins": [
"string"
],
"lag_days": 0
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | HaloBrandedSearchRequest | true | none |
Example responses
200 Response
{
"shop_id": 0,
"start_date": "string",
"end_date": "string",
"lag_days": 0,
"asins": [
"string"
],
"total_search_terms": 0,
"average_click_share": 0,
"peak_date": "string",
"peak_search_terms": 0,
"correlation": {
"channel": "string",
"r": 0,
"p_value": 0,
"label": "string"
},
"top_search_terms": [
"string"
],
"series": [
{
"date": "string",
"search_terms": 0,
"click_share": 0
}
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | HaloBrandedSearchResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Top videos on a given date
GET /halo/viral-videos
The shop's TikTok videos posted on one date, ranked by views — the drill-down for a spike. When the timeseries shows Amazon revenue jumping on the 14th and the analysis says the best lag is 3 days, this answers what went up on the 11th that caused it. Each video carries views, GMV, units sold and engagement counts, plus Reacher CDN links (permanent thumbnail, mirrored video) for the videos we have mirrored — null for the rest.
date filters on posting date, not activity date, so a video that kept accruing views is ranked by its lifetime views under the day it was posted. Single-shop only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| date | query | string(date) | true | The posting date to rank (YYYY-MM-DD). |
| limit | query | integer | false | Max videos to return. |
Example responses
200 Response
{
"shop_id": 0,
"date": "string",
"videos": [
{
"video_id": "string",
"title": "string",
"video_url": "string",
"thumbnail": "string",
"views": 0,
"units_sold": 0,
"video_gmv": 0,
"like_count": 0,
"comment_count": 0,
"share_count": 0,
"creator_name": "string",
"posted_date": "string"
}
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | HaloViralVideosResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Targets & Blacklist
Set the shop's performance targets
PUT /targets
Set or update the goal values the shop is measured against for one granularity — the numbers behind the dashboard's progress bars.
Upsert semantics: if the shop already has targets for the given granularity, the most recent set is updated in place; otherwise a new set is created. Only the metrics you send are stored, so send the full set you want in effect rather than a partial diff.
Available metrics: target_collabs, creators_messaged, sample_requests, sample_approved, videos_posted, videos_converted, spark_codes. At least one is required, and each must be a non-negative integer.
Read the current targets back with GET /targets. Requires a key with read_write scope and a single shop.
Body parameter
{
"granularity": "monthly",
"targets": {
"creators_messaged": 200,
"target_collabs": 50,
"videos_posted": 35
}
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | TargetsWriteRequest | true | none |
Example responses
200 Response
{
"created": true,
"target": {
"created_at": "2024-01-01T00:00:00Z",
"customer_id": 924,
"granularity": "monthly",
"id": "550e8400-e29b-41d4-a716-446655440000",
"shop_id": 1183,
"targets": {
"creators_messaged": 200,
"sample_approved": 80,
"sample_requests": 100,
"spark_codes": 10,
"target_collabs": 50,
"videos_converted": 25,
"videos_posted": 35
},
"updated_at": "2024-01-01T00:00:00Z"
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | TargetsWriteResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Set the shop's performance targets for several granularities
POST /targets/bulk
Convenience fan-out of PUT /targets — set weekly, monthly and quarterly goals in one request instead of three. Each entry is upserted exactly as the single-granularity route does, and each granularity may appear only once.
NOT atomic: entries are applied in order and an invalid one aborts the request, leaving earlier entries already written. Re-sending the whole payload after fixing the bad entry is safe — writes are upserts. Requires a key with read_write scope and a single shop.
Body parameter
{
"targets": [
{
"granularity": "monthly",
"targets": {
"creators_messaged": 200,
"target_collabs": 50,
"videos_posted": 35
}
}
]
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | TargetsBulkWriteRequest | true | none |
Example responses
200 Response
{
"results": [
{
"created": true,
"target": {
"created_at": "2024-01-01T00:00:00Z",
"customer_id": 924,
"granularity": "monthly",
"id": "550e8400-e29b-41d4-a716-446655440000",
"shop_id": 1183,
"targets": {
"creators_messaged": 200,
"sample_approved": 80,
"sample_requests": 100,
"spark_codes": 10,
"target_collabs": 50,
"videos_converted": 25,
"videos_posted": 35
},
"updated_at": "2024-01-01T00:00:00Z"
}
}
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | TargetsBulkWriteResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
List the shop's do-not-contact creators
GET /shops/blacklist
The creators this shop has blacklisted. Outreach automations skip them, so this is the shop's suppression list.
Handles are returned normalized (lowercased, no leading @) — that is the form DELETE /shops/blacklist/{creator} expects. Each row also carries the stable id and when it was added. Single-shop only.
Example responses
200 Response
{
"creators": [
{
"id": 0,
"creator": "string",
"added_at": "string"
}
],
"total_count": 0
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | BlacklistListResponse |
Add creators to the shop's do-not-contact list
POST /shops/blacklist
Blacklist one or more creators so outreach automations stop targeting them.
Handles are normalized before storage (a leading @ and surrounding whitespace are stripped, the handle is lowercased), so @Creator and creator are the same entry. The call is additive and forgiving: handles already on the list are counted in duplicates_skipped, malformed handles (URLs, blanks) in invalid_skipped — neither fails the request, so a partially valid batch still applies. Check added_count for what actually changed.
At most 500 handles per request. Requires a key with read_write scope and a single shop.
Body parameter
{
"creators": [
"@somecreator",
"another.creator"
]
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | BlacklistAddRequest | true | none |
Example responses
200 Response
{
"added_count": 0,
"duplicates_skipped": 0,
"invalid_skipped": 0,
"invalid_creators": [
"string"
],
"message": "string"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | BlacklistAddResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Remove one creator from the shop's do-not-contact list
DELETE /shops/blacklist/{creator}
Un-blacklist a single creator by handle, making them eligible for outreach again.
The handle is normalized the same way as on add, so @Creator and creator both resolve to the same entry. A handle that is not on this shop's list returns 404 — this route is not a silent no-op, so a typo surfaces instead of being mistaken for a successful removal. To empty the whole list use POST /shops/blacklist/clear.
Requires a key with read_write scope and a single shop.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| creator | path | string | true | Creator handle to un-blacklist; a leading @ is optional. |
Example responses
200 Response
{
"removed_count": 0,
"creator": "string"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | BlacklistRemoveResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Clear the shop's do-not-contact list
POST /shops/blacklist/clear
Remove every creator from this shop's blacklist in one call, making all of them eligible for outreach again.
There is no undo — the rows are deleted, not archived, so read the list with GET /shops/blacklist first if you may need to restore it. Clearing an already-empty list is a no-op that returns removed_count: 0. Requires a key with read_write scope and a single shop.
Example responses
200 Response
{
"removed_count": 0
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | BlacklistClearResponse |
Lists
Create a list
POST /lists
Upload a list of creator handles + emails. Two paths: JSON body OR multipart CSV (file field name file, columns creator_name required + email optional). Returned list_id is what callers pass to automations as lists_selected.
Body parameter
{
"name": "string",
"description": "string",
"creator_handles": [
"string"
],
"creator_emails": [
"string"
]
}
name: string
description: string
creator_handles:
- string
creator_emails:
- string
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| Idempotency-Key | header | any | false | none |
| X-Dry-Run | header | any | false | none |
| body | body | object | true | none |
| » name | body | string | true | Human-readable list name shown in the portal. |
| » description | body | any | false | none |
| »» anonymous | body | string | false | none |
| »» anonymous | body | null | false | none |
| » creator_handles | body | [string] | false | TikTok handles, with or without leading '@'. Deduplicated case-insensitively at insert time. |
| » creator_emails | body | [string] | false | Email addresses. Deduplicated case-insensitively at insert time. |
Example responses
201 Response
{
"data": {
"list_id": "string",
"name": "string",
"description": "string",
"creator_count": 0,
"email_count": 0,
"state": "string",
"created_at": "string",
"updated_at": "string"
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 201 | Created | Successful Response | ListResponse |
| 400 | Bad Request | Bad Request | WriteErrorResponse |
| 403 | Forbidden | Forbidden | WriteErrorResponse |
| 404 | Not Found | Not Found | WriteErrorResponse |
| 409 | Conflict | Conflict | WriteErrorResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
| 429 | Too Many Requests | Too Many Requests | WriteErrorResponse |
List the shop's lists
GET /lists
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| page | query | integer | false | none |
| page_size | query | integer | false | none |
| name_contains | query | any | false | none |
Example responses
200 Response
{
"data": [
{
"list_id": "string",
"name": "string",
"description": "string",
"creator_count": 0,
"email_count": 0,
"state": "string",
"created_at": "string",
"updated_at": "string"
}
],
"pagination": null
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | ListsPaginatedResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Get a list with its members
GET /lists/{list_id}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| list_id | path | integer | true | none |
Example responses
200 Response
{
"data": {
"list_id": "string",
"name": "string",
"description": "string",
"creator_count": 0,
"email_count": 0,
"state": "string",
"created_at": "string",
"updated_at": "string"
},
"creator_handles": [
"string"
],
"creator_emails": [
"string"
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | ListMembersResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Delete a list (soft)
DELETE /lists/{list_id}
Sets state=archived. Idempotent — already-archived returns 200.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| list_id | path | integer | true | none |
| Idempotency-Key | header | any | false | none |
| X-Dry-Run | header | any | false | none |
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
| 400 | Bad Request | Bad Request | WriteErrorResponse |
| 403 | Forbidden | Forbidden | WriteErrorResponse |
| 404 | Not Found | Not Found | WriteErrorResponse |
| 409 | Conflict | Conflict | WriteErrorResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
| 429 | Too Many Requests | Too Many Requests | WriteErrorResponse |
Response Schema
CRM Groups
List CRM Groups
GET /crm-groups
Paginated list of CRM Groups for this shop — creator cohorts you can target or exclude in automations. Membership is live for filter-built groups and frozen for groups built from a dashboard segment; see conditions on each group. Create segment-based groups with POST /crm-groups/from-segment; filter-built groups are still portal-only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| page | query | integer | false | none |
| page_size | query | integer | false | none |
| name_contains | query | any | false | none |
Example responses
200 Response
{
"data": [
{
"crm_group_id": "string",
"name": "string",
"description": "string",
"conditions": [
{
"field": "string",
"operator": "string",
"value": null,
"value_count": 0
}
],
"creator_count": 0,
"last_synced_at": "string",
"members_last_changed_at": "string"
}
],
"pagination": null
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | CrmGroupsPaginatedResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Create a CRM Group from a dashboard segment
POST /crm-groups/from-segment
Build a group from a Creators-tab segment — a GMV tier, an automation_id, and a date window — rather than from raw filter conditions. Use it to turn 'creators in tier L3 reached by automation 812 last month' into a reusable cohort you can target with an automation.
Membership is a snapshot. Members are materialized once at creation and do not update as creators enter or leave the segment. Re-post to refresh.
The window is always bounded. Omit start_date/end_date and the segment resolves over the trailing 28 days rather than the shop's whole history; the maximum span is 365 days. Pass both dates explicitly whenever the segment you have in mind is a specific period.
Creation upserts by name. Reusing an existing group_name in this shop overwrites that group's definition and replaces its members.
Expect fewer creators than the dashboard shows. Only CRM-tracked creators can be grouped, so DM-only and organic creators in the segment resolve to nothing. handles_resolved is what the segment matched; creator_count is what made it into the group. The gap between them is that drop-off — check it before treating the group as the segment.
X-Dry-Run: true reports the segment size and whether it exceeds the group limit, without writing. It cannot show the CRM drop-off: that is only known once the group is built.
Body parameter
{
"group_name": "string",
"tier": "string",
"automation_id": 1,
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"group_tags": [
"string"
]
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| Idempotency-Key | header | any | false | none |
| X-Dry-Run | header | any | false | none |
| body | body | CrmGroupFromSegmentRequest | true | none |
Example responses
200 Response
{
"data": {
"crm_group_id": "string",
"name": "string",
"creator_count": 0,
"handles_resolved": 0,
"group_tags": [
"string"
]
},
"dry_run": true
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Dry-run result (X-Dry-Run: true). Nothing was written. | CrmGroupFromSegmentResponse |
| 201 | Created | Successful Response | CrmGroupFromSegmentResponse |
| 400 | Bad Request | Bad Request | WriteErrorResponse |
| 403 | Forbidden | Forbidden | WriteErrorResponse |
| 404 | Not Found | Not Found | WriteErrorResponse |
| 409 | Conflict | Conflict | WriteErrorResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
| 429 | Too Many Requests | Too Many Requests | WriteErrorResponse |
| 500 | Internal Server Error | Internal Server Error | WriteErrorResponse |
Get a CRM Group's filter conditions + member count
GET /crm-groups/{crm_group_id}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| crm_group_id | path | string | true | none |
Example responses
200 Response
{
"data": {
"crm_group_id": "string",
"name": "string",
"description": "string",
"conditions": [
{
"field": "string",
"operator": "string",
"value": null,
"value_count": 0
}
],
"creator_count": 0,
"last_synced_at": "string",
"members_last_changed_at": "string"
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | CrmGroupResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
CRM Tags
Add tags to CRM creators
POST /crm/tags/add
Add one or more tags to creators in this shop's CRM roster. Creator IDs are the creator_id values from GET /crm/creators. Re-adding a tag a creator already has is a no-op; creators_updated counts only rows that actually changed. Requires read_write scope and an Idempotency-Key.
Body parameter
{
"creator_ids": [
"string"
],
"tags": [
"string"
]
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| Idempotency-Key | header | any | false | none |
| body | body | CrmTagsAddRequest | true | none |
Example responses
200 Response
{
"data": {
"operation": "string",
"creators_updated": 0,
"tags": [
"string"
],
"all_tags": false
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | CrmTagsWriteResponse |
| 400 | Bad Request | Bad Request | WriteErrorResponse |
| 403 | Forbidden | Forbidden | WriteErrorResponse |
| 409 | Conflict | Conflict | WriteErrorResponse |
| 422 | Unprocessable Entity | Unprocessable Entity | WriteErrorResponse |
| 429 | Too Many Requests | Too Many Requests | WriteErrorResponse |
| 500 | Internal Server Error | Internal Server Error | WriteErrorResponse |
Remove tags from CRM creators
POST /crm/tags/remove
Remove tags from creators in this shop's CRM roster. Pass tags to remove specific tags, or all_tags: true to clear every tag from the named creators. Removing a tag a creator doesn't have is a no-op. Requires read_write scope and an Idempotency-Key.
Body parameter
{
"creator_ids": [
"string"
],
"tags": [
"string"
],
"all_tags": false
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| Idempotency-Key | header | any | false | none |
| body | body | CrmTagsRemoveRequest | true | none |
Example responses
200 Response
{
"data": {
"operation": "string",
"creators_updated": 0,
"tags": [
"string"
],
"all_tags": false
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | CrmTagsWriteResponse |
| 400 | Bad Request | Bad Request | WriteErrorResponse |
| 403 | Forbidden | Forbidden | WriteErrorResponse |
| 409 | Conflict | Conflict | WriteErrorResponse |
| 422 | Unprocessable Entity | Unprocessable Entity | WriteErrorResponse |
| 429 | Too Many Requests | Too Many Requests | WriteErrorResponse |
| 500 | Internal Server Error | Internal Server Error | WriteErrorResponse |
Usage Rights
List a shop's videos and usage-rights state
GET /usage-rights/videos
The shop's videos with their usage-rights status (requested, accepted, active, declined, …), filterable by status, search, date, GMV/views, creators, products, and spoken-transcript keywords. Ordered and paginated. Single shop only (set x-shop-id).
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| status | query | any | false | none |
| search | query | any | false | none |
| sort_by | query | any | false | none |
| sort_order | query | string | false | none |
| page | query | integer | false | none |
| page_size | query | integer | false | none |
| date_from | query | any | false | none |
| date_to | query | any | false | none |
| gmv_min | query | any | false | none |
| gmv_max | query | any | false | none |
| views_min | query | any | false | none |
| views_max | query | any | false | none |
| creators | query | any | false | Comma-separated creator handles. |
| product_ids | query | any | false | Comma-separated TikTok product ids. A video matches when the product is the one it is listed under, or appears anywhere in its product anchors. |
| in_library | query | string | false | none |
| transcript_keywords | query | any | false | Comma/newline-separated phrases matched against the spoken transcript. |
| transcript_mode | query | string | false | none |
| transcript_scan_caption | query | boolean | false | none |
| archived | query | string | false | none |
Example responses
200 Response
{
"data": {}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | UsageRightsVideosResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Get a usage-rights record
GET /usage-rights/requests/{usage_right_id}
One usage-rights record by id, scoped to this shop. Returns 404 if the record doesn't exist or belongs to another shop. Single shop only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| usage_right_id | path | string | true | none |
Example responses
200 Response
{
"data": {
"id": "string",
"videoId": "string",
"shopId": 0,
"creatorId": "string",
"creatorAccountId": 0,
"messageText": "string",
"isPaidOffer": false,
"offerAmount": 0,
"currency": "USD",
"usageRightsMonths": 0,
"usageRightsScope": "string",
"usageExclusivityEnabled": true,
"usageExclusivityMonths": 0,
"agreementClause": "string",
"status": "",
"dmStatus": "pending",
"dmSentAt": "string",
"dmError": "string",
"gcsVideoPath": "string",
"respondedAt": "string",
"cancelledAt": "string",
"createdAt": "",
"updatedAt": ""
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | UsageRightsRecordResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Request usage rights for a video
POST /usage-rights/requests
Create a usage-rights request for one of the shop's videos and send the creator the outreach DM. The video must be the shop's own; the creator is canonicalised from the live video owner (a mismatched creatorId is rejected). If the DM can't be delivered the request is rolled back and 422 DM_NOT_DELIVERED is returned — so the call is all-or-nothing. Requires read_write scope and an Idempotency-Key. Single shop only.
Body parameter
{
"usageRightsMonths": 120,
"usageRightsScope": "organic_only",
"usageExclusivityEnabled": true,
"usageExclusivityMonths": 1,
"agreementClause": "string",
"videoId": "string",
"creatorId": "string",
"messageText": "string",
"isPaidOffer": false,
"offerAmount": 0
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| Idempotency-Key | header | any | false | none |
| body | body | UsageRightsCreateRequest | true | none |
Example responses
201 Response
{
"data": {
"id": "string",
"videoId": "string",
"shopId": 0,
"creatorId": "string",
"creatorAccountId": 0,
"messageText": "string",
"isPaidOffer": false,
"offerAmount": 0,
"currency": "USD",
"usageRightsMonths": 0,
"usageRightsScope": "string",
"usageExclusivityEnabled": true,
"usageExclusivityMonths": 0,
"agreementClause": "string",
"status": "",
"dmStatus": "pending",
"dmSentAt": "string",
"dmError": "string",
"gcsVideoPath": "string",
"respondedAt": "string",
"cancelledAt": "string",
"createdAt": "",
"updatedAt": ""
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 201 | Created | Successful Response | UsageRightsRecordResponse |
| 400 | Bad Request | Bad Request | WriteErrorResponse |
| 403 | Forbidden | Forbidden | WriteErrorResponse |
| 404 | Not Found | Not Found | WriteErrorResponse |
| 409 | Conflict | Conflict | WriteErrorResponse |
| 422 | Unprocessable Entity | Unprocessable Entity | WriteErrorResponse |
| 429 | Too Many Requests | Too Many Requests | WriteErrorResponse |
| 500 | Internal Server Error | Internal Server Error | WriteErrorResponse |
Cancel a usage-rights request
POST /usage-rights/requests/{usage_right_id}/cancel
Cancel a pending usage-rights request (status requested, accepted, or pending_payment). No-op-safe: cancelling an already-terminal record returns 409. Requires read_write scope and an Idempotency-Key. Single shop only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| usage_right_id | path | string | true | none |
| Idempotency-Key | header | any | false | none |
Example responses
200 Response
{
"data": {
"id": "string",
"videoId": "string",
"shopId": 0,
"creatorId": "string",
"creatorAccountId": 0,
"messageText": "string",
"isPaidOffer": false,
"offerAmount": 0,
"currency": "USD",
"usageRightsMonths": 0,
"usageRightsScope": "string",
"usageExclusivityEnabled": true,
"usageExclusivityMonths": 0,
"agreementClause": "string",
"status": "",
"dmStatus": "pending",
"dmSentAt": "string",
"dmError": "string",
"gcsVideoPath": "string",
"respondedAt": "string",
"cancelledAt": "string",
"createdAt": "",
"updatedAt": ""
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | UsageRightsRecordResponse |
| 400 | Bad Request | Bad Request | WriteErrorResponse |
| 403 | Forbidden | Forbidden | WriteErrorResponse |
| 404 | Not Found | Not Found | WriteErrorResponse |
| 409 | Conflict | Conflict | WriteErrorResponse |
| 422 | Unprocessable Entity | Unprocessable Entity | WriteErrorResponse |
| 429 | Too Many Requests | Too Many Requests | WriteErrorResponse |
| 500 | Internal Server Error | Internal Server Error | WriteErrorResponse |
Discovery Agent
List the shop's Discovery Agent creator profiles
GET /discovery/profiles
Every visible Discovery Agent profile for the shop. A profile is a titled creator brief — a search_query plus optional structured filters (gender, age, ethnicity, region) — that Reacher either generated from the shop's catalog (source = generated) or a user created by hand.
Each row carries id (pass it to the creator listing below), title, description, search_query, filters, creator_count (the size of its last resolved match set), hide_unsafe, is_active, last_search_at and the created/updated timestamps. Hidden and deleted profiles are excluded; has_profiles is false for a shop that has never generated any.
Single-shop only. Read-only — creating, editing and deleting profiles is not exposed on the public API.
Example responses
200 Response
{
"shop_id": 0,
"profiles": [
{
"id": 0,
"title": "string",
"description": "string",
"search_query": "string",
"filters": {},
"source": "string",
"is_active": true,
"vault_file_resource_id": 0,
"is_hidden": true,
"is_deleted": true,
"hide_unsafe": true,
"creator_count": 0,
"last_search_at": "2019-08-24T14:15:22Z",
"created_at": "2019-08-24T14:15:22Z",
"updated_at": "2019-08-24T14:15:22Z",
"deleted_at": "2019-08-24T14:15:22Z"
}
],
"has_profiles": true,
"total_profiles": 0
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | modules__discovery_agent__DiscoveryAgentModels__ProfileListResponse |
Create a Discovery Agent creator profile
POST /discovery/profiles
Create a new creator brief for the shop — a search_query plus optional demographic filters — and resolve it immediately, so the response carries the creator_count it matched.
The brief is created with source: user_created and shows up in GET /discovery/profiles right away. The stored title is regenerated from the query and filters rather than kept verbatim, so read it back from the response instead of assuming what you sent.
Requires read_write scope and an Idempotency-Key header — a replay of the same key and body returns the original 201 rather than creating a second brief. Single-shop only.
Body parameter
{
"title": "string",
"search_query": "string",
"description": "string",
"filters": {}
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| Idempotency-Key | header | any | false | none |
| body | body | DiscoveryProfileCreateBody | true | none |
Example responses
201 Response
{
"success": true,
"profile": {
"id": 0,
"title": "string",
"description": "string",
"search_query": "string",
"filters": {},
"source": "string",
"is_active": true,
"vault_file_resource_id": 0,
"is_hidden": true,
"is_deleted": true,
"hide_unsafe": true,
"creator_count": 0,
"last_search_at": "2019-08-24T14:15:22Z",
"created_at": "2019-08-24T14:15:22Z",
"updated_at": "2019-08-24T14:15:22Z",
"deleted_at": "2019-08-24T14:15:22Z"
},
"creator_count": 0
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 201 | Created | Successful Response | CreateProfileResponse |
| 400 | Bad Request | Validation error, or a missing/oversized Idempotency-Key. | None |
| 403 | Forbidden | API key lacks read_write scope (WRITE_NOT_PERMITTED). |
None |
| 404 | Not Found | Resource does not exist, or belongs to another shop. | None |
| 409 | Conflict | Idempotency conflict, or the resource already exists. | None |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
| 429 | Too Many Requests | Write-tier rate limit (10/min, 50/hour, 100/day) exceeded. | None |
One Discovery Agent profile
GET /discovery/profiles/{profile_id}
A single Discovery Agent profile by ID — the same record the list endpoint returns, fetched directly when you already hold the ID.
Returns 404 when the profile doesn't exist or belongs to a different shop; a profile is only ever visible to the shop that owns it. Unlike the list endpoint this also returns hidden profiles, so a stored ID keeps resolving after a user hides it in the portal.
Single-shop only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| profile_id | path | integer | true | Discovery Agent profile ID. |
Example responses
200 Response
{
"id": 0,
"title": "string",
"description": "string",
"search_query": "string",
"filters": {},
"source": "string",
"is_active": true,
"vault_file_resource_id": 0,
"is_hidden": true,
"is_deleted": true,
"hide_unsafe": true,
"creator_count": 0,
"last_search_at": "2019-08-24T14:15:22Z",
"created_at": "2019-08-24T14:15:22Z",
"updated_at": "2019-08-24T14:15:22Z",
"deleted_at": "2019-08-24T14:15:22Z"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | ProfileData |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Update a Discovery Agent creator profile
PATCH /discovery/profiles/{profile_id}
Partially update one brief — only the fields you send are changed.
Changing search_query or filters re-derives the stored title and re-resolves the match set, and if the brief already backs a Vault list that list is re-synced. Editing a Reacher-generated brief flips its source to user_created; it is then yours and is no longer regenerated.
is_deleted is not settable here — use DELETE /discovery/profiles/{profile_id} — so a PATCH can never silently retire a brief.
Returns 404 if the profile does not exist or belongs to another shop. Requires read_write scope. Single-shop only.
Body parameter
{
"title": "string",
"description": "string",
"search_query": "string",
"filters": {},
"is_active": true,
"is_hidden": true,
"hide_unsafe": true
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| profile_id | path | integer | true | Discovery Agent profile ID. |
| Idempotency-Key | header | any | false | none |
| body | body | DiscoveryProfileUpdateBody | true | none |
Example responses
200 Response
{
"success": true,
"profile": {
"id": 0,
"title": "string",
"description": "string",
"search_query": "string",
"filters": {},
"source": "string",
"is_active": true,
"vault_file_resource_id": 0,
"is_hidden": true,
"is_deleted": true,
"hide_unsafe": true,
"creator_count": 0,
"last_search_at": "2019-08-24T14:15:22Z",
"created_at": "2019-08-24T14:15:22Z",
"updated_at": "2019-08-24T14:15:22Z",
"deleted_at": "2019-08-24T14:15:22Z"
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | UpdateProfileResponse |
| 400 | Bad Request | Validation error, or a missing/oversized Idempotency-Key. | None |
| 403 | Forbidden | API key lacks read_write scope (WRITE_NOT_PERMITTED). |
None |
| 404 | Not Found | Resource does not exist, or belongs to another shop. | None |
| 409 | Conflict | Idempotency conflict, or the resource already exists. | None |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
| 429 | Too Many Requests | Write-tier rate limit (10/min, 50/hour, 100/day) exceeded. | None |
Delete a Discovery Agent creator profile
DELETE /discovery/profiles/{profile_id}
Soft-delete one brief. The row is retained and marked deleted, so the profile disappears from GET /discovery/profiles but any Vault list already saved from it is untouched — deleting the brief never deletes creators you saved.
Returns 404 if the profile does not exist or belongs to another shop. Requires read_write scope. Single-shop only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| profile_id | path | integer | true | Discovery Agent profile ID. |
| Idempotency-Key | header | any | false | none |
Example responses
200 Response
{
"success": true,
"message": "string"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | DeleteProfileResponse |
| 400 | Bad Request | Validation error, or a missing/oversized Idempotency-Key. | None |
| 403 | Forbidden | API key lacks read_write scope (WRITE_NOT_PERMITTED). |
None |
| 404 | Not Found | Resource does not exist, or belongs to another shop. | None |
| 409 | Conflict | Idempotency conflict, or the resource already exists. | None |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
| 429 | Too Many Requests | Write-tier rate limit (10/min, 50/hour, 100/day) exceeded. | None |
Creators matching a Discovery Agent profile
POST /discovery/profiles/{profile_id}/creators
Resolve one profile to its matching creators. The profile's search_query and its structured filters are combined into the search that runs, so this returns exactly what the portal shows under that profile.
This is a read — POST only because the optional filters payload is a nested object that doesn't survive a query string. Nothing is created or modified.
Paginate with page / limit (max 1000 per page); total_creators is the full match count. Sort by any of: relevance_score, follower_count, gmv_num, avg_views, engagement_rate_segment. Supply filters to narrow the set further without editing the profile.
Each creator row carries its handle, follower/GMV/engagement metrics, categories, bio and the relevance_score that ordered it. Creator email addresses are omitted, matching the /ai-search surface.
Returns 404 when the profile doesn't exist or belongs to a different shop. Single-shop only.
Body parameter
{
"page": 1,
"limit": 100,
"sort_by": "relevance_score",
"sort_order": "desc",
"filters": {}
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| profile_id | path | integer | true | Discovery Agent profile ID. |
| body | body | DiscoveryCreatorsBody | true | none |
Example responses
200 Response
{
"profile_id": 0,
"profile_title": "string",
"total_creators": 0,
"page": 0,
"limit": 0,
"creators": [
{}
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | CreatorListResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Save a profile's creators to a Vault list
POST /discovery/profiles/{profile_id}/save-to-list
Resolve one brief and materialize its entire match set into a named Vault list — the bridge from 'who should I recruit?' to an automation you can actually run, since automations target Vault lists rather than briefs.
This is a snapshot: the list holds the creators matching at save time and does not track the brief afterwards. Re-save to refresh. Pass include_emails: true to store the email list alongside the handles, which an email automation needs. Optional filters narrow what gets saved without editing the brief.
Every matching creator is saved, not just the first page, so this can take a while on a broad brief. The response reports creators_saved.
Requires read_write scope and an Idempotency-Key header. Returns 404 if the profile does not exist or belongs to another shop. Single-shop only.
Body parameter
{
"list_name": "string",
"description": "string",
"include_emails": false,
"filters": {}
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| profile_id | path | integer | true | Discovery Agent profile ID. |
| Idempotency-Key | header | any | false | none |
| body | body | DiscoverySaveToListBody | true | none |
Example responses
201 Response
{
"success": true,
"message": "string",
"list_name": "string",
"creators_saved": 0,
"email_list_saved": true
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 201 | Created | Successful Response | SaveListResponse |
| 400 | Bad Request | Validation error, or a missing/oversized Idempotency-Key. | None |
| 403 | Forbidden | API key lacks read_write scope (WRITE_NOT_PERMITTED). |
None |
| 404 | Not Found | Resource does not exist, or belongs to another shop. | None |
| 409 | Conflict | Idempotency conflict, or the resource already exists. | None |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
| 429 | Too Many Requests | Write-tier rate limit (10/min, 50/hour, 100/day) exceeded. | None |
Integrations
Which integrations the shop has connected
GET /integrations/status
The shop's connection matrix — one row per integration Reacher offers it, each with a key, a status and, when connected, the connected_at timestamp.
Covers tiktok_shop_affiliate and tiktok_shop_customer_service (the TikTok Shop apps that back creator outreach and messaging), tiktok_for_business (the ads account behind GMV Max), meta (the Facebook/Instagram account behind Meta Ads rev-share), amazon and shopify (the off-TikTok revenue channels the Halo tracker correlates against), and discord. status is connected, disconnected, or coming_soon where the integration isn't available to this shop's region yet.
Which rows appear is region-dependent: an integration with no presence in the shop's region is omitted rather than returned as disconnected. Use this to explain an empty data surface — Halo with no Amazon revenue and a disconnected amazon row is a setup gap, not missing data.
Connecting an integration is a browser OAuth flow, so the portal's install links are not part of this response. Read-only, single-shop.
Example responses
200 Response
{
"shop_id": 0,
"integrations": [
{
"key": "string",
"status": "string",
"connected_at": "string"
}
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | IntegrationsStatusResponse |
Seller Center
Per-product Seller Center funnel and channel mix
POST /seller-center/products
One row per product for the window, from the Seller Center product-performance rollup.
funnel walks impression → click → add-to-cart → order, and channels splits the product's GMV across the seller's own video and live content, creator (affiliate) video and live, the product card, and the shop tab (with its own impression / visitor / conversion counts).
Every total is a SUM over the window's daily rows and every rate is recomputed as SUM(numerator) / SUM(denominator) — never an average of the daily rate columns, which would weight a quiet day the same as a peak one. A rate is null, not 0, when its denominator is zero.
Sort with sort_by (one of ['gmv', 'orders', 'items_sold', 'customers', 'impressions', 'clicks', 'add_to_cart', 'affiliate_gmv', 'shop_tab_gmv', 'refunds']) and sort_dir; page with page / page_size. Defaults to the last 30 days ending yesterday; max range 90 days. Single-shop only — set x-shop-id to a specific shop ID. An empty result is a normal 200 response: Seller Center collection is per-shop and still rolling out.
Body parameter
{
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"product_id": "string",
"sort_by": "gmv",
"sort_dir": "asc",
"page": 1,
"page_size": 50
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | SellerCenterProductsRequest | true | none |
Example responses
200 Response
{
"shop_id": 0,
"currency_code": "string",
"start_date": "string",
"end_date": "string",
"data": [
{
"product_id": "string",
"product_name": "string",
"product_status": 0,
"cover_image_url": "string",
"days_with_data": 0,
"sales": {
"gmv": 0,
"orders": 0,
"sku_orders": 0,
"items_sold": 0,
"customers": 0,
"aov": 0,
"refunds": 0,
"items_canceled_and_returned": 0
},
"funnel": {
"impressions": 0,
"unique_viewers": 0,
"clicks": 0,
"unique_clickers": 0,
"ctr": 0,
"add_to_cart": 0,
"add_to_cart_rate": 0,
"orders": 0,
"click_to_order_rate": 0
},
"channels": {
"seller": {
"video_gmv": 0,
"live_gmv": 0
},
"affiliate": {
"gmv": 0,
"video_gmv": 0,
"live_gmv": 0
},
"product_card": {
"gmv": 0
},
"shop_tab": {
"gmv": 0,
"listing_impressions": 0,
"page_views": 0,
"unique_visitors": 0,
"customers": 0,
"items_sold": 0,
"ctr": 0
}
}
}
],
"pagination": {
"total_count": 0,
"page": 0,
"page_size": 0,
"total_pages": 0
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | SellerCenterProductsResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Shop GMV by channel with TikTok's comparison period
POST /seller-center/shop-overview
Window totals for the whole shop from the Seller Center overview, split by the channel the sale came through: video (creator vs seller), live (creator vs seller), and product card (shop tab vs search), plus product impressions / clicks and the derived click-through rate.
comparison carries the comparison-period totals TikTok attaches to each day, summed across the window, and gmv_change_pct derives the swing. TikTok chooses those periods (typically the immediately preceding equal-length window), so treat it as a directional benchmark rather than a window you control.
Related: POST /shop-gmv/timeseries gives the same channel hierarchy day by day, and POST /shop-gmv/summary gives the window totals without the comparison, product-card counts or listing impressions added here. aov is window GMV / window orders; customers is the sum of daily unique-buyer counts, so a buyer who purchased on two days is counted twice. Max range 90 days. Single-shop only — set x-shop-id to a specific shop ID. An empty result is a normal 200 response: Seller Center collection is per-shop and still rolling out.
Body parameter
{
"start_date": "2019-08-24",
"end_date": "2019-08-24"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | any | false | none |
Example responses
200 Response
{
"shop_id": 0,
"currency_code": "string",
"start_date": "string",
"end_date": "string",
"day_count": 0,
"gmv": 0,
"orders": 0,
"items_sold": 0,
"customers": 0,
"aov": 0,
"channels": {
"video": {
"gmv": 0,
"affiliate": 0,
"seller": 0
},
"live": {
"gmv": 0,
"affiliate": 0,
"seller": 0
},
"product_card": {
"gmv": 0,
"shop_tab": 0,
"search": 0,
"orders": 0,
"customers": 0
}
},
"traffic": {
"product_impressions": 0,
"product_clicks": 0,
"product_ctr": 0,
"shop_tab_listing_impressions": 0
},
"comparison": {
"gmv": 0,
"orders": 0,
"items_sold": 0,
"customers": 0,
"gmv_change_pct": 0
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | SellerCenterShopOverviewResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Shop-tab / search channel stats with industry benchmarks
POST /seller-center/channels
Per-channel performance for the window from the Seller Center shop-tab stats — one entry per channel (shop_tab, search, other) with GMV, impressions, units sold and customers.
baseline is TikTok's previous-period value for the same metrics, summed across the window. industry_median is the typical seller in this shop's industry — a benchmark, not an additive quantity, so it is reported as the most recent day in the window that carried one (as_of) rather than summed or averaged. It is null when TikTok returned no benchmark for the window; the daily collection path does not always include one.
Max range 90 days. Single-shop only — set x-shop-id to a specific shop ID. An empty result is a normal 200 response: Seller Center collection is per-shop and still rolling out.
Body parameter
{
"start_date": "2019-08-24",
"end_date": "2019-08-24"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | any | false | none |
Example responses
200 Response
{
"shop_id": 0,
"currency_code": "string",
"start_date": "string",
"end_date": "string",
"data": [
{
"channel": "string",
"day_count": 0,
"gmv": 0,
"impressions": 0,
"units_sold": 0,
"customers": 0,
"units_per_impression": 0,
"baseline": {
"gmv": 0,
"impressions": 0,
"units_sold": 0,
"customers": 0
},
"industry_median": {
"as_of": "string",
"gmv": 0,
"impressions": 0,
"units_sold": 0,
"customers": 0
}
}
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | SellerCenterChannelsResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Products or videos ranked by new-customer acquisition
GET /seller-center/buyers-ranking
The shop's products (ranking_type=product) or videos (ranking_type=video) ranked by how many new customers they brought in, from customers.sc_buyers_ranking. Use it to find the product or piece of content that actually acquires buyers, as opposed to the one that generates the most GMV from buyers you already had.
customer_contribution is the entity's share (0-1) of the shop's new customers over TikTok's trailing period_months window (12 by default).
No date window: this is a snapshot ranking that TikTok recomputes and the collector overwrites wholesale. Collection of this ranking is currently paused upstream, so the response reflects the last snapshot collected for the shop. Single-shop only — set x-shop-id to a specific shop ID. An empty result is a normal 200 response: Seller Center collection is per-shop and still rolling out.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| ranking_type | query | string | false | Rank products or videos. |
| limit | query | integer | false | Max entries (max 200). |
Enumerated Values
| Parameter | Value |
|---|---|
| ranking_type | product |
| ranking_type | video |
Example responses
200 Response
{
"shop_id": 0,
"data": [
{
"rank": 0,
"ranking_type": "string",
"entity_id": "string",
"entity_name": "string",
"creator_name": "string",
"new_customers": 0,
"customer_contribution": 0,
"period_months": 0,
"customer_type": 0
}
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | BuyersRankingResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Category-trending TikTok videos for this shop's categories
GET /seller-center/trending-videos
The most-viewed videos across the product categories this shop sells in, from customers.sc_top_viewed_videos — competitive intelligence, not the shop's own content (for that use GET /videos).
Each entry carries the video's rank and rank change, the creator's public handle, the view bucket TikTok reports (views_min / views_max — TikTok does not publish an exact count here) and the product the video links to, with its price range and rating.
No date window: the latest collected snapshot is returned, and its range is echoed as start_date / end_date. Collection is currently paused upstream, so the response reflects the last snapshot collected for the shop. Single-shop only — set x-shop-id to a specific shop ID. An empty result is a normal 200 response: Seller Center collection is per-shop and still rolling out.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| limit | query | integer | false | Max videos (max 200). |
Example responses
200 Response
{
"shop_id": 0,
"start_date": "string",
"end_date": "string",
"data": [
{
"video_id": "string",
"video_title": "string",
"thumbnail_url": "string",
"posted_at_epoch": 0,
"creator_name": "string",
"creator_id": "string",
"rank": 0,
"rank_change": 0,
"views_min": 0,
"views_max": 0,
"similar_videos_on_site": 0,
"linked_product": {
"product_id": "string",
"product_name": "string",
"price_min": 0,
"price_max": 0,
"rating": 0,
"review_count": 0
}
}
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | TrendingVideosResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Shop Performance
Shop sales series (GMV, orders, units, visitors, conversion rate)
POST /shop-performance/timeseries
Daily or weekly (Sunday-start) sales for one shop from TikTok's official Seller Center analytics. Each bucket says how many days it covers and whether it is complete, so a partial current week is never mistaken for a decline. Window: a preset (7d, 30d, 90d, 12m, all) ending at the shop's newest stored day, or explicit start_date/end_date; max 365 days. Single-shop only. An empty points list is a normal 200 for shops the collector does not cover yet.
Body parameter
{
"preset": "string",
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"granularity": "day"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | SeriesRequest | true | none |
Example responses
200 Response
{
"shop_id": 0,
"currency_code": "string",
"start_date": "string",
"end_date": "string",
"granularity": "day",
"week_start": "sunday",
"latest_available_date": "string",
"earliest_available_date": "string",
"is_complete": true,
"points": [
{
"date": "string",
"date_end": "string",
"days_expected": 0,
"days_observed": 0,
"is_complete": true,
"currency_code": "string",
"gmv": 0,
"video_attributed_gmv": 0,
"live_attributed_gmv": 0,
"product_card_gmv": 0,
"gross_revenue": 0,
"refunds": 0,
"orders": 0,
"sku_orders": 0,
"items_sold": 0,
"customers": 0,
"page_views": 0,
"visitors": 0,
"conversion_rate": 0
}
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | ShopPerformanceSeriesResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Shop sales by channel (creators, own videos, own lives, product page)
POST /shop-performance/channels
The same window as /shop-performance/timeseries split by sales channel: affiliate (creator) GMV with its video/live parts, the shop's own video and live GMV, product-card GMV, shop-tab GMV, plus clicks, impressions and orders per channel. affiliate_gmv already includes affiliate_video_gmv and affiliate_live_gmv, and shop_tab_gmv overlaps the four channels rather than adding to them: gmv = affiliate + seller_video + seller_live + product_card (+ other_gmv). Single-shop only.
Body parameter
{
"preset": "string",
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"granularity": "day"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | SeriesRequest | true | none |
Example responses
200 Response
{
"shop_id": 0,
"currency_code": "string",
"start_date": "string",
"end_date": "string",
"granularity": "day",
"week_start": "sunday",
"latest_available_date": "string",
"earliest_available_date": "string",
"is_complete": true,
"points": [
{
"date": "string",
"date_end": "string",
"days_expected": 0,
"days_observed": 0,
"is_complete": true,
"currency_code": "string",
"gmv": 0,
"refunds": 0,
"other_gmv": 0,
"orders": 0,
"items_sold": 0,
"product_impressions": 0,
"product_clicks": 0,
"add_cart_count": 0,
"product_count": 0,
"affiliate_gmv": 0,
"affiliate_orders": 0,
"affiliate_clicks": 0,
"affiliate_impressions": 0,
"affiliate_video_gmv": 0,
"affiliate_video_clicks": 0,
"affiliate_video_impressions": 0,
"affiliate_live_gmv": 0,
"affiliate_live_clicks": 0,
"affiliate_live_impressions": 0,
"seller_video_gmv": 0,
"seller_video_orders": 0,
"seller_video_clicks": 0,
"seller_video_impressions": 0,
"seller_live_gmv": 0,
"seller_live_orders": 0,
"seller_live_clicks": 0,
"seller_live_impressions": 0,
"product_card_gmv": 0,
"product_card_orders": 0,
"product_card_clicks": 0,
"product_card_impressions": 0,
"shop_tab_gmv": 0,
"shop_tab_sold_items": 0,
"shop_tab_clicks": 0,
"shop_tab_impressions": 0,
"pages_fetched": 0,
"is_walk_complete": true
}
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | ShopChannelSplitSeriesResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Top products over the window, with GMV and orders by channel
POST /shop-performance/products
One shop's products summed over the window from TikTok's daily product list, ranked by sort (gmv, orders, product_clicks or add_cart_count), limit products per page; product_total says how many products the window held in all. Products the catalogue knows are deactivated or rejected are left out unless include_inactive is true; each row carries listing_status (live, out_of_stock, seller_deactivated, platform_deactivated, rejected, or null when unknown) and the listed price_min/price_max in price_currency; listing_data_available is false when the catalogue could not be read (nothing excluded, listings null). Per product: GMV, refunds, orders, units, impressions, clicks, add-to-cart, and GMV plus orders for each channel — creators (affiliate), the shop's own videos and lives, product page — with shop_tab_gmv as an overlapping view and other_gmv the remainder: gmv = affiliate + seller_video + seller_live + product_card + other. Same window grammar as /shop-performance/timeseries. Single-shop only; a product's days_observed says on how many days of the window TikTok listed it.
Body parameter
{
"preset": "string",
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"limit": 20,
"page": 1,
"sort": "gmv",
"include_inactive": false
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | ProductsRequest | true | none |
Example responses
200 Response
{
"shop_id": 0,
"currency_code": "string",
"start_date": "string",
"end_date": "string",
"latest_available_date": "string",
"earliest_available_date": "string",
"sort": "gmv",
"page": 1,
"product_total": 0,
"listing_data_available": true,
"products": [
{
"product_id": "string",
"product_name": "string",
"image_url": "string",
"days_observed": 0,
"listing_status": "live",
"price_min": 0,
"price_max": 0,
"price_currency": "string",
"currency_code": "string",
"gmv": 0,
"refunds": 0,
"orders": 0,
"items_sold": 0,
"product_impressions": 0,
"product_clicks": 0,
"add_cart_count": 0,
"affiliate_gmv": 0,
"affiliate_orders": 0,
"seller_video_gmv": 0,
"seller_video_orders": 0,
"seller_live_gmv": 0,
"seller_live_orders": 0,
"product_card_gmv": 0,
"product_card_orders": 0,
"shop_tab_gmv": 0,
"other_gmv": 0
}
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | ShopProductsByChannelResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Campaign Content & Challenges
Exclude videos from a campaign
POST /campaigns/{campaign_id}/content/exclusions
Stop one or more of a campaign's videos from counting toward its results — leaderboard standings, stats and payout eligibility are re-aggregated once for the whole batch before the response returns, so send the entire selection in ONE call rather than one call per video.
Every video id must already belong to this campaign (unknown ids → 404). At least one reasons code is required and a note is mandatory when the reason is other, because the reason reaches the creator. Rejected with 409 when the campaign's results are already final, or when it is a LIVE campaign (scored from live sessions, which can't be excluded individually).
Requires read_write scope and an Idempotency-Key; X-Dry-Run: true echoes the intended change without writing.
Body parameter
{
"video_ids": [
"string"
],
"reasons": [
"guidelines"
],
"note": ""
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| campaign_id | path | integer | true | none |
| Idempotency-Key | header | any | false | none |
| X-Dry-Run | header | any | false | none |
| body | body | ExcludeVideosRequest | true | none |
Example responses
200 Response
{
"success": true,
"code": "string",
"data": {
"excluded_video_ids": [
"string"
],
"already_excluded_video_ids": [
"string"
]
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
| 400 | Bad Request | Validation error, multi-shop key, or missing Idempotency-Key. |
None |
| 403 | Forbidden | API key lacks read_write scope (WRITE_NOT_PERMITTED). |
None |
| 404 | Not Found | Campaign / template / job not in this shop. | None |
| 409 | Conflict | Campaign results are final, campaign is LIVE-scored, template cap reached, or Idempotency-Key conflict. |
None |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
| 429 | Too Many Requests | Write-tier rate limit (10/min, 50/hr, 100/day) exceeded. | None |
Response Schema
Status Code 200
Response Campaign Exclude Videos
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| Response Campaign Exclude Videos | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | ExcludeVideosResponse | false | none | none |
| »» success | boolean | true | none | none |
| »» code | string | true | none | none |
| »» data | ExcludeVideosData | true | none | none |
| »»» excluded_video_ids | [string] | true | none | none |
| »»» already_excluded_video_ids | [string] | true | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | ExcludeVideosDryRunResponse | false | none | none |
| »» dry_run | boolean | true | none | none |
| »» would | ExcludeVideosDryRunData | true | none | none |
| »»» action | string | true | none | none |
| »»» campaign_id | integer | true | none | none |
| »»» video_ids | [string] | true | none | none |
| »»» reasons | [string] | true | none | none |
| »»» note | string | true | none | none |
Restore previously excluded videos
POST /campaigns/{campaign_id}/content/exclusions/restore
Count one or more previously excluded videos toward the campaign again — the inverse of the exclude call, batched and re-aggregated the same way. Ids that were never excluded are simply no-ops.
Same 409 guards apply: a campaign whose results are final, or a LIVE campaign, cannot be changed.
Requires read_write scope and an Idempotency-Key; X-Dry-Run: true echoes the intended change without writing.
Body parameter
{
"video_ids": [
"string"
]
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| campaign_id | path | integer | true | none |
| Idempotency-Key | header | any | false | none |
| X-Dry-Run | header | any | false | none |
| body | body | RestoreVideosRequest | true | none |
Example responses
200 Response
{
"success": true,
"code": "string",
"data": {
"restored_video_ids": [
"string"
],
"not_excluded_video_ids": [
"string"
]
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
| 400 | Bad Request | Validation error, multi-shop key, or missing Idempotency-Key. |
None |
| 403 | Forbidden | API key lacks read_write scope (WRITE_NOT_PERMITTED). |
None |
| 404 | Not Found | Campaign / template / job not in this shop. | None |
| 409 | Conflict | Campaign results are final, campaign is LIVE-scored, template cap reached, or Idempotency-Key conflict. |
None |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
| 429 | Too Many Requests | Write-tier rate limit (10/min, 50/hr, 100/day) exceeded. | None |
Response Schema
Status Code 200
Response Campaign Restore Videos
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| Response Campaign Restore Videos | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | RestoreVideosResponse | false | none | none |
| »» success | boolean | true | none | none |
| »» code | string | true | none | none |
| »» data | RestoreVideosData | true | none | none |
| »»» restored_video_ids | [string] | true | none | none |
| »»» not_excluded_video_ids | [string] | true | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | RestoreVideosDryRunResponse | false | none | none |
| »» dry_run | boolean | true | none | none |
| »» would | RestoreVideosDryRunData | true | none | none |
| »»» action | string | true | none | none |
| »»» campaign_id | integer | true | none | none |
| »»» video_ids | [string] | true | none | none |
Preview a bulk exclusion (writes nothing)
POST /campaigns/{campaign_id}/content/exclusions/preview
Dry run for a batch of video ids: resolves which campaigns each id actually appears in and returns the summary — matched, unknown, and skipped-because-ended — WITHOUT writing anything.
scope defaults to campaign (act only on this campaign, what a brand expects from a button on one campaign's Content tab). scope: shop is the opt-in that also resolves every OTHER campaign the video appears in — far more destructive, so it is never implied. Always preview a shop-scoped batch before applying it.
Read-only, but gated on read_write scope: it is the first step of the bulk-exclusion write flow and reveals exactly what that flow would change. No Idempotency-Key needed (nothing is written).
Body parameter
{
"video_ids": [
"string"
],
"scope": "campaign"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| campaign_id | path | integer | true | none |
| body | body | BulkExclusionPreviewRequest | true | none |
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
| 400 | Bad Request | Validation error, multi-shop key, or missing Idempotency-Key. |
None |
| 403 | Forbidden | API key lacks read_write scope (WRITE_NOT_PERMITTED). |
None |
| 404 | Not Found | Campaign / template / job not in this shop. | None |
| 409 | Conflict | Campaign results are final, campaign is LIVE-scored, template cap reached, or Idempotency-Key conflict. |
None |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
| 429 | Too Many Requests | Write-tier rate limit (10/min, 50/hr, 100/day) exceeded. | None |
Response Schema
Apply a bulk exclusion as a background job
POST /campaigns/{campaign_id}/content/exclusions/bulk
Applies a batch of video ids across every campaign the chosen scope resolves to. Returns a job_id IMMEDIATELY — a wide sweep costs one full re-aggregation per campaign and would outlive the request otherwise. Poll GET /campaigns/{campaign_id}/content/exclusions/jobs/{job_id} for progress.
The job RE-RESOLVES the targets rather than trusting a preview: minutes can pass between preview and apply, and in that window a creator can be removed or another manager can exclude the same video.
Same scope semantics and reason/note rules as the preview and single-exclude calls. Requires read_write scope and an Idempotency-Key; X-Dry-Run: true echoes the intended job without enqueuing it.
Body parameter
{
"video_ids": [
"string"
],
"reasons": [
"guidelines"
],
"note": "",
"scope": "campaign",
"source_file": "string"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| campaign_id | path | integer | true | none |
| Idempotency-Key | header | any | false | none |
| X-Dry-Run | header | any | false | none |
| body | body | BulkExcludeVideosRequest | true | none |
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
| 400 | Bad Request | Validation error, multi-shop key, or missing Idempotency-Key. |
None |
| 403 | Forbidden | API key lacks read_write scope (WRITE_NOT_PERMITTED). |
None |
| 404 | Not Found | Campaign / template / job not in this shop. | None |
| 409 | Conflict | Campaign results are final, campaign is LIVE-scored, template cap reached, or Idempotency-Key conflict. |
None |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
| 429 | Too Many Requests | Write-tier rate limit (10/min, 50/hr, 100/day) exceeded. | None |
Response Schema
Get the campaign's still-running exclusion job
GET /campaigns/{campaign_id}/content/exclusions/jobs/active
The bulk-exclusion job still running for this campaign, if any — so a caller that lost the job_id (a reload, a crashed worker) can rejoin it instead of re-uploading. data is null when nothing is running. Read-only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| campaign_id | path | integer | true | none |
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Response Schema
Get bulk exclusion job progress
GET /campaigns/{campaign_id}/content/exclusions/jobs/{job_id}
Progress for one bulk-exclusion job: status, campaigns processed vs total, whole-percent progress, exclusions applied, per-campaign errors, and is_terminal. Poll until is_terminal is true. Read-only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| campaign_id | path | integer | true | none |
| job_id | path | string | true | none |
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
| 404 | Not Found | Job not found for this campaign/shop. | None |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Response Schema
Create a micro-challenge on a campaign
POST /campaigns/{campaign_id}/micro-challenges
Creates a micro-challenge ('weekend blitz') under a parent Leaderboard (contest) campaign — a short scoring window with its own pricing and its own board.
Two shapes, discriminated by schedule.mode:
one_off— an explicitstart_at/end_atwindow (shop-local); materializes an instance immediately.recurring— a weekly window (start_dow/start_time→end_dow/end_time, day 0 = Monday, shop-local); creates a TEMPLATE that the daily materializer turns into instances. UsePOST /micro-challenges/preview-windowto see the next window a draft recurring schedule would produce.
Rejected when the parent isn't a running contest campaign, when it is itself a micro-challenge (no nesting), or when the parent already has the maximum number of ACTIVE templates (409).
Requires read_write scope and an Idempotency-Key; X-Dry-Run: true validates the shop/campaign and echoes the payload without creating anything.
Body parameter
{
"name": "string",
"schedule": {
"mode": "one_off",
"start_at": "2019-08-24T14:15:22Z",
"end_at": "2019-08-24T14:15:22Z"
},
"pricing": {
"campaign_type": "leaderboard",
"leaderboard_ranks": [
{
"rank": 1,
"reward": 0
}
],
"reward_type": "cash",
"metric_type": "gmv",
"scoring_mode": "single",
"weighted_metrics": [
{
"metric_type": "gmv",
"weight": 100
}
],
"minimum_gmv_required": 0,
"minimum_views_required": 0,
"minimum_videos_required": 0,
"minimum_live_gmv_required": 0,
"minimum_sessions_required": 0
},
"excluded_creator_ids": [
0
]
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| campaign_id | path | integer | true | none |
| Idempotency-Key | header | any | false | none |
| X-Dry-Run | header | any | false | none |
| body | body | MicroChallengeCreate | true | none |
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
| 400 | Bad Request | Validation error, multi-shop key, or missing Idempotency-Key. |
None |
| 403 | Forbidden | API key lacks read_write scope (WRITE_NOT_PERMITTED). |
None |
| 404 | Not Found | Campaign / template / job not in this shop. | None |
| 409 | Conflict | Campaign results are final, campaign is LIVE-scored, template cap reached, or Idempotency-Key conflict. |
None |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
| 429 | Too Many Requests | Write-tier rate limit (10/min, 50/hr, 100/day) exceeded. | None |
Response Schema
List a campaign's micro-challenges
GET /campaigns/{campaign_id}/micro-challenges
The campaign's recurring micro-challenge TEMPLATES (with their schedule, pricing and active/paused status) alongside the INSTANCES already materialized from them plus any one-off windows. Read-only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| campaign_id | path | integer | true | none |
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Response Schema
Edit or pause a micro-challenge template
PATCH /campaigns/{campaign_id}/micro-challenges/{template_id}
Partial update of a RECURRING template — name, window (start_dow/start_time/end_dow/end_time, or an equivalent nested schedule object), pricing, excluded creators, or status: paused to stop it producing new instances.
Affects FUTURE instances only: windows already materialized are never rewritten. When a not-yet-started instance exists for the template, it is returned as already_scheduled_instance so the caller can see what the edit did not touch. Ownership is enforced on the full (template, campaign, shop) triple — a template id from another campaign 404s.
Requires read_write scope and an Idempotency-Key; X-Dry-Run: true echoes the patch without applying it.
Body parameter
{
"name": "string",
"schedule": {
"mode": "one_off",
"start_at": "2019-08-24T14:15:22Z",
"end_at": "2019-08-24T14:15:22Z"
},
"start_dow": 6,
"start_time": "14:15:22Z",
"end_dow": 6,
"end_time": "14:15:22Z",
"pricing": {
"campaign_type": "leaderboard",
"leaderboard_ranks": [
{
"rank": 1,
"reward": 0
}
],
"reward_type": "cash",
"metric_type": "gmv",
"scoring_mode": "single",
"weighted_metrics": [
{
"metric_type": "gmv",
"weight": 100
}
],
"minimum_gmv_required": 0,
"minimum_views_required": 0,
"minimum_videos_required": 0,
"minimum_live_gmv_required": 0,
"minimum_sessions_required": 0
},
"excluded_creator_ids": [
0
],
"status": "active"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| campaign_id | path | integer | true | none |
| template_id | path | integer | true | none |
| Idempotency-Key | header | any | false | none |
| X-Dry-Run | header | any | false | none |
| body | body | MicroChallengeTemplateUpdate | true | none |
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
| 400 | Bad Request | Validation error, multi-shop key, or missing Idempotency-Key. |
None |
| 403 | Forbidden | API key lacks read_write scope (WRITE_NOT_PERMITTED). |
None |
| 404 | Not Found | Campaign / template / job not in this shop. | None |
| 409 | Conflict | Campaign results are final, campaign is LIVE-scored, template cap reached, or Idempotency-Key conflict. |
None |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
| 429 | Too Many Requests | Write-tier rate limit (10/min, 50/hr, 100/day) exceeded. | None |
Response Schema
Delete a micro-challenge template
DELETE /campaigns/{campaign_id}/micro-challenges/{template_id}
Soft-deletes a recurring template so it stops materializing new windows. Instances it ALREADY produced are untouched — their standings and payouts stand. Ownership is enforced on the full (template, campaign, shop) triple.
Requires read_write scope and an Idempotency-Key; X-Dry-Run: true reports what would be deleted without deleting it.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| campaign_id | path | integer | true | none |
| template_id | path | integer | true | none |
| Idempotency-Key | header | any | false | none |
| X-Dry-Run | header | any | false | none |
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
| 400 | Bad Request | Validation error, multi-shop key, or missing Idempotency-Key. |
None |
| 403 | Forbidden | API key lacks read_write scope (WRITE_NOT_PERMITTED). |
None |
| 404 | Not Found | Campaign / template / job not in this shop. | None |
| 409 | Conflict | Campaign results are final, campaign is LIVE-scored, template cap reached, or Idempotency-Key conflict. |
None |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
| 429 | Too Many Requests | Write-tier rate limit (10/min, 50/hr, 100/day) exceeded. | None |
Response Schema
Preview the next window of a draft recurring schedule
POST /micro-challenges/preview-window
Resolves a draft weekly schedule (start_dow/start_time → end_dow/end_time, day 0 = Monday) against the shop's timezone and returns the next concrete window it would produce — so a caller can confirm the window before creating a template.
Shop-scoped, NOT campaign-nested: the create flow has no campaign yet when the schedule is being drafted. The shop comes from x-shop-id; a shop_id in the body is ignored.
Writes nothing, but gated on read_write scope as the first step of the micro-challenge create flow. No Idempotency-Key needed.
Body parameter
{
"shop_id": 0,
"start_dow": 6,
"start_time": "14:15:22Z",
"end_dow": 6,
"end_time": "14:15:22Z"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | PreviewWindowRequest | true | none |
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
| 400 | Bad Request | Validation error, multi-shop key, or missing Idempotency-Key. |
None |
| 403 | Forbidden | API key lacks read_write scope (WRITE_NOT_PERMITTED). |
None |
| 404 | Not Found | Campaign / template / job not in this shop. | None |
| 409 | Conflict | Campaign results are final, campaign is LIVE-scored, template cap reached, or Idempotency-Key conflict. |
None |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
| 429 | Too Many Requests | Write-tier rate limit (10/min, 50/hr, 100/day) exceeded. | None |
Response Schema
Shared Dashboards
List your shared dashboard links
GET /shared-dashboards
Every share link the API key can see, one per shop that has one — uuid, the viewer share_url, status, any locked reporting window, and the report_config describing which cards the viewer sees.
The password is never returned; it is stored only as a hash. A shop with no link is simply absent from the list rather than returned as null. Works with a multi-shop key.
Read-only — no read_write scope needed.
Example responses
200 Response
{
"data": [
{
"uuid": "string",
"share_url": "string",
"status": "string",
"created_at": "string",
"locked_start_date": "2019-08-24",
"locked_end_date": "2019-08-24",
"report_config": {
"v": 1,
"metrics": [
"string"
],
"modules": {
"property1": true,
"property2": true
}
},
"shop_id": 0
}
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | SharedDashboardListResponse |
Create a shared dashboard link
POST /shared-dashboards
Mint a password-protected, publicly-reachable dashboard link for the shop — the thing a brand sends an agency or an investor. The response carries the uuid and the share_url to hand out; the password is never echoed back, so store what you sent.
One live link per shop: creating a second while one is active returns 409. Archive the old one first with DELETE, which mints a fresh uuid and password on the next create rather than resurrecting the old link.
Optionally lock the link to a fixed reporting window (locked_start_date + locked_end_date, both or neither) and choose what it shows via report_config. Outreach-volume metrics — TC invites, DMs sent, creators reached, sample counts — cannot be put on a share link and are rejected.
Requires read_write scope and an Idempotency-Key header. Single-shop only.
Body parameter
{
"password": "string",
"locked_start_date": "2019-08-24",
"locked_end_date": "2019-08-24",
"report_config": {
"v": 1,
"metrics": [
"string"
],
"modules": {
"property1": true,
"property2": true
}
}
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| Idempotency-Key | header | any | false | none |
| body | body | SharedDashboardCreateBody | true | none |
Example responses
201 Response
{
"uuid": "string",
"share_url": "string",
"status": "string",
"created_at": "string",
"locked_start_date": "2019-08-24",
"locked_end_date": "2019-08-24",
"report_config": {
"v": 1,
"metrics": [
"string"
],
"modules": {
"property1": true,
"property2": true
}
},
"shop_id": 0
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 201 | Created | Successful Response | MySharedDashboard |
| 400 | Bad Request | Validation error, or a missing/oversized Idempotency-Key. | None |
| 403 | Forbidden | API key lacks read_write scope (WRITE_NOT_PERMITTED). |
None |
| 404 | Not Found | Resource does not exist, or belongs to another shop. | None |
| 409 | Conflict | Idempotency conflict, or the resource already exists. | None |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
| 429 | Too Many Requests | Write-tier rate limit (10/min, 50/hour, 100/day) exceeded. | None |
Update a shared dashboard link
PATCH /shared-dashboards/{share_uuid}
Reconfigure one share link in place — the uuid and share_url stay valid, so anyone already holding the link keeps working.
Rotate the viewer password with password, take the link offline without archiving it with status: inactive, move or clear the locked reporting window, and change which cards the viewer sees with report_config. Omitted fields are left alone, so a password rotation never wipes the metric selection. Clearing the locked window needs clear_lock: true — omitted dates mean 'unchanged', not 'unlock'.
Returns 404 if the link does not exist or belongs to a shop this key does not cover. Requires read_write scope.
Body parameter
{
"password": "string",
"status": "string",
"locked_start_date": "2019-08-24",
"locked_end_date": "2019-08-24",
"clear_lock": false,
"report_config": {
"v": 1,
"metrics": [
"string"
],
"modules": {
"property1": true,
"property2": true
}
}
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| share_uuid | path | string | true | Share link UUID. |
| Idempotency-Key | header | any | false | none |
| body | body | SharedDashboardUpdateBody | true | none |
Example responses
200 Response
{
"success": true,
"message": "string",
"uuid": "string",
"status": "string",
"share_url": "",
"created_at": "",
"locked_start_date": "2019-08-24",
"locked_end_date": "2019-08-24",
"report_config": {
"v": 1,
"metrics": [
"string"
],
"modules": {
"property1": true,
"property2": true
}
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | UpdateSharedDashboardResponse |
| 400 | Bad Request | Validation error, or a missing/oversized Idempotency-Key. | None |
| 403 | Forbidden | API key lacks read_write scope (WRITE_NOT_PERMITTED). |
None |
| 404 | Not Found | Resource does not exist, or belongs to another shop. | None |
| 409 | Conflict | Idempotency conflict, or the resource already exists. | None |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
| 429 | Too Many Requests | Write-tier rate limit (10/min, 50/hour, 100/day) exceeded. | None |
Archive a shared dashboard link
DELETE /shared-dashboards/{share_uuid}
Archive one share link. The uuid stops resolving immediately, so anyone holding the URL loses access — this is the revoke button.
Archiving frees the shop to create a new link, which gets a fresh uuid and a fresh password rather than reviving the archived one's settings. Use PATCH ... {status: inactive} instead if you only want to pause a link you intend to bring back.
Returns 404 if the link does not exist or belongs to a shop this key does not cover. Requires read_write scope.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| share_uuid | path | string | true | Share link UUID. |
| Idempotency-Key | header | any | false | none |
Example responses
200 Response
{
"success": true,
"uuid": "string",
"message": "string"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | SharedDashboardDeleteResponse |
| 400 | Bad Request | Validation error, or a missing/oversized Idempotency-Key. | None |
| 403 | Forbidden | API key lacks read_write scope (WRITE_NOT_PERMITTED). |
None |
| 404 | Not Found | Resource does not exist, or belongs to another shop. | None |
| 409 | Conflict | Idempotency conflict, or the resource already exists. | None |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
| 429 | Too Many Requests | Write-tier rate limit (10/min, 50/hour, 100/day) exceeded. | None |
Briefs
Generate a creative brief for a product
POST /creative-briefs/{product_id}/generate
Analyze this product's already-analyzed TikTok videos and generate a creative brief — content angles, unique selling points, filming recommendations, dos/don'ts, and the top inspiration videos — then save it as a drafted brief and return it.
Each call is a fresh generation that spends model tokens and creates a new brief row, so Idempotency-Key is required: a retried request replays the first result instead of paying for and storing a duplicate. Send X-Dry-Run: true to validate the product without generating.
Returns 404 when the product isn't in this shop, and 422 when the product has no analyzed videos to build a brief from — run video analysis first.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| product_id | path | string | true | none |
| Idempotency-Key | header | any | false | none |
| X-Dry-Run | header | any | false | none |
Example responses
201 Response
{
"data": {},
"dry_run": false
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 201 | Created | Successful Response | CreativeBriefWriteResponse |
| 400 | Bad Request | Validation error, multi-shop key, or missing/invalid Idempotency-Key. | WriteErrorResponse |
| 403 | Forbidden | API key lacks read_write scope (WRITE_NOT_PERMITTED). |
WriteErrorResponse |
| 404 | Not Found | Brief or product not found in this shop. | WriteErrorResponse |
| 409 | Conflict | Idempotency conflict. | WriteErrorResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
| 429 | Too Many Requests | Write-tier rate limit exceeded. | WriteErrorResponse |
List creative briefs
GET /creative-briefs
Every creative brief in this shop, newest revision per brief, with the product's name and cover image for display. Briefs whose product has no analyzed videos or no catalog imagery are omitted — they cannot render.
last_opened_at is the last time the brief was opened in the portal, or null. Read-only.
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
Response Schema
Published URL for a product's brief
GET /creative-briefs/published-url
The public URL of this product's published creative brief — the link you share with creators. Returns {"url": null} when the product has no published brief (a drafted or archived brief is not shareable). Read-only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| product_id | query | string | true | none |
Example responses
200 Response
{
"url": "string"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | PublishedUrlResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Get a creative brief
GET /creative-briefs/{brief_id}
One creative brief in full: the generated document (brief_content) plus its flattened sections, the inspiration videos with their order counts, and the shop's brand colors and logo. Image URLs are re-signed on every read, so use them promptly rather than storing them. Read-only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| brief_id | path | integer | true | none |
Example responses
200 Response
null
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Response Schema
Update a creative brief
PUT /creative-briefs/{brief_id}
Replace this brief's editable content — name, description, angles, USPs, filming recommendations, dos/don'ts, inspiration videos — and its status. Set status: published to make it shareable (its URL is then available from GET /creative-briefs/published-url), or archived to retire it.
This is a replace: the stored document is rebuilt from the body, so send the whole brief back with your edits, not just changed fields.
Two things happen automatically on save: inspiration videos missing key_points get them AI-generated from that video's analysis, and videos missing an orders count have it filled from our attribution data. Idempotency-Key is optional here (a replace is naturally repeatable); X-Dry-Run: true validates without writing.
Body parameter
{
"brief_name": "string",
"product_description": "string",
"when_to_use": "",
"image_urls": [
"string"
],
"content_angles": [
null
],
"unique_selling_points": [
null
],
"filming_recommendations": {},
"dos_and_donts": {},
"content_inspiration": [
null
],
"status": "drafted"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| brief_id | path | integer | true | none |
| Idempotency-Key | header | any | false | none |
| X-Dry-Run | header | any | false | none |
| body | body | CreativeBriefUpdateRequest | true | none |
Example responses
200 Response
{
"data": {},
"dry_run": false
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | CreativeBriefWriteResponse |
| 400 | Bad Request | Validation error, multi-shop key, or missing/invalid Idempotency-Key. | WriteErrorResponse |
| 403 | Forbidden | API key lacks read_write scope (WRITE_NOT_PERMITTED). |
WriteErrorResponse |
| 404 | Not Found | Brief or product not found in this shop. | WriteErrorResponse |
| 409 | Conflict | Idempotency conflict. | WriteErrorResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
| 429 | Too Many Requests | Write-tier rate limit exceeded. | WriteErrorResponse |
Generate image-brief content
POST /image-briefs/generate
Generate the copy for a single-image creator brief from up to 3 of your products (index 0 is the hero): the kicker, signature and winning hooks, social proof, benefits, content ideas, and shop tagline.
This returns content without saving it — pass the result to POST /image-briefs to keep it as a draft. The portal streams this generation token by token; here it is collapsed into one response.
Each call spends model tokens, so Idempotency-Key is required and retries replay the first result rather than regenerating. Generation is non-deterministic — the same products give different copy each time.
Body parameter
{
"product_ids": [
"string"
]
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| Idempotency-Key | header | any | false | none |
| X-Dry-Run | header | any | false | none |
| body | body | ImageBriefGenerateRequest | true | none |
Example responses
200 Response
{
"data": {
"kicker": "",
"signatureHooks": [
"string"
],
"winningHooks": [
{
"text": "string",
"lead": true
}
],
"socialProof": [
"string"
],
"benefits": [
{
"term": "string",
"detail": "string"
}
],
"contentIdeas": [
{
"title": "string",
"detail": "string"
}
],
"shopTagline": ""
},
"dry_run": false
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | ImageBriefGenerateResponse |
| 400 | Bad Request | Validation error, multi-shop key, or missing/invalid Idempotency-Key. | WriteErrorResponse |
| 403 | Forbidden | API key lacks read_write scope (WRITE_NOT_PERMITTED). |
WriteErrorResponse |
| 404 | Not Found | Brief or product not found in this shop. | WriteErrorResponse |
| 409 | Conflict | Idempotency conflict. | WriteErrorResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
| 429 | Too Many Requests | Write-tier rate limit exceeded. | WriteErrorResponse |
Resolved product context for an image brief
GET /image-briefs/product-context
The product details an image brief renders and generates from — name, brand, price, image, description, top-performing hooks, and your brand voice — for up to 3 products (first is the hero). Use it to preview the poster header before generating. Read-only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| product_ids | query | string | true | Comma-separated product IDs; the first is the hero. |
Example responses
200 Response
{
"products": [
{
"id": "string",
"name": "string",
"brand": "",
"brandHandle": "",
"price": "",
"unit": "",
"image": "",
"description": "",
"badges": [
"string"
],
"topHooks": [
"string"
],
"brandVoice": ""
}
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | ProductContextResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Get brand voice descriptors
GET /image-briefs/brand-voice
The adjectives describing how your brand sounds (e.g. playful, clinical, premium). They are fed to every image-brief generation, so they shape the copy's tone. Read-only.
Example responses
200 Response
{
"shop_id": 0,
"voice_descriptors": [
"string"
],
"brand_voice": ""
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | BrandVoiceResponse |
Set brand voice descriptors
PUT /image-briefs/brand-voice
Replace the descriptors that steer the tone of generated image briefs. This is a replace, not an append — send the full list.
Requires an existing brand profile for the shop; 404 until brand analysis has run. Affects future generations only; existing briefs keep their saved copy.
Body parameter
{
"voice_descriptors": [
"string"
]
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| Idempotency-Key | header | any | false | none |
| X-Dry-Run | header | any | false | none |
| body | body | ImageBriefBrandVoiceRequest | true | none |
Example responses
200 Response
{
"data": {
"shop_id": 0,
"voice_descriptors": [
"string"
],
"brand_voice": ""
},
"dry_run": false
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | BrandVoiceWriteResponse |
| 400 | Bad Request | Validation error, multi-shop key, or missing/invalid Idempotency-Key. | WriteErrorResponse |
| 403 | Forbidden | API key lacks read_write scope (WRITE_NOT_PERMITTED). |
WriteErrorResponse |
| 404 | Not Found | Brief or product not found in this shop. | WriteErrorResponse |
| 409 | Conflict | Idempotency conflict. | WriteErrorResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
| 429 | Too Many Requests | Write-tier rate limit exceeded. | WriteErrorResponse |
Analyse a brand's website into a brand profile
POST /image-briefs/brand-voice/analyze
Scrape the brand's website and extract a brand profile — name, voice descriptors, target audience, categories — and store it for the shop. This is what PUT /image-briefs/brand-voice depends on: a shop that has never had brand analysis run 404s there until this endpoint has created the profile. After it runs, brand voice is populated (and can be overridden with the PUT).
It scrapes the site and runs an LLM, so it is a write: it needs read_write scope, counts against the write rate limit, and the shop's existing profile is returned as-is unless refresh: true (a shop has one profile). A required Idempotency-Key makes a retry replay rather than re-scrape; X-Dry-Run: true validates without scraping. Single shop only.
Body parameter
{
"website_url": "string",
"refresh": false
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| Idempotency-Key | header | any | false | none |
| X-Dry-Run | header | any | false | none |
| body | body | ImageBriefBrandAnalyzeRequest | true | none |
Example responses
201 Response
{
"data": {
"website_url": "string",
"brand_name": "string",
"voice_descriptors": [
"string"
],
"target_audience": "string",
"extracted_categories": [
"string"
],
"extraction_model": "string",
"extracted_at": "2019-08-24T14:15:22Z",
"source": "string"
},
"dry_run": false
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 201 | Created | Successful Response | BrandProfileWriteResponse |
| 400 | Bad Request | Validation error, multi-shop key, or missing/invalid Idempotency-Key. | WriteErrorResponse |
| 403 | Forbidden | API key lacks read_write scope (WRITE_NOT_PERMITTED). |
WriteErrorResponse |
| 404 | Not Found | Brief or product not found in this shop. | WriteErrorResponse |
| 409 | Conflict | Idempotency conflict. | WriteErrorResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
| 429 | Too Many Requests | Write-tier rate limit exceeded. | WriteErrorResponse |
List image briefs
GET /image-briefs
Your saved image-brief drafts, newest first, each with the poster identity (name, brand, price, image) of its products. Filter by name or kicker with search. Read-only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| page | query | integer | false | none |
| page_size | query | integer | false | none |
| search | query | any | false | Case-insensitive name/kicker filter. |
Example responses
200 Response
{
"briefs": [
{
"id": 0,
"shop_id": 0,
"product_ids": [
null
],
"template_id": "string",
"accent_color": "string",
"main_header_background": "string",
"name": "string",
"content": {
"kicker": "",
"signatureHooks": [
"string"
],
"winningHooks": [
{
"text": "string",
"lead": true
}
],
"socialProof": [
"string"
],
"benefits": [
{
"term": "string",
"detail": "string"
}
],
"contentIdeas": [
{
"title": "string",
"detail": "string"
}
],
"shopTagline": ""
},
"image_overrides": {},
"status": "string",
"created_by_email": "string",
"created_at": "string",
"updated_at": "string",
"products": [
{
"id": "string",
"name": "",
"brand": "",
"price": "",
"image": ""
}
]
}
],
"pagination": {
"total_count": 0,
"page": 0,
"page_size": 0,
"total_pages": 0
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | BriefListResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Create an image brief
POST /image-briefs
Save an image brief as a draft — typically the content returned by POST /image-briefs/generate, but any content is accepted. Up to 3 products; index 0 is the hero. Omit name and the brief is named after its headline.
Idempotency-Key is required so a retry doesn't leave you with duplicate drafts. X-Dry-Run: true validates without saving.
Body parameter
{
"product_ids": [
"string"
],
"template_id": "editorial-dark",
"accent_color": "string",
"main_header_background": "string",
"name": "string",
"content": {
"kicker": "",
"signatureHooks": [
"string"
],
"winningHooks": [
{
"text": "string",
"lead": true
}
],
"socialProof": [
"string"
],
"benefits": [
{
"term": "string",
"detail": "string"
}
],
"contentIdeas": [
{
"title": "string",
"detail": "string"
}
],
"shopTagline": ""
},
"image_overrides": {}
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| Idempotency-Key | header | any | false | none |
| X-Dry-Run | header | any | false | none |
| body | body | ImageBriefCreateRequest | true | none |
Example responses
201 Response
{
"data": {
"id": 0,
"shop_id": 0,
"product_ids": [
null
],
"template_id": "string",
"accent_color": "string",
"main_header_background": "string",
"name": "string",
"content": {
"kicker": "",
"signatureHooks": [
"string"
],
"winningHooks": [
{
"text": "string",
"lead": true
}
],
"socialProof": [
"string"
],
"benefits": [
{
"term": "string",
"detail": "string"
}
],
"contentIdeas": [
{
"title": "string",
"detail": "string"
}
],
"shopTagline": ""
},
"image_overrides": {},
"status": "string",
"created_by_email": "string",
"created_at": "string",
"updated_at": "string",
"products": [
{
"id": "string",
"name": "",
"brand": "",
"price": "",
"image": ""
}
]
},
"dry_run": false
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 201 | Created | Successful Response | ImageBriefWriteResponse |
| 400 | Bad Request | Validation error, multi-shop key, or missing/invalid Idempotency-Key. | WriteErrorResponse |
| 403 | Forbidden | API key lacks read_write scope (WRITE_NOT_PERMITTED). |
WriteErrorResponse |
| 404 | Not Found | Brief or product not found in this shop. | WriteErrorResponse |
| 409 | Conflict | Idempotency conflict. | WriteErrorResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
| 429 | Too Many Requests | Write-tier rate limit exceeded. | WriteErrorResponse |
Get an image brief
GET /image-briefs/{brief_id}
One saved image brief with its full content and layout settings. Read-only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| brief_id | path | integer | true | none |
Example responses
200 Response
{
"id": 0,
"shop_id": 0,
"product_ids": [
null
],
"template_id": "string",
"accent_color": "string",
"main_header_background": "string",
"name": "string",
"content": {
"kicker": "",
"signatureHooks": [
"string"
],
"winningHooks": [
{
"text": "string",
"lead": true
}
],
"socialProof": [
"string"
],
"benefits": [
{
"term": "string",
"detail": "string"
}
],
"contentIdeas": [
{
"title": "string",
"detail": "string"
}
],
"shopTagline": ""
},
"image_overrides": {},
"status": "string",
"created_by_email": "string",
"created_at": "string",
"updated_at": "string",
"products": [
{
"id": "string",
"name": "",
"brand": "",
"price": "",
"image": ""
}
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | BriefResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Update an image brief
PUT /image-briefs/{brief_id}
Change a saved image brief. Only the fields you send are updated, so you can patch a single value; sending an explicit null clears a nullable field. Up to 3 products.
Idempotency-Key is optional (a patch is naturally repeatable); X-Dry-Run: true validates without writing.
Body parameter
{
"product_ids": [
"string"
],
"template_id": "string",
"accent_color": "string",
"main_header_background": "string",
"name": "string",
"content": {
"kicker": "",
"signatureHooks": [
"string"
],
"winningHooks": [
{
"text": "string",
"lead": true
}
],
"socialProof": [
"string"
],
"benefits": [
{
"term": "string",
"detail": "string"
}
],
"contentIdeas": [
{
"title": "string",
"detail": "string"
}
],
"shopTagline": ""
},
"image_overrides": {},
"status": "draft"
}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| brief_id | path | integer | true | none |
| Idempotency-Key | header | any | false | none |
| X-Dry-Run | header | any | false | none |
| body | body | ImageBriefUpdateRequest | true | none |
Example responses
200 Response
{
"data": {
"id": 0,
"shop_id": 0,
"product_ids": [
null
],
"template_id": "string",
"accent_color": "string",
"main_header_background": "string",
"name": "string",
"content": {
"kicker": "",
"signatureHooks": [
"string"
],
"winningHooks": [
{
"text": "string",
"lead": true
}
],
"socialProof": [
"string"
],
"benefits": [
{
"term": "string",
"detail": "string"
}
],
"contentIdeas": [
{
"title": "string",
"detail": "string"
}
],
"shopTagline": ""
},
"image_overrides": {},
"status": "string",
"created_by_email": "string",
"created_at": "string",
"updated_at": "string",
"products": [
{
"id": "string",
"name": "",
"brand": "",
"price": "",
"image": ""
}
]
},
"dry_run": false
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | ImageBriefWriteResponse |
| 400 | Bad Request | Validation error, multi-shop key, or missing/invalid Idempotency-Key. | WriteErrorResponse |
| 403 | Forbidden | API key lacks read_write scope (WRITE_NOT_PERMITTED). |
WriteErrorResponse |
| 404 | Not Found | Brief or product not found in this shop. | WriteErrorResponse |
| 409 | Conflict | Idempotency conflict. | WriteErrorResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
| 429 | Too Many Requests | Write-tier rate limit exceeded. | WriteErrorResponse |
Delete an image brief
DELETE /image-briefs/{brief_id}
Permanently delete a saved image brief. This is not reversible — the draft and its content are gone. Deleting an already-deleted brief returns 404.
Idempotency-Key is required; X-Dry-Run: true reports what would be deleted without deleting it.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| brief_id | path | integer | true | none |
| Idempotency-Key | header | any | false | none |
| X-Dry-Run | header | any | false | none |
Example responses
200 Response
{
"data": {
"brief_id": 0,
"deleted": true
},
"dry_run": false
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | ImageBriefDeleteResponse |
| 400 | Bad Request | Validation error, multi-shop key, or missing/invalid Idempotency-Key. | WriteErrorResponse |
| 403 | Forbidden | API key lacks read_write scope (WRITE_NOT_PERMITTED). |
WriteErrorResponse |
| 404 | Not Found | Brief or product not found in this shop. | WriteErrorResponse |
| 409 | Conflict | Idempotency conflict. | WriteErrorResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
| 429 | Too Many Requests | Write-tier rate limit exceeded. | WriteErrorResponse |
Contracts
List contracts
GET /contracts
Every contract the shop has generated, newest first. Each row carries the campaign and creator it was sent to, the full terms snapshot the document was rendered from, the signing status and both signature timestamps.
Filter by status (draft/sent/active/expired/voided/delivery_failed), by creator_id, by campaign_id, or by expiring_within_days to find active contracts about to lapse. status=expired and expiring_within_days are mutually exclusive — expiry is evaluated lazily against today's date, so asking for both is contradictory.
Cursor-paginated: pass the next_cursor from the previous response to get the next page. A null next_cursor means the last page. Single-shop only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| status | query | any | false | Restrict to one signing status. |
| creator_id | query | any | false | Restrict to contracts sent to one creator. |
| campaign_id | query | any | false | Restrict to contracts generated for one campaign. |
| expiring_within_days | query | any | false | Only active contracts expiring within this many days. |
| cursor | query | any | false | Opaque cursor from next_cursor. |
| limit | query | integer | false | Rows per page (max 200). |
Example responses
200 Response
{
"data": [
{
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"batch_id": "4da22c97-b7d5-4e31-8c3a-03870ebc7b20",
"campaign_id": 0,
"campaign_name": "string",
"creator_id": 0,
"creator_name": "string",
"creator_handle": "string",
"contract_title": "string",
"template_source": "standard",
"terms": {
"campaign_type": "retainer",
"brand_name": "string",
"brand_representative_name": "string",
"deliverables": 1,
"posting_platform": "TikTok",
"posting_requirements": "",
"posting_start_date": "2019-08-24",
"effective_date": "2019-08-24",
"expiry_date": "2019-08-24",
"products": [
{
"product_id": "string",
"product_name": "string"
}
],
"all_products": false,
"require_video_link_email": false,
"video_link_email": "string",
"commission_pct": 100,
"expenses_reimbursable": false,
"revision_rounds": 0,
"include_usage_rights": true,
"usage_rights_months": 3,
"usage_rights_duration_days": 90,
"usage_rights_scope": "organic_only",
"usage_exclusivity_enabled": false,
"usage_exclusivity_months": 3,
"agreement_clause": "string",
"termination_notice_days": 30,
"governing_law_jurisdiction": "New York",
"reward": {
"kind": "retainer",
"mode": "fixed",
"payment_per_post": 0,
"tiers": [
{
"name": "string",
"retainer": 0,
"gmv_threshold": 0
}
],
"gmv_bonus_tiers": [
{
"gmv_threshold": 0,
"bonus_amount": 0
}
],
"recurring": false,
"payment_schedule": "one_time",
"payment_due_days": 30,
"minimum_gmv_floor": 0
}
},
"status": "draft",
"brand_signed_at": "2019-08-24T14:15:22Z",
"creator_signed_at": "2019-08-24T14:15:22Z",
"effective_date": "2019-08-24",
"expiry_date": "2019-08-24",
"last_error": "string"
}
],
"next_cursor": "string"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | PaginatedEnvelopes |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
List saved clause templates
GET /contracts/templates
The shop's saved contract-clause templates — the reusable clause documents a contract body can be built from. Returns each template's name, clause count and timestamps; the clause bodies themselves are portal-only.
Cursor-paginated: pass the next_cursor from the previous response to get the next page. A null next_cursor means the last page. Single-shop only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| cursor | query | any | false | Opaque cursor from next_cursor. |
| limit | query | integer | false | Templates per page (max 200). |
Example responses
200 Response
{
"data": [
{
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"name": "string",
"clause_count": 0,
"created_at": "2019-08-24T14:15:22Z",
"updated_at": "2019-08-24T14:15:22Z"
}
],
"next_cursor": "string"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | PaginatedTemplates |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Get send progress for a contract batch
GET /contracts/batches/{batch_id}
Progress for one batch of contracts: total_count / sent_count / failed_count, every envelope in the batch, and a failures list naming the creators whose delivery failed and why. Poll this after a batch is sent from the portal to watch it drain.
404 when the batch does not belong to this shop. Single-shop only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| batch_id | path | string(uuid) | true | Batch id (UUID). |
Example responses
200 Response
{
"batch_id": "4da22c97-b7d5-4e31-8c3a-03870ebc7b20",
"status": "queued",
"total_count": 0,
"sent_count": 0,
"failed_count": 0,
"envelopes": [
{
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"batch_id": "4da22c97-b7d5-4e31-8c3a-03870ebc7b20",
"campaign_id": 0,
"campaign_name": "string",
"creator_id": 0,
"creator_name": "string",
"creator_handle": "string",
"contract_title": "string",
"template_source": "standard",
"terms": {
"campaign_type": "retainer",
"brand_name": "string",
"brand_representative_name": "string",
"deliverables": 1,
"posting_platform": "TikTok",
"posting_requirements": "",
"posting_start_date": "2019-08-24",
"effective_date": "2019-08-24",
"expiry_date": "2019-08-24",
"products": [
{
"product_id": "string",
"product_name": "string"
}
],
"all_products": false,
"require_video_link_email": false,
"video_link_email": "string",
"commission_pct": 100,
"expenses_reimbursable": false,
"revision_rounds": 0,
"include_usage_rights": true,
"usage_rights_months": 3,
"usage_rights_duration_days": 90,
"usage_rights_scope": "organic_only",
"usage_exclusivity_enabled": false,
"usage_exclusivity_months": 3,
"agreement_clause": "string",
"termination_notice_days": 30,
"governing_law_jurisdiction": "New York",
"reward": {
"kind": "retainer",
"mode": "fixed",
"payment_per_post": 0,
"tiers": [
{
"name": "string",
"retainer": 0,
"gmv_threshold": 0
}
],
"gmv_bonus_tiers": [
{
"gmv_threshold": 0,
"bonus_amount": 0
}
],
"recurring": false,
"payment_schedule": "one_time",
"payment_due_days": 30,
"minimum_gmv_floor": 0
}
},
"status": "draft",
"brand_signed_at": "2019-08-24T14:15:22Z",
"creator_signed_at": "2019-08-24T14:15:22Z",
"effective_date": "2019-08-24",
"expiry_date": "2019-08-24",
"last_error": "string"
}
],
"failures": [
{
"creator_id": 0,
"error_code": "string",
"error_message": "string"
}
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | BatchProgress |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
List one campaign's contracts
GET /contracts/campaigns/{campaign_id}
Every contract generated for one campaign, newest first — the campaign-scoped view of GET /contracts. Same row shape.
404 when the campaign does not belong to this shop.
Cursor-paginated: pass the next_cursor from the previous response to get the next page. A null next_cursor means the last page. Single-shop only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| campaign_id | path | integer | true | Campaign id from GET /campaigns. |
| cursor | query | any | false | Opaque cursor from next_cursor. |
| limit | query | integer | false | Rows per page (max 200). |
Example responses
200 Response
{
"data": [
{
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"batch_id": "4da22c97-b7d5-4e31-8c3a-03870ebc7b20",
"campaign_id": 0,
"campaign_name": "string",
"creator_id": 0,
"creator_name": "string",
"creator_handle": "string",
"contract_title": "string",
"template_source": "standard",
"terms": {
"campaign_type": "retainer",
"brand_name": "string",
"brand_representative_name": "string",
"deliverables": 1,
"posting_platform": "TikTok",
"posting_requirements": "",
"posting_start_date": "2019-08-24",
"effective_date": "2019-08-24",
"expiry_date": "2019-08-24",
"products": [
{
"product_id": "string",
"product_name": "string"
}
],
"all_products": false,
"require_video_link_email": false,
"video_link_email": "string",
"commission_pct": 100,
"expenses_reimbursable": false,
"revision_rounds": 0,
"include_usage_rights": true,
"usage_rights_months": 3,
"usage_rights_duration_days": 90,
"usage_rights_scope": "organic_only",
"usage_exclusivity_enabled": false,
"usage_exclusivity_months": 3,
"agreement_clause": "string",
"termination_notice_days": 30,
"governing_law_jurisdiction": "New York",
"reward": {
"kind": "retainer",
"mode": "fixed",
"payment_per_post": 0,
"tiers": [
{
"name": "string",
"retainer": 0,
"gmv_threshold": 0
}
],
"gmv_bonus_tiers": [
{
"gmv_threshold": 0,
"bonus_amount": 0
}
],
"recurring": false,
"payment_schedule": "one_time",
"payment_due_days": 30,
"minimum_gmv_floor": 0
}
},
"status": "draft",
"brand_signed_at": "2019-08-24T14:15:22Z",
"creator_signed_at": "2019-08-24T14:15:22Z",
"effective_date": "2019-08-24",
"expiry_date": "2019-08-24",
"last_error": "string"
}
],
"next_cursor": "string"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | PaginatedEnvelopes |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Get one contract
GET /contracts/{contract_id}
One contract envelope: the campaign and creator it belongs to, the frozen terms the document was rendered from (deliverables, reward structure, usage rights, dates), the signing status, and brand_signed_at / creator_signed_at — null until that party signs. last_error carries the delivery failure reason when status is delivery_failed.
404 when the contract does not belong to this shop. Single-shop only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| contract_id | path | string(uuid) | true | Contract id (UUID). |
Example responses
200 Response
{
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"batch_id": "4da22c97-b7d5-4e31-8c3a-03870ebc7b20",
"campaign_id": 0,
"campaign_name": "string",
"creator_id": 0,
"creator_name": "string",
"creator_handle": "string",
"contract_title": "string",
"template_source": "standard",
"terms": {
"campaign_type": "retainer",
"brand_name": "string",
"brand_representative_name": "string",
"deliverables": 1,
"posting_platform": "TikTok",
"posting_requirements": "",
"posting_start_date": "2019-08-24",
"effective_date": "2019-08-24",
"expiry_date": "2019-08-24",
"products": [
{
"product_id": "string",
"product_name": "string"
}
],
"all_products": false,
"require_video_link_email": false,
"video_link_email": "string",
"commission_pct": 100,
"expenses_reimbursable": false,
"revision_rounds": 0,
"include_usage_rights": true,
"usage_rights_months": 3,
"usage_rights_duration_days": 90,
"usage_rights_scope": "organic_only",
"usage_exclusivity_enabled": false,
"usage_exclusivity_months": 3,
"agreement_clause": "string",
"termination_notice_days": 30,
"governing_law_jurisdiction": "New York",
"reward": {
"kind": "retainer",
"mode": "fixed",
"payment_per_post": 0,
"tiers": [
{
"name": "string",
"retainer": 0,
"gmv_threshold": 0
}
],
"gmv_bonus_tiers": [
{
"gmv_threshold": 0,
"bonus_amount": 0
}
],
"recurring": false,
"payment_schedule": "one_time",
"payment_due_days": 30,
"minimum_gmv_floor": 0
}
},
"status": "draft",
"brand_signed_at": "2019-08-24T14:15:22Z",
"creator_signed_at": "2019-08-24T14:15:22Z",
"effective_date": "2019-08-24",
"expiry_date": "2019-08-24",
"last_error": "string"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | ContractEnvelopeOut |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Get a signed URL for viewing a contract
GET /contracts/{contract_id}/view-url
A short-lived signed URL for the contract PDF, for inline rendering. Resolves to the countersigned PDF once the creator has signed, and to the unsigned PDF currently out for signature before that.
404 when the contract does not belong to this shop, or when neither PDF has been generated yet (a draft that was never sent). Single-shop only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| contract_id | path | string(uuid) | true | Contract id (UUID). |
Example responses
200 Response
{
"property1": "string",
"property2": "string"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Response Schema
Status Code 200
Response Contracts View Url
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » additionalProperties | string | false | none | none |
Get a contract's HTML document
GET /contracts/{contract_id}/preview-content
The immutable HTML snapshot of the contract as it was sent for signature, returned as text/html rather than JSON. This is the rendered document body — use it to display or archive the exact terms the creator was shown, without going through a signed URL. Signature blocks are part of the PDF, not this snapshot; fetch the countersigned copy from /download.
404 when the contract does not belong to this shop, or when the document has not been generated yet. Single-shop only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| contract_id | path | string(uuid) | true | Contract id (UUID). |
Example responses
422 Response
{
"detail": [
{
"loc": [
"string"
],
"msg": "string",
"type": "string"
}
]
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | None |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Response Schema
Get a signed download URL for a contract
GET /contracts/{contract_id}/download
A short-lived signed URL that downloads the fully-executed PDF (attachment disposition, named after the contract title).
Unlike /view-url this never falls back to the unsigned document: 404 until the creator has signed, and 404 when the contract does not belong to this shop. Single-shop only.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| contract_id | path | string(uuid) | true | Contract id (UUID). |
Example responses
200 Response
{
"property1": "string",
"property2": "string"
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | Inline |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Response Schema
Status Code 200
Response Contracts Download Url
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » additionalProperties | string | false | none | none |
Spark Codes
List collected spark codes
GET /spark-codes
Every spark code collected for the shop, newest first.
This is not /gmv-max/spark-codes. That endpoint returns the queue of codes waiting to be pushed to TikTok, which is empty until /gmv-max/spark-codes/sync-all is run. This one returns the codes themselves, including the ones creators submit through the spark-code form an automation DMs them.
source says where a code came from: form (submitted through the form, or entered by hand), scraped (found on the creator's video), or bulk_upload (a retainer CSV). form_uuid ties a row back to the form link the creator was sent.
permission reflects the checkbox on the form and is not a usage-rights grant — usage rights are a separate flow with their own statuses, exposed under /usage-rights.
Creator contact details captured by the same form (email, address, phone) are deliberately not returned here.
Single shop only — set x-shop-id to one shop ID.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| automation_id | query | any | false | Only codes collected by this automation. |
| creator_id | query | any | false | Only codes from this TikTok creator ID. |
| source | query | any | false | Restrict to one source: form, scraped, or bulk_upload. Omit for all three. |
| start_date | query | any | false | Only codes collected on or after this date (YYYY-MM-DD). |
| end_date | query | any | false | Only codes collected on or before this date (YYYY-MM-DD). |
| page | query | integer | false | none |
| page_size | query | integer | false | none |
Example responses
200 Response
{
"data": [
{
"spark_code": "string",
"creator_id": "string",
"creator_handle": "string",
"video_id": "string",
"video_url": "string",
"product_name": "string",
"automation_id": 0,
"form_uuid": "string",
"permission": true,
"source": "string",
"collected_at": "string",
"expires_at": "string"
}
],
"pagination": {
"total_count": 0,
"page": 0,
"page_size": 0,
"total_pages": 0
}
}
Responses
| Status | Meaning | Description | Schema |
|---|---|---|---|
| 200 | OK | Successful Response | SparkCodesListResponse |
| 422 | Unprocessable Entity | Validation Error | HTTPValidationError |
Schemas
AISearchCapabilitiesResponse
{
"region": "string",
"modes": {
"profile": true,
"transcript": true,
"video": true,
"lookalike": true
}
}
AISearchCapabilitiesResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| region | any | false | none | The shop's region code (e.g. 'US'). Null if the shop has no region set. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| modes | AISearchCapabilityModes | true | none | Per-mode availability for a shop's region (CORE-5787). |
AISearchCapabilityModes
{
"profile": true,
"transcript": true,
"video": true,
"lookalike": true
}
AISearchCapabilityModes
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| profile | boolean | true | none | Always true — profile (natural-language) creator search is available in every region (v2 fallback where v3 hasn't launched). |
| transcript | boolean | true | none | Whether spoken-word (transcript) search is available and data-ready for this region. |
| video | boolean | true | none | Whether visual (image/text) search is available and data-ready for this region. |
| lookalike | boolean | true | none | Whether creator->creator lookalike search is available and data-ready for this region. |
AISearchCreator
{
"creator_name": "string",
"categories": [
"string"
],
"follower_count": 0,
"gmv": 0,
"shop_gmv": 0,
"post_rate": 0,
"engagement_rate": 0,
"average_views": 0,
"units_sold": 0,
"bio": "string",
"top_videos": [
{
"video_id": "string",
"tiktok_url": "string",
"views": 0,
"match_type": "string",
"snippet": "string"
}
],
"match_count": 0,
"match_score": 0
}
AISearchCreator
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_name | any | false | none | Creator's TikTok handle. Stable identifier for cross-referencing. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| categories | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| follower_count | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| gmv | any | false | none | Creator's OVERALL (global, cross-shop) GMV from their public TikTok profile. Sparse: TikTok exposes it for only ~10% of creators, so it is often null even for active sellers. For the GMV a creator drove for YOUR shop, use shop_gmv. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_gmv | any | false | none | Lifetime GMV this creator drove for the REQUESTING shop (crm_creator_summary.gmv). Populated for creators in your shop's affiliate roster; null for creators your shop has no CRM record of. Distinct from the sparse global gmv. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| post_rate | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| engagement_rate | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| average_views | any | false | none | Average views per video. Null when not available for this result. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| units_sold | any | false | none | Estimated units sold. Null when not available for this result. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| bio | any | false | none | Creator bio. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| top_videos | [AISearchVideo] | false | none | none |
| match_count | any | false | none | Number of this creator's videos that matched the query (transcript/video modes). Null on profile/lookalike. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| match_score | any | false | none | Relevance score of this creator's best match (transcript/video modes) or similarity to the lookalike seeds (lookalike mode). Null on profile. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
AISearchCreatorsRequest
{
"min_gmv": 0,
"max_gmv": 0,
"min_units_sold": 0,
"max_units_sold": 0,
"min_post_rate": 100,
"max_post_rate": 100,
"min_engagement_rate": 100,
"max_engagement_rate": 100,
"min_average_views": 0,
"max_average_views": 0,
"min_followers": 0,
"max_followers": 0,
"has_email": true,
"categories": [
"string"
],
"gender": [
"string"
],
"creator_ethnicity": [
"string"
],
"age_range": [
"string"
],
"community": [
"string"
],
"creator_level": [
"string"
],
"languages": [
"string"
],
"audience_age": [
"string"
],
"audience_gender": [
"string"
],
"content_style": [
"string"
],
"production_quality": [
"string"
],
"personality_tone": [
"string"
],
"face_visibility": [
"string"
],
"body_type": [
"string"
],
"hair_type": [
"string"
],
"query": "string",
"filters": {},
"page": 1,
"page_size": 20,
"disable_handle_pin": false
}
AISearchCreatorsRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| min_gmv | any | false | none | Minimum GMV. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| max_gmv | any | false | none | Maximum GMV. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| min_units_sold | any | false | none | Minimum units sold. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| max_units_sold | any | false | none | Maximum units sold. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| min_post_rate | any | false | none | Minimum post rate (sample-fulfillment %) on a 0–100 scale, NOT 0–1. Same metric the automations endpoint calls fulfillment_rate. US/UK only. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| max_post_rate | any | false | none | Maximum post rate (sample-fulfillment %) on a 0–100 scale, NOT 0–1. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| min_engagement_rate | any | false | none | Minimum engagement rate, 0–100. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| max_engagement_rate | any | false | none | Maximum engagement rate, 0–100. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| min_average_views | any | false | none | Minimum average views. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| max_average_views | any | false | none | Maximum average views. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| min_followers | any | false | none | Minimum follower count. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| max_followers | any | false | none | Maximum follower count. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| has_email | any | false | none | Only creators with (true) / without (false) an email. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | boolean | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| categories | any | false | none | Product categories (canonical names). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| gender | any | false | none | Creator gender, e.g. ["female"]. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_ethnicity | any | false | none | Creator ethnicity. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| age_range | any | false | none | Creator age range, e.g. ["25-34"]. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| community | any | false | none | Community hashtags (US/UK/DE/ES only). Fetch valid values from GET /ai-search/hashtags. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_level | any | false | none | Creator GMV level tier, e.g. ["L5","L6","L7"] (L0=$0 through L7=>$1M). Same tiers the filter vocabulary lists as "Creator Level". |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| languages | any | false | none | Creator languages, e.g. ["english"]. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| audience_age | any | false | none | Audience (follower) age band. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| audience_gender | any | false | none | Audience (follower) gender. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| content_style | any | false | none | Content style, e.g. ["lifestyle"]. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| production_quality | any | false | none | Production quality, e.g. ["raw_ugc"]. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| personality_tone | any | false | none | Personality / tone, e.g. ["relatable"]. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| face_visibility | any | false | none | Face visibility, e.g. ["sometimes"]. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| body_type | any | false | none | Body type (~⅓ of creators populated). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| hair_type | any | false | none | Hair type, e.g. ["wavy"]. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| query | any | false | none | Natural-language search query. Whitespace-only is treated as no query (browse mode). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| filters | any | false | none | Optional creator filters (categories, follower/GMV ranges, etc.), same shape as the portal search filters. post_rate is on a 0–100 scale (sample-fulfillment %). Unrecognized filter keys are rejected with a 400 rather than silently ignored. Cannot be combined with the flat filter params (min_gmv, gender, hair_type, etc.) inherited above. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | object | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| page | integer | false | none | none |
| page_size | integer | false | none | none |
| disable_handle_pin | boolean | false | none | When true, skip the deterministic exact-@handle pin and return pure semantic results (powers a 'show all matches / full search' flow). When a query is an exact creator handle, the default (false) pins that creator first and sets exact_handle_match/exact_handle on the response. |
AISearchCreatorsResponse
{
"data": [
{
"creator_name": "string",
"categories": [
"string"
],
"follower_count": 0,
"gmv": 0,
"shop_gmv": 0,
"post_rate": 0,
"engagement_rate": 0,
"average_views": 0,
"units_sold": 0,
"bio": "string",
"top_videos": [
{
"video_id": "string",
"tiktok_url": "string",
"views": 0,
"match_type": "string",
"snippet": "string"
}
],
"match_count": 0,
"match_score": 0
}
],
"pagination": {
"total": 0,
"page": 0,
"page_size": 0
},
"exact_handle_match": false,
"exact_handle": "string"
}
AISearchCreatorsResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | [AISearchCreator] | true | none | none |
| pagination | AISearchPagination | true | none | none |
| exact_handle_match | boolean | false | none | True iff the query was an exact creator handle (or a short brand name that resolves to one) and that creator was pinned as the first result. Lets a client show an 'exact creator found' affordance and offer a full semantic search via disable_handle_pin=true. |
| exact_handle | any | false | none | The normalized handle that matched (e.g. 'kriseatsnyc'), or null when there was no exact-handle pin. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
AISearchExportRequest
{
"min_gmv": 0,
"max_gmv": 0,
"min_units_sold": 0,
"max_units_sold": 0,
"min_post_rate": 100,
"max_post_rate": 100,
"min_engagement_rate": 100,
"max_engagement_rate": 100,
"min_average_views": 0,
"max_average_views": 0,
"min_followers": 0,
"max_followers": 0,
"has_email": true,
"categories": [
"string"
],
"gender": [
"string"
],
"creator_ethnicity": [
"string"
],
"age_range": [
"string"
],
"community": [
"string"
],
"creator_level": [
"string"
],
"languages": [
"string"
],
"audience_age": [
"string"
],
"audience_gender": [
"string"
],
"content_style": [
"string"
],
"production_quality": [
"string"
],
"personality_tone": [
"string"
],
"face_visibility": [
"string"
],
"body_type": [
"string"
],
"hair_type": [
"string"
],
"query": "string",
"creator_ids": [
"string"
],
"filters": {}
}
AISearchExportRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| min_gmv | any | false | none | Minimum GMV. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| max_gmv | any | false | none | Maximum GMV. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| min_units_sold | any | false | none | Minimum units sold. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| max_units_sold | any | false | none | Maximum units sold. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| min_post_rate | any | false | none | Minimum post rate (sample-fulfillment %) on a 0–100 scale, NOT 0–1. Same metric the automations endpoint calls fulfillment_rate. US/UK only. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| max_post_rate | any | false | none | Maximum post rate (sample-fulfillment %) on a 0–100 scale, NOT 0–1. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| min_engagement_rate | any | false | none | Minimum engagement rate, 0–100. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| max_engagement_rate | any | false | none | Maximum engagement rate, 0–100. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| min_average_views | any | false | none | Minimum average views. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| max_average_views | any | false | none | Maximum average views. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| min_followers | any | false | none | Minimum follower count. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| max_followers | any | false | none | Maximum follower count. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| has_email | any | false | none | Only creators with (true) / without (false) an email. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | boolean | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| categories | any | false | none | Product categories (canonical names). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| gender | any | false | none | Creator gender, e.g. ["female"]. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_ethnicity | any | false | none | Creator ethnicity. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| age_range | any | false | none | Creator age range, e.g. ["25-34"]. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| community | any | false | none | Community hashtags (US/UK/DE/ES only). Fetch valid values from GET /ai-search/hashtags. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_level | any | false | none | Creator GMV level tier, e.g. ["L5","L6","L7"] (L0=$0 through L7=>$1M). Same tiers the filter vocabulary lists as "Creator Level". |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| languages | any | false | none | Creator languages, e.g. ["english"]. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| audience_age | any | false | none | Audience (follower) age band. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| audience_gender | any | false | none | Audience (follower) gender. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| content_style | any | false | none | Content style, e.g. ["lifestyle"]. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| production_quality | any | false | none | Production quality, e.g. ["raw_ugc"]. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| personality_tone | any | false | none | Personality / tone, e.g. ["relatable"]. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| face_visibility | any | false | none | Face visibility, e.g. ["sometimes"]. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| body_type | any | false | none | Body type (~⅓ of creators populated). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| hair_type | any | false | none | Hair type, e.g. ["wavy"]. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| query | any | false | none | Natural-language search query. Omit (or pass whitespace-only) to export the full browse universe for your shop's region. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_ids | any | false | none | Explicit list of creator IDs to export. Mutually exclusive with query. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| filters | any | false | none | Optional creator filters (categories, follower/GMV ranges, etc.), same shape as the portal search filters. Applied server-side so the export matches a filtered search. post_rate is on a 0–100 scale (sample-fulfillment %). Unrecognized filter keys are rejected with a 400 rather than silently ignored. Cannot be combined with the flat filter params (min_gmv, gender, hair_type, etc.) inherited above. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | object | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
AISearchLookalikeRequest
{
"seed_creator_ids": [
"string"
],
"seed_crm_group_id": "string",
"seed_list_id": 0,
"query": "string",
"filters": {},
"page": 1,
"page_size": 20
}
AISearchLookalikeRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| seed_creator_ids | any | false | none | Seed creators (TikTok handles or ids), up to 50. The result set is creators similar to these seeds. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| seed_crm_group_id | any | false | none | Seed from an existing CRM group's members (resolved server-side, scoped to your shop). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| seed_list_id | any | false | none | Seed from a saved list's members (resolved server-side, scoped to your shop). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| query | any | false | none | Text-description lookalike: describe the kind of creator to find. Used when no seed cohort is supplied. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| filters | any | false | none | Optional creator filters, same shape as the portal search filters. post_rate is on a 0–100 scale (sample-fulfillment %). Unrecognized filter keys are rejected with a 400 rather than silently ignored. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | object | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| page | integer | false | none | none |
| page_size | integer | false | none | none |
AISearchPagination
{
"total": 0,
"page": 0,
"page_size": 0
}
AISearchPagination
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| total | integer | true | none | none |
| page | integer | true | none | none |
| page_size | integer | true | none | none |
AISearchTranscriptRequest
{
"query": "string",
"match_sources": [
"audio"
],
"filters": {},
"page": 1,
"page_size": 20
}
AISearchTranscriptRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| query | string | true | none | Natural-language phrase to match against creator video transcripts (required). |
| match_sources | [string] | false | none | Which transcript sources to search: 'audio' (spoken words) and/or 'video' (on-screen text). Defaults to ['audio']. Duplicates are de-duplicated. |
| filters | any | false | none | Optional creator filters (categories, follower/GMV ranges, etc.), same shape as the portal search filters. post_rate is on a 0–100 scale (sample-fulfillment %). Unrecognized filter keys are rejected with a 400 rather than silently ignored. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | object | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| page | integer | false | none | none |
| page_size | integer | false | none | none |
AISearchVideo
{
"video_id": "string",
"tiktok_url": "string",
"views": 0,
"match_type": "string",
"snippet": "string"
}
AISearchVideo
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video_id | string | true | none | none |
| tiktok_url | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| views | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| match_type | any | false | none | Why this video matched, for the transcript/video modes: 'audio' (spoken words), 'video' (on-screen visual/text). Null on the profile/lookalike modes, where top_videos are the creator's representative videos rather than per-query matches. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| snippet | any | false | none | Matched transcript excerpt (transcript mode only). Null otherwise. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
AISearchVideoRequest
{
"query": "string",
"image": "string",
"filters": {},
"page": 1,
"page_size": 20
}
AISearchVideoRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| query | any | false | none | Natural-language description of the visual content to match. Optional if 'image' is supplied. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| image | any | false | none | Base64-encoded reference image (PNG/JPG/WebP, <=10MB decoded). Optional if 'query' is supplied. A raw 'data:;base64,' prefix is accepted. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| filters | any | false | none | Optional creator filters, same shape as the portal search filters. post_rate is on a 0–100 scale (sample-fulfillment %). Unrecognized filter keys are rejected with a 400 rather than silently ignored. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | object | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| page | integer | false | none | none |
| page_size | integer | false | none | none |
AcceptCreatorRequest
{
"message": "string"
}
AcceptCreatorRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| message | any | false | none | Optional custom message included in the creator's acceptance email/SMS. If omitted, the campaign's default acceptance template is used. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
AccountInvoice
{
"id": "string",
"amount": 0,
"status": "string",
"due_date": "string",
"billing_month": "string",
"plans": {
"property1": 0,
"property2": 0
},
"invoice_pdf": "string"
}
AccountInvoice
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| id | string | true | none | Stripe invoice id, or Upcoming-<subscription_id> for the previewed next charge (which has no invoice yet). |
| amount | any | false | none | Invoice total in the minor units of the billing currency. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| status | any | false | none | Paid, Past Due, or Upcoming. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| due_date | any | false | none | Formatted as '01 Jan 2026'. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| billing_month | any | false | none | Formatted as 'January 2026'. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| plans | object | false | none | Plan name → seat quantity billed on this invoice. |
| » additionalProperties | integer | false | none | none |
| invoice_pdf | any | false | none | Stripe-hosted PDF link. Null for upcoming invoices, which do not exist as documents yet. The link is time-limited by Stripe. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
AccountInvoicesResponse
{
"has_stripe_customer": true,
"data": [
{
"id": "string",
"amount": 0,
"status": "string",
"due_date": "string",
"billing_month": "string",
"plans": {
"property1": 0,
"property2": 0
},
"invoice_pdf": "string"
}
]
}
AccountInvoicesResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| has_stripe_customer | boolean | true | none | False when this account has never been billed through Stripe. |
| data | [AccountInvoice] | true | none | [One Stripe invoice — settled history or the next upcoming charge.] |
AccountLimitsResponse
{
"data": [
{
"shop_id": 0,
"shop_name": "string",
"plan": "string",
"limits": {
"property1": {
"property1": 0,
"property2": 0
},
"property2": {
"property1": 0,
"property2": 0
}
}
}
]
}
AccountLimitsResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | [AccountShopLimits] | true | none | [Resolved entitlements for one shop.] |
AccountShopLimits
{
"shop_id": 0,
"shop_name": "string",
"plan": "string",
"limits": {
"property1": {
"property1": 0,
"property2": 0
},
"property2": {
"property1": 0,
"property2": 0
}
}
}
AccountShopLimits
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | integer | true | none | none |
| shop_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| plan | any | false | none | The shop's plan tier the limits were resolved against. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| limits | object | false | none | category → limit type → effective value, e.g. {"crm": {"default": 5000, "maximum": 20000}}. |
| » additionalProperties | object | false | none | none |
| »» additionalProperties | integer | false | none | none |
AccountSubscriptionItem
{
"subscription_item_id": "string",
"shop_id": 0,
"shop_name": "string",
"plan": "string",
"interval": "string",
"unit_amount": 0,
"status": "string",
"stripe_status": "string",
"current_period_end": "string",
"trial_end": "string",
"cancel_at": "string",
"access_expires_on": "string",
"next_payment_attempt": "string",
"collection_method": "string",
"attempt_count": 0
}
AccountSubscriptionItem
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| subscription_item_id | any | false | none | Stripe subscription-item id (si_...). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | any | false | none | Shop this seat is linked to; null when unassigned. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| plan | any | false | none | Human-readable plan name and billing cycle. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| interval | any | false | none | monthly, yearly, ... |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| unit_amount | any | false | none | Seat price in the minor units of the billing currency. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| status | any | false | none | Reacher-side seat state: null/active, subscription_canceled (in the paid-through grace window), or archived. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| stripe_status | any | false | none | Live Stripe subscription status (active, trialing, past_due, canceled, ...). Null when Stripe was unreachable. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| current_period_end | any | false | none | End of the current billing period. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| trial_end | any | false | none | Trial end date (YYYY-MM-DD). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| cancel_at | any | false | none | Scheduled cancellation date (YYYY-MM-DD). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| access_expires_on | any | false | none | Cancel-grace expiry (YYYY-MM-DD) — the date a canceled seat stops granting access. Set only while status is subscription_canceled. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| next_payment_attempt | any | false | none | Next Stripe payment retry date (YYYY-MM-DD). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| collection_method | any | false | none | charge_automatically or send_invoice. Invoice-billed customers sit in past_due legitimately — that is not a card failure. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| attempt_count | any | false | none | Charge attempts on the latest invoice. 0 means Stripe has never attempted a charge, so nothing has failed. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
AccountSubscriptionResponse
{
"has_stripe_customer": true,
"data": [
{
"subscription_item_id": "string",
"shop_id": 0,
"shop_name": "string",
"plan": "string",
"interval": "string",
"unit_amount": 0,
"status": "string",
"stripe_status": "string",
"current_period_end": "string",
"trial_end": "string",
"cancel_at": "string",
"access_expires_on": "string",
"next_payment_attempt": "string",
"collection_method": "string",
"attempt_count": 0
}
]
}
AccountSubscriptionResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| has_stripe_customer | boolean | true | none | False when this account has never been billed through Stripe. |
| data | [AccountSubscriptionItem] | true | none | [One billable seat — a Stripe subscription item, optionally linked to a shop.] |
ActionRulePublic
{
"action_type": "set_up_creative_boost",
"params": {}
}
ActionRulePublic
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| action_type | ActionType | true | none | What the action does. Currently only set_up_creative_boost is wired up to the execution engine. |
| params | object | false | none | Action-specific parameters. For set_up_creative_boost: {"maxCapPerDay": <float>} is the per-day spend cap (mirrors the portal Create-Automation form). |
ActionType
"set_up_creative_boost"
ActionType
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| ActionType | string | false | none | Side effect the automation performs when its conditions fire. Only set_up_creative_boost is wired up to the offline executionengine today. The other portal-side enum values ( budget_adjust,material_status_update, etc.) are template-preview-only and willnot actually execute; they are intentionally not exposed here so callers don't silently create no-op automations. |
Enumerated Values
| Property | Value |
|---|---|
| ActionType | set_up_creative_boost |
ActiveAutomation
{
"automation_id": 0,
"automation_name": "string",
"automation_type": "string",
"sample_requests": 0,
"last_finished_at": "2019-08-24T14:15:22Z",
"status": "string",
"status_msg": "string",
"status_details": "string",
"creators_remaining": 0,
"creators_reached": 0,
"skipped": 0,
"total_creators": 0,
"crm_group_id": "string",
"crm_group_name": "string",
"ai_enabled": false,
"created_at": "2019-08-24T14:15:22Z",
"target_collab_cleanup_creators_reached": 0
}
ActiveAutomation
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| automation_id | integer | true | none | Automation ID |
| automation_name | string | true | none | Automation name |
| automation_type | string | true | none | Type of automation (DM/TC/Message) |
| sample_requests | integer | false | none | Number of sample requests |
| last_finished_at | any | false | none | Last completion time |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date-time) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| status | string | true | none | Automation status |
| status_msg | any | false | none | User-friendly status message |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| status_details | any | false | none | Detailed status information |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creators_remaining | any | false | none | Creators remaining to message |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creators_reached | integer | false | none | Total creators reached |
| skipped | integer | false | none | Number of skipped creators |
| total_creators | integer | false | none | Total creators in group |
| crm_group_id | any | false | none | Associated CRM group ID |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| crm_group_name | any | false | none | Associated CRM group name |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| ai_enabled | boolean | false | none | Whether AI is enabled for this automation |
| created_at | any | false | none | When automation was created |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date-time) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| target_collab_cleanup_creators_reached | integer | false | none | Target collab cleanup count |
AdAccountItem
{
"account_id": "string",
"name": "string",
"currency": "string",
"account_status": 0,
"business_id": "string",
"business_name": "string",
"is_current": false
}
AdAccountItem
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| account_id | string | true | none | none |
| name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| currency | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| account_status | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| business_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| business_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| is_current | boolean | false | none | none |
AdAccountsResponse
{
"accounts": [
{
"account_id": "string",
"name": "string",
"currency": "string",
"account_status": 0,
"business_id": "string",
"business_name": "string",
"is_current": false
}
],
"current_ad_account_id": "string"
}
AdAccountsResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| accounts | [AdAccountItem] | false | none | none |
| current_ad_account_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
AdPerformanceMetrics
{
"impressions": 0,
"clicks": 0,
"reach": 0,
"spend": 0,
"ctr": 0,
"cpm": 0,
"conversions": 0
}
AdPerformanceMetrics
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| impressions | integer | false | none | none |
| clicks | integer | false | none | none |
| reach | integer | false | none | none |
| spend | number | false | none | none |
| ctr | number | false | none | none |
| cpm | number | false | none | none |
| conversions | integer | false | none | none |
AdPerformanceResponse
{
"account_id": "string",
"account_name": "string",
"currency": "string",
"date_preset": "last_30d",
"totals": {
"impressions": 0,
"clicks": 0,
"reach": 0,
"spend": 0,
"ctr": 0,
"cpm": 0,
"conversions": 0
},
"ads": [
{
"id": "string",
"name": "string",
"status": "string",
"effective_status": "string",
"created_time": "string",
"campaign_id": "string",
"adset_id": "string",
"creative_id": "string",
"thumbnail_url": "string",
"headline": "string",
"message": "string",
"link_url": "string",
"cta_type": "string",
"partner_ig_user_id": "string",
"partner_ig_username": "string",
"video_id": "string",
"video_url": "string",
"impressions": 0,
"clicks": 0,
"reach": 0,
"spend": 0,
"ctr": 0,
"cpm": 0,
"conversions": 0
}
]
}
AdPerformanceResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| account_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| account_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| currency | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| date_preset | string | false | none | none |
| totals | AdPerformanceMetrics | false | none | All numeric — defaults to 0 so the FE can render a card without avalue ?? '—' dance. conversions is the sum of all actions entries(across action_type) since the bare Marketing API doesn't surface a single "conversions" field — apps must aggregate the action breakdown themselves. |
| ads | [AdRow] | false | none | [Per-ad row for the ad-performance table. Metrics are best-effort — PAUSED ads with no impressions return an empty insights edge, in which case all numeric fields are zero. Creative fields (thumbnail_url, headline, message, link_url, partner_ig_user_id) are extracted from the ad's creative edge so theFE table can render visual rows + a detail modal without N+1 lookups.] |
AdRow
{
"id": "string",
"name": "string",
"status": "string",
"effective_status": "string",
"created_time": "string",
"campaign_id": "string",
"adset_id": "string",
"creative_id": "string",
"thumbnail_url": "string",
"headline": "string",
"message": "string",
"link_url": "string",
"cta_type": "string",
"partner_ig_user_id": "string",
"partner_ig_username": "string",
"video_id": "string",
"video_url": "string",
"impressions": 0,
"clicks": 0,
"reach": 0,
"spend": 0,
"ctr": 0,
"cpm": 0,
"conversions": 0
}
AdRow
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| id | string | true | none | none |
| name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| status | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| effective_status | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| created_time | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| campaign_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| adset_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creative_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| thumbnail_url | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| headline | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| message | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| link_url | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| cta_type | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| partner_ig_user_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| partner_ig_username | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video_url | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| impressions | integer | false | none | none |
| clicks | integer | false | none | none |
| reach | integer | false | none | none |
| spend | number | false | none | none |
| ctr | number | false | none | none |
| cpm | number | false | none | none |
| conversions | integer | false | none | none |
AddToCampaignRequest
{
"target_campaign_id": 0,
"target_shop_id": 0,
"notify": true
}
AddToCampaignRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| target_campaign_id | integer | true | none | Campaign the creator is being added to (lives in target_shop_id). |
| target_shop_id | integer | true | none | Shop that owns the target campaign. Must belong to the same customer as your API key (else 404). |
| notify | boolean | false | none | Send the creator an acceptance-style notification on add. SKIPPED on X-Dry-Run. |
AddToCampaignResponse
{
"success": true,
"code": "ok",
"data": {}
}
AddToCampaignResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| success | boolean | false | none | none |
| code | string | false | none | none |
| data | object | false | none | {campaign_creator_mapping_id, campaign_id, status='active'}. |
AffiliateCommissionAmounts
{
"commission_base": 0,
"standard_commission": 0,
"shop_ads_commission": 0,
"cofunded_creator_bonus": 0
}
AffiliateCommissionAmounts
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| commission_base | any | false | none | Product price x quantity the commission is computed on. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| standard_commission | any | false | none | Standard (plan) commission payment. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_ads_commission | any | false | none | Shop Ads commission payment, when the order came through Shop Ads. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| cofunded_creator_bonus | any | false | none | Co-funded creator bonus, when a campaign applied. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
AffiliateTransactionOut
{
"order_id": "string",
"sku_id": "string",
"product_id": "string",
"product_name": "string",
"quantity": 0,
"price": 0,
"payment_amount": 0,
"currency": "string",
"fully_refunded": true,
"payment_method": "string",
"order_status": "string",
"is_settled": true,
"creator_handle": "string",
"content_type": "string",
"content_id": "string",
"commission_model": "string",
"standard_commission_rate": 0,
"shop_ads_commission_rate": 0,
"estimated": {
"commission_base": 0,
"standard_commission": 0,
"shop_ads_commission": 0,
"cofunded_creator_bonus": 0
},
"actual": {
"commission_base": 0,
"standard_commission": 0,
"shop_ads_commission": 0,
"cofunded_creator_bonus": 0
},
"order_created_at": "string",
"paid_at": "string",
"delivered_at": "string",
"commission_paid_at": "string",
"platform": "string"
}
AffiliateTransactionOut
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| order_id | string | true | none | none |
| sku_id | string | true | none | none |
| product_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| quantity | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| price | any | false | none | Unit price at order time. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| payment_amount | any | false | none | What the buyer paid for this line, after discounts. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| currency | string | true | none | none |
| fully_refunded | any | false | none | TikTok's 'Fully returned or refunded' flag. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | boolean | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| payment_method | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| order_status | any | false | none | TikTok's commission status for the line: Pending |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| is_settled | boolean | true | none | True when order_status is Settled and actual amounts are final. |
| creator_handle | any | false | none | TikTok username of the creator credited with the sale. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| content_type | any | false | none | Video |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| content_id | any | false | none | ID of the video, LIVE or showcase that drove the sale. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| commission_model | any | false | none | e.g. 'fixed commission' or 'By order volume'. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| standard_commission_rate | any | false | none | Standard commission rate as a ratio (0.2 = 20%). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_ads_commission_rate | any | false | none | Shop Ads commission rate as a ratio; null when not a Shop Ads order. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| estimated | AffiliateCommissionAmounts | true | none | Commission as estimated at order creation. |
| actual | AffiliateCommissionAmounts | true | none | Commission as settled. Always present; each amount inside is null until the line settles. |
| order_created_at | any | false | none | ISO timestamp with offset, in the export timezone. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| paid_at | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| delivered_at | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| commission_paid_at | any | false | none | When TikTok paid the creator; null until then. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| platform | any | false | none | 'TTS' for TikTok Shop. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
AffiliateTransactionsRequest
{
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"creator_handle": "string",
"content_id": "string",
"content_type": "string",
"product_id": "string",
"sku_id": "string",
"order_status": "string",
"settled": true,
"limit": 100,
"offset": 0
}
AffiliateTransactionsRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| start_date | any | false | none | Inclusive window start on the order CREATED date (YYYY-MM-DD), in the shop's Affiliate Center timezone. Defaults to 30 days before end_date. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_date | any | false | none | Inclusive window end (YYYY-MM-DD). Defaults to yesterday — the current day is still accumulating. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_handle | any | false | none | Filter to one creator by TikTok username. A leading '@' is ignored; case-insensitive. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| content_id | any | false | none | Filter to the video, LIVE or showcase that drove the sale (TikTok content ID). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| content_type | any | false | none | Filter by content type, case-insensitive. Values TikTok ships: Video, Livestream, Showcase, Affiliate Product Page. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_id | any | false | none | Filter to one product. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sku_id | any | false | none | Filter to one SKU. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| order_status | any | false | none | Filter by TikTok's own commission status, case-insensitive. Values seen: Pending, Settled, Ineligible, Awaiting payment. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| settled | any | false | none | True = only lines whose commission has settled, False = everything else (pending, ineligible, awaiting payment). Unsettled amounts still move. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | boolean | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| limit | integer | false | none | Page size. |
| offset | integer | false | none | Page offset. Capped at 100,000: deeper pages still scan and sort everything before them, so narrow the date window instead. |
AffiliateTransactionsResponse
{
"shop_id": 0,
"seller_id": "string",
"start_date": "string",
"end_date": "string",
"total": 0,
"limit": 0,
"offset": 0,
"transactions": [
{
"order_id": "string",
"sku_id": "string",
"product_id": "string",
"product_name": "string",
"quantity": 0,
"price": 0,
"payment_amount": 0,
"currency": "string",
"fully_refunded": true,
"payment_method": "string",
"order_status": "string",
"is_settled": true,
"creator_handle": "string",
"content_type": "string",
"content_id": "string",
"commission_model": "string",
"standard_commission_rate": 0,
"shop_ads_commission_rate": 0,
"estimated": {
"commission_base": 0,
"standard_commission": 0,
"shop_ads_commission": 0,
"cofunded_creator_bonus": 0
},
"actual": {
"commission_base": 0,
"standard_commission": 0,
"shop_ads_commission": 0,
"cofunded_creator_bonus": 0
},
"order_created_at": "string",
"paid_at": "string",
"delivered_at": "string",
"commission_paid_at": "string",
"platform": "string"
}
],
"data_status": {
"state": "string",
"last_synced_at": "string",
"last_window": {
"start_date": "string",
"end_date": "string"
}
}
}
AffiliateTransactionsResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | integer | true | none | none |
| seller_id | string | true | none | none |
| start_date | string | true | none | Resolved inclusive window start (order-created date). |
| end_date | string | true | none | Resolved inclusive window end. |
| total | integer | true | none | none |
| limit | integer | true | none | none |
| offset | integer | true | none | none |
| transactions | [AffiliateTransactionOut] | true | none | [One order x SKU row of the Affiliate Center orders export.] |
| data_status | PnlDataStatus | true | none | Freshness of this shop's affiliate order export: never_run means the shop is not enabled for it yet. |
AgencyViewBody
{
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"page": 1,
"page_size": 10,
"sort_field": "affiliate_gmv",
"sort_order": "desc",
"search": "string"
}
AgencyViewBody
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| start_date | any | false | none | First day of the window (inclusive). Defaults to 7 days back. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_date | any | false | none | Last day of the window (inclusive). Defaults to yesterday. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| page | integer | false | none | 1-based page number. |
| page_size | integer | false | none | Rows per page (max 100). |
| sort_field | string | false | none | Column to sort by. One of: affiliate_gmv, videos_posted, video_views, active_creators, gmv_per_video, gmv_per_sample, video_conversion_rate, shop_name. |
| sort_order | string | false | none | 'asc' or 'desc'. |
| search | any | false | none | Case-insensitive shop-name filter. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
AgencyViewResponse
{
"data": [
{
"shop_id": 0,
"shop_name": "string",
"affiliate_gmv": 0,
"affiliate_gmv_pct_change": 0,
"videos_posted": 0,
"videos_posted_pct_change": 0,
"video_views": 0,
"video_views_pct_change": 0,
"videos_converted": 0,
"video_conversion_rate": 0,
"video_conversion_rate_pct_change": 0,
"active_creators": 0,
"active_creators_pct_change": 0,
"gmv_per_video": 0,
"gmv_per_video_pct_change": 0,
"gmv_per_sample": 0,
"gmv_per_sample_pct_change": 0,
"currency_symbol": "$"
}
],
"total_pagination": 0,
"page": 0,
"page_size": 0
}
AgencyViewResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | [AgencyViewShopData] | true | none | [Single shop data for Agency View table. Period-comparison fields ( *_pct_change) are populated from the previoustime period of the same length (e.g. previous 30 days for a 30-day window).] |
| total_pagination | integer | true | none | none |
| page | integer | true | none | none |
| page_size | integer | true | none | none |
AgencyViewShopData
{
"shop_id": 0,
"shop_name": "string",
"affiliate_gmv": 0,
"affiliate_gmv_pct_change": 0,
"videos_posted": 0,
"videos_posted_pct_change": 0,
"video_views": 0,
"video_views_pct_change": 0,
"videos_converted": 0,
"video_conversion_rate": 0,
"video_conversion_rate_pct_change": 0,
"active_creators": 0,
"active_creators_pct_change": 0,
"gmv_per_video": 0,
"gmv_per_video_pct_change": 0,
"gmv_per_sample": 0,
"gmv_per_sample_pct_change": 0,
"currency_symbol": "$"
}
AgencyViewShopData
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | integer | true | none | none |
| shop_name | string | true | none | none |
| affiliate_gmv | number | true | none | none |
| affiliate_gmv_pct_change | number | false | none | none |
| videos_posted | integer | true | none | none |
| videos_posted_pct_change | number | false | none | none |
| video_views | integer | false | none | none |
| video_views_pct_change | number | false | none | none |
| videos_converted | integer | false | none | none |
| video_conversion_rate | number | false | none | none |
| video_conversion_rate_pct_change | number | false | none | none |
| active_creators | integer | true | none | none |
| active_creators_pct_change | number | false | none | none |
| gmv_per_video | number | false | none | none |
| gmv_per_video_pct_change | number | false | none | none |
| gmv_per_sample | number | false | none | none |
| gmv_per_sample_pct_change | number | false | none | none |
| currency_symbol | string | false | none | none |
AggregatedMetrics
{
"unfulfilled": 0,
"postRate": 0,
"avgViews": 0,
"ppsScore": 0,
"liveGmv": 0,
"engagementRate": 0,
"shopGmv": 0,
"creatorGmv": 0,
"avgGmvPerVideo": 0,
"gmvPerSample": 0,
"videosPerSample": 0
}
AggregatedMetrics
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| unfulfilled | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| postRate | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| avgViews | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| ppsScore | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| liveGmv | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| engagementRate | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shopGmv | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creatorGmv | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| avgGmvPerVideo | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| gmvPerSample | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| videosPerSample | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
ApprovalTargetMetric
{
"monthlyLimit": 0,
"monthlyUsed": 0,
"dailyTarget": 0,
"dailyCurrent": 0,
"dailyPct": 0,
"onTrack": true
}
ApprovalTargetMetric
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| monthlyLimit | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| monthlyUsed | integer | true | none | none |
| dailyTarget | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| dailyCurrent | integer | true | none | none |
| dailyPct | number | true | none | none |
| onTrack | boolean | true | none | none |
ApprovalTargetSummary
{
"limit": 0,
"used": 0
}
ApprovalTargetSummary
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| limit | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| used | integer | false | none | none |
ArchiveTrackerRequest
{
"campaign_creator_mapping_id": 0
}
ArchiveTrackerRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| campaign_creator_mapping_id | integer | true | none | none |
ArchiveTrackerResponse
{
"status": "string",
"message": "string"
}
ArchiveTrackerResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| status | string | true | none | none |
| message | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
ArchivedCount
{
"creators": 0,
"products": 0,
"total": 0
}
ArchivedCount
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creators | integer | false | none | none |
| products | integer | false | none | none |
| total | integer | true | read-only | none |
AutomationConfigDetails
{
"messaging": {
"creator_message": "string",
"message_type": "string",
"message_sequence": [
{
"message_type": "string",
"message_entry": "string",
"product_id": "string",
"days_after_previous": 0,
"has_image": true
}
],
"follow_up_steps": [
{
"message_type": "string",
"message_entry": "string",
"product_id": "string",
"days_after_previous": 0,
"has_image": true
}
],
"personalization": {},
"ai_custom_qa": [
null
],
"spark_code_form": {}
},
"target_collab": {
"invitation_name": "string",
"invitation_message": "string",
"valid_until": "string",
"content_type": "string",
"products": [
{
"product_id": "string",
"product_name": "string",
"commission_rate": 0,
"shop_min_commission": 0,
"shop_ads_commission_rate": 0
}
],
"offer_free_samples": true,
"auto_approve_samples": true,
"auto_resolve_conflicts": "string",
"support_contact_email": "string",
"support_contact_phone": "string",
"invite_start_before_days": "string",
"invite_expire_after_days": "string"
},
"schedule": {
"daily_caps": {
"property1": 0,
"property2": 0
},
"start_time": "string",
"timezone": "string"
},
"targeting": {
"creator_source_type": "string",
"include_lists": [
"string"
],
"include_uploads": [
null
],
"crm_group_id": "string",
"exclude_lists": [
"string"
],
"exclude_crm_groups": [
null
],
"exclude_previously_messaged": true,
"filters": {},
"ai_search_filters": {}
}
}
AutomationConfigDetails
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| messaging | AutomationMessagingDetail | false | none | The outreach message content the portal shows: the actual DM/creator message text, the message-type selector, and the ordered send sequence. |
| target_collab | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | AutomationTargetCollabDetail | false | none | Target Collab card configuration — present only for TC / TC-cleanup automations ( None for DM / email / sample-request types). |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| schedule | AutomationScheduleDetail | false | none | The send schedule the portal's edit view shows. |
| targeting | AutomationTargetingDetail | false | none | Which creators the automation targets — the portal's 'creators to include / exclude' selection. |
AutomationCreateRequestPublic
{
"name": "string",
"template_type": "string",
"trigger_frequency": "daily",
"campaign_ids": [
"string"
],
"conditions": [
{
"metric": "creative_roi",
"operator": "lt",
"value": 0,
"lookback_days": 3
}
],
"actions": [
{
"action_type": "set_up_creative_boost",
"params": {}
}
],
"guardrails": [
{
"rule_type": "total_creative_boost_cost",
"operator": "lt",
"value": 0
}
],
"boost_start_date": "2019-08-24",
"boost_end_date": "2019-08-24"
}
AutomationCreateRequestPublic
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| name | string | true | none | none |
| template_type | any | false | none | Optional reference to one of the /templates template_type values the automation was scaffolded from. Free-form — does not affect execution. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| trigger_frequency | TriggerFrequency | false | none | How often the automation evaluates. Only daily is wired up today. |
| campaign_ids | [string] | false | none | TikTok GMV Max campaign IDs the automation acts on. Each campaign_id can only be assigned to one active automation at a time — the controller rejects conflicts with a 422. |
| conditions | [ConditionRulePublic] | false | none | [One condition row in an automation's trigger logic.] |
| actions | [ActionRulePublic] | false | none | [One side-effect the automation performs when its conditions fire.] |
| guardrails | [GuardrailRulePublic] | false | none | [A safety cap that prevents the automation from spending past a limit.] |
| boost_start_date | any | false | none | First day boosts may fire. Must be paired with boost_end_date. Window cannot exceed 90 days. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| boost_end_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
AutomationCreatorOutcome
{
"creator_handle": "string",
"outcome": "string",
"status": "string",
"detail": "string",
"skip_reason": "string",
"invitation_id": "string"
}
AutomationCreatorOutcome
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_handle | string | true | none | TikTok handle as submitted. |
| outcome | string | true | none | Machine-stable outcome: invite_submitted (TC invite queued to the worker), outreach_sent (DM submitted), previously_invited (already invited for this product), invite_removed (invitation was withdrawn/edited), skipped (worker evaluated but did not send — see skip_reason), or unknown. |
| status | string | true | none | Human-readable status label, e.g. 'Outreach Sent'. |
| detail | string | true | none | Human-readable explanation of the outcome/status. |
| skip_reason | any | false | none | Machine skip-reason code, present only when outcome='skipped'. One of the CreatorSkipReason values: creator_not_found, creator_ineligible, five_message_limit_hit, previously_invited, previously_messaged, blocked_by_outreach_limit, performance_criteria_not_met, already_accepted_invite, conflicting_invitation, shop_blocked_creator, creator_blocked_shop, follower_threshold_exceeded, agency_sample_request_blocked, sample_request_expired, max_send_attempts_reached, unknown. Branch on this rather than parsing detail. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| invitation_id | any | false | none | TikTok target_collaboration_id for this creator's Target Collab invite — the id used to reference or look up the collaboration. Populated only for creators invited via Target Collab (outcomes invite_submitted / previously_invited / invite_removed); null for DM outreach, skipped creators, and TC invites the worker has not submitted to TikTok yet (it is written asynchronously after the invite lands). This is an identifier, not a link: TikTok's TC-details API returns no shareable invite URL, so there is no ready-made link to hand to the creator. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
AutomationCreatorsResponse
{
"data": [
{
"creator_handle": "string",
"outcome": "string",
"status": "string",
"detail": "string",
"skip_reason": "string",
"invitation_id": "string"
}
],
"summary": {
"total": 0,
"invite_submitted": 0,
"outreach_sent": 0,
"previously_invited": 0,
"invite_removed": 0,
"skipped": 0,
"unknown": 0
},
"pagination": null
}
AutomationCreatorsResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | [AutomationCreatorOutcome] | true | none | [One creator's outcome under an automation, assembled from the Messages / target_collabs / skipped_creators tables the worker writes. IMPORTANT — queued vs delivered: an invite_submitted /outreach_sent outcome means Reacher's worker submitted the invite /DM through the same browser-automation path the portal uses. TikTok does NOT return a per-creator inbox-delivery receipt, so this is the most authoritative delivery signal available — it is not a confirmed "landed in the creator's TikTok inbox" event.] |
| summary | AutomationCreatorsSummary | true | none | Outcome counts across the FULL result set (not just the page). |
| pagination | any | true | none | none |
AutomationCreatorsSummary
{
"total": 0,
"invite_submitted": 0,
"outreach_sent": 0,
"previously_invited": 0,
"invite_removed": 0,
"skipped": 0,
"unknown": 0
}
AutomationCreatorsSummary
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| total | integer | false | none | none |
| invite_submitted | integer | false | none | none |
| outreach_sent | integer | false | none | none |
| previously_invited | integer | false | none | none |
| invite_removed | integer | false | none | none |
| skipped | integer | false | none | none |
| unknown | integer | false | none | none |
AutomationDetailResponse
{
"data": {
"automation_id": 0,
"automation_name": "string",
"automation_type": "string",
"is_evergreen": false,
"status": "string",
"status_message": "string",
"gmv": 0,
"sample_requests": 0,
"accepted_requests": 0,
"videos_posted": 0,
"videos_converted": 0,
"creators_reached": 0,
"target_collab_cleanup_creators_reached": 0,
"dm_response_count": 0,
"reply_rate": 0,
"skipped": 0,
"total_creators": 0,
"creators_remaining": 0,
"created_at": "string",
"completed_at": "string",
"created_via": "string"
},
"creators_remaining": 0,
"details": {
"messaging": {
"creator_message": "string",
"message_type": "string",
"message_sequence": [
{
"message_type": "string",
"message_entry": "string",
"product_id": "string",
"days_after_previous": 0,
"has_image": true
}
],
"follow_up_steps": [
{
"message_type": "string",
"message_entry": "string",
"product_id": "string",
"days_after_previous": 0,
"has_image": true
}
],
"personalization": {},
"ai_custom_qa": [
null
],
"spark_code_form": {}
},
"target_collab": {
"invitation_name": "string",
"invitation_message": "string",
"valid_until": "string",
"content_type": "string",
"products": [
{
"product_id": "string",
"product_name": "string",
"commission_rate": 0,
"shop_min_commission": 0,
"shop_ads_commission_rate": 0
}
],
"offer_free_samples": true,
"auto_approve_samples": true,
"auto_resolve_conflicts": "string",
"support_contact_email": "string",
"support_contact_phone": "string",
"invite_start_before_days": "string",
"invite_expire_after_days": "string"
},
"schedule": {
"daily_caps": {
"property1": 0,
"property2": 0
},
"start_time": "string",
"timezone": "string"
},
"targeting": {
"creator_source_type": "string",
"include_lists": [
"string"
],
"include_uploads": [
null
],
"crm_group_id": "string",
"exclude_lists": [
"string"
],
"exclude_crm_groups": [
null
],
"exclude_previously_messaged": true,
"filters": {},
"ai_search_filters": {}
}
},
"currency": "string"
}
AutomationDetailResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | AutomationListItem | true | none | none |
| creators_remaining | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| details | any | false | none | Customer-facing automation configuration — the message content, Target Collab card, schedule, and targeting the portal's edit view shows. Present on the detail response only (the list response stays lean). Internal/infra config is never surfaced. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | AutomationConfigDetails | false | none | Customer-facing configuration for one automation, mirroring the portal's automation edit view. Only customer-set config is surfaced — internal / infra config keys are never included. Sub-blocks default to empty (rather than being omitted) so clients can read a stable shape across types; target_collab is None for non-TC automations. |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| currency | string | true | none | none |
AutomationDmRequest
{
"automation_name": "string",
"mode": "vanilla",
"schedule": {
"Monday_maxCreators": 0,
"Tuesday_maxCreators": 0,
"Wednesday_maxCreators": 0,
"Thursday_maxCreators": 0,
"Friday_maxCreators": 0,
"Saturday_maxCreators": 0,
"Sunday_maxCreators": 0,
"start_time": "string",
"end_time": "string",
"timezone": "string"
},
"creators_to_include": {
"list_upload": [
"string"
],
"lists_selected": [
"string"
],
"filters": {
"product_categories": [
"string"
],
"follower_count": {
"min": 0,
"max": 0
},
"creator_ethnicity": [
"string"
],
"gender": [
"string"
],
"age_range": [
"string"
],
"languages": [
"string"
],
"community": [
"string"
],
"gmv": {
"min": 0,
"max": 0
},
"units_sold": {
"min": 0,
"max": 0
},
"average_views": {
"min": 0,
"max": 0
},
"engagement_rate": {
"min": 0,
"max": 0
},
"post_rate": {
"min": 0,
"max": 0
},
"video_gpm": {
"min": 0,
"max": 0
},
"live_gpm": {
"min": 0,
"max": 0
},
"follower_age": [
"string"
],
"follower_gender": [
"string"
],
"face_visibility": [
"string"
],
"content_style": [
"string"
],
"production_quality": [
"string"
],
"personality_tone": [
"string"
],
"body_type": [
"string"
],
"hair_type": [
"string"
]
},
"crm_group_id": "string",
"crm_group_entered_after": "2019-08-24",
"crm_group_entered_before": "2019-08-24"
},
"creators_to_exclude": {
"list_upload": [
"string"
],
"lists_selected": [
"string"
],
"crm_groups": [
"string"
],
"exclude_previously_messaged": false
},
"messages": [
{
"type": "message",
"body": "string",
"image_url": "string",
"product_id": "string",
"submission_url_slug": "string"
}
],
"follow_ups": [
{
"delay_days": 30,
"addons": [
{
"type": "message",
"body": "string",
"image_url": "string",
"product_id": "string",
"submission_url_slug": "string"
}
]
}
],
"dm_config": {
"spark_code": {
"only_collect_creator_information": false,
"spark_code_submission_url": "string"
}
},
"personalization": {
"enabled": true,
"tone": "engaging",
"fallback_message": "string",
"offer_discussion": "",
"product_description": "",
"product_selling_points": "",
"word_counts": {
"property1": 0,
"property2": 0
},
"name_source": "first_name"
},
"ai_enabled": false,
"end_date": "2019-08-24",
"is_evergreen": false,
"business_hours_timezone": "string"
}
AutomationDmRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| automation_name | string | true | none | none |
| mode | string | false | none | none |
| schedule | AutomationSchedule | true | none | Per-day creator-outreach caps + run window. Stored into Automations.schedule JSONB. Same shape as the existing portal payload — keeps the portal and Public API agreeing on schema. |
| creators_to_include | CreatorsToInclude | false | none | Outreach-paradigm recipient inclusion. Three mutually-exclusive modes (cf. INTERNAL-design-review.md §11A): * lists mode — list_upload and/or lists_selected populated* filters mode — filters populated (dynamic by attribute)* crm_group mode — crm_group_id populated (saved predicate)The validator below rejects any request that mixes modes. The creator_source_type discriminator written to config is derivedfrom which mode is set — callers don't need to set it explicitly. |
| creators_to_exclude | CreatorsToExclude | false | none | Outreach-paradigm recipient exclusion. Mirrors creators_to_omit inthe legacy DB column / frontend payload, plus the boolean exclude_previously_messaged flag from the portal's Exclude Creators panel. |
| messages | [MessageAddon] | true | none | Initial-outreach addons — text + optional image / product card / spark_code form. ALL items are sent immediately together when the automation engages a creator. Use follow_ups for delayed steps. |
| follow_ups | [FollowUpStep] | false | none | Delayed follow-up steps — same shape as TC. |
| dm_config | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | DmConfig | false | none | DM type-specific config blob, populated based on mode. |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| personalization | any | false | none | CORE-4857: enable AI personalization of the initial-outreach DM. Omit to send the message exactly as written. When set, the send engine rewrites the DM per creator from the [Block] tokens in your message text and falls back to fallback_message for low-signal creators. See DmPersonalizationConfig. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | DmPersonalizationConfig | false | none | CORE-4857 — enable AI personalization of the initial-outreach DM. When set on POST /automations/dm, the send engine rewrites the DM bodyper creator using the [Block] tokens in your message text: Content Discussion and Product Discussion are AI-generated from the creator's own signals, while Product Description / Selling Points / Offer are the fixed strings you provide here. A creator with too little signal to personalize receives fallback_message instead.All copy fields are stored verbatim — there is NO server-side AI at create time — so the create is deterministic and idempotent, and the send path's reuse hash stays stable. Resolve the product blocks beforehand via POST /personalization/product-blocks and preview any creator viaPOST /personalization/preview so what ships is what you approved. |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| ai_enabled | boolean | false | none | none |
| end_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| is_evergreen | boolean | false | none | When true, the automation continuously re-evaluates its creators_to_include.filters for new qualifying creators on each run. No effect when creators_to_include.crm_group_id is set (CRM groups are inherently evergreen). Maps to top-level Automations.is_evergreen column. |
| business_hours_timezone | any | false | none | When set, the runtime restricts outbound message delivery (initial outreach + follow-ups) to 9am–9pm in this IANA timezone (e.g. America/Los_Angeles). Null disables the restriction. The 9–9 window is fixed; only the timezone is configurable. Distinct from schedule.timezone. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| mode | vanilla |
| mode | with_image |
| mode | with_product_card |
| mode | spark_code |
AutomationEmailRequest
{
"automation_name": "string",
"email_account_id": 0,
"subject": "string",
"body": "string",
"selection_mode": "mailing_list",
"mailing_list": {
"list_upload_emails": [
"string"
],
"lists_selected": [
"string"
]
},
"filters": {
"min_creator_gmv": 0,
"min_followers": 0,
"min_engagement_rate": 1,
"min_avg_views": 0,
"regions": [
"string"
],
"categories": [
"string"
]
},
"creators_to_exclude": {
"list_upload": [
"string"
],
"lists_selected": [
"string"
],
"crm_groups": [
"string"
],
"exclude_previously_messaged": false
},
"attachments": [
{
"name": "string",
"url": "string"
}
]
}
AutomationEmailRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| automation_name | string | true | none | none |
| email_account_id | integer | true | none | Pre-connected email account. May back several active email automations; each one adds to that inbox's daily send volume. |
| subject | string | true | none | none |
| body | string | true | none | HTML or plaintext. |
| selection_mode | string | true | none | none |
| mailing_list | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | EmailMailingList | false | none | selection_mode=mailing_list — recipients via uploaded emails or existing Lists (vault_files with non-empty creator_emails).NOTE: lists referenced by lists_selected MUST contain at least oneemail address — the vault_files.creator_emails JSONB column must benon-empty. Targeting requires emails to send to. The route validates this at create time and returns 400 LIST_MISSING_EMAILS for anylist that lacks emails. Per architecture review 2026-05-01. |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| filters | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | EmailFilters | false | none | selection_mode=filters — recipients via creator search filters. Subset of the saved_searches.filters JSONB shape — fields that make sense for email outreach. Backend translates this into the legacy filters JSON. |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creators_to_exclude | CreatorsToExclude | false | none | Outreach-paradigm recipient exclusion. Mirrors creators_to_omit inthe legacy DB column / frontend payload, plus the boolean exclude_previously_messaged flag from the portal's Exclude Creators panel. |
| attachments | [EmailAttachment] | false | none | Email attachments — [{name, url}] shape. URL must be a hosted HTTPS URL (no file uploads). Server fetches at create time and re-hosts internally. |
Enumerated Values
| Property | Value |
|---|---|
| selection_mode | mailing_list |
| selection_mode | filters |
AutomationListItem
{
"automation_id": 0,
"automation_name": "string",
"automation_type": "string",
"is_evergreen": false,
"status": "string",
"status_message": "string",
"gmv": 0,
"sample_requests": 0,
"accepted_requests": 0,
"videos_posted": 0,
"videos_converted": 0,
"creators_reached": 0,
"target_collab_cleanup_creators_reached": 0,
"dm_response_count": 0,
"reply_rate": 0,
"skipped": 0,
"total_creators": 0,
"creators_remaining": 0,
"created_at": "string",
"completed_at": "string",
"created_via": "string"
}
AutomationListItem
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| automation_id | integer | true | none | none |
| automation_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| automation_type | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| is_evergreen | boolean | false | none | True for evergreen CRM-group automations that re-run whenever new creators enter the group. Between cycles these display status: Completed with completed_at: null — is_evergreen=true means armed-and-waiting, NOT finished. |
| status | any | false | none | Display status from map_automation_status() |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| status_message | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| gmv | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sample_requests | any | false | none | DB: automation_metrics.sample_request (singular) |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| accepted_requests | any | false | none | DB: automation_metrics.accepted_request (singular) |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| videos_posted | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| videos_converted | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creators_reached | any | false | none | Per-automation distinct creators reached by THIS automation. Lifetime when the request has no start_date/end_date; windowed when a date filter is supplied. For the shop-wide windowed total that matches the portal's Outreach Metrics dashboard, use the top-level aggregate.creators_reached field — it's a different number computed from the agency rollup table and won't equal the sum of these per-row values. For a TC Cleanup automation this is coalesced to target_collab_cleanup_creators_reached (its reach lands there, not in new-outreach counts) so it is correct for every type. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| target_collab_cleanup_creators_reached | any | false | none | Creators reached by a TC Cleanup automation (edited/removed invitations, DB status EDITED_INVITATION). Cleanup automations carry their reach here, not in the new-outreach counts; creators_reached above is coalesced to this. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| dm_response_count | any | false | none | DB: automation_metrics.dm_response_count — unique creators who replied to DMs (30-day rolling) |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| reply_rate | any | false | none | Computed: (dm_response_count / creators_reached) * 100. Populated for Running, Stopped, and Completed automations. Null when creators_reached is 0. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| skipped | any | false | none | Per-automation creators the worker evaluated but did NOT reach (handle unresolved, outreach-limit blocked, previously invited, below criteria, etc.). Sourced from the same stats view as creators_reached / total_creators: that view only retains rows for automations with recent activity, so all three read null (not 0) for automations idle for more than ~a day — null means 'no stats row', not 'zero skips'. For the always-available, per-creator breakdown of WHO was skipped and WHY, call GET /public/v1/automations/{automation_id}/creators. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| total_creators | any | false | none | Per-automation creators processed (reached + skipped) — NOT the audience size. 0 until sending begins; see creators_remaining for the resolved audience.Note: this is a per-row number scoped to ONE automation. Summing across rows will exceed the portal's shop-wide 'Total Creators' headline because the dashboard counts distinct creators-per-day across the whole shop, then sums days. For that headline number, read aggregate.tc_invites_creator_count on the top-level response. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creators_remaining | any | false | none | Resolved audience still to be processed. This is what confirms the audience resolved (e.g. your uploaded/CRM-group creators). Populated right after the automation is started. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| created_at | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| completed_at | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| created_via | any | false | none | Surface that created this automation. Always populated: rows with NULL/empty created_via (predating migration 020) surface as portal. Common values: portal |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
AutomationMessageStep
{
"message_type": "string",
"message_entry": "string",
"product_id": "string",
"days_after_previous": 0,
"has_image": true
}
AutomationMessageStep
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| message_type | any | false | none | Step kind, e.g. initial_message / message / image / tc_card. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| message_entry | any | false | none | The step's message text (template; placeholders not substituted). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_id | any | false | none | Product shown, for product-card / TC-card steps. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| days_after_previous | any | false | none | Follow-up delay in days (follow-up steps only). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| has_image | any | false | none | True when the step attaches an image. The internal image URL / filename is intentionally not exposed. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | boolean | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
AutomationMessagesTemplateResponse
{
"automation_id": 0,
"automation_name": "string",
"automation_type": "string",
"tc_invite_message": "string",
"message_sequence": [
null
],
"follow_up_steps": [
null
],
"ai_custom_qa": [
null
],
"personalization": {
"enabled": false,
"tone": "string",
"fallback_message": "string",
"offer_discussion": "string",
"product_description": "string",
"product_selling_points": "string",
"word_counts": {
"property1": 0,
"property2": 0
},
"name_source": "string"
}
}
AutomationMessagesTemplateResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| automation_id | integer | true | none | none |
| automation_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| automation_type | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| tc_invite_message | any | false | none | config.TARGET_COLLAB_MESSAGE — TC invite template (TC types only) |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| message_sequence | [any] | false | none | config.addons — ordered DM sequence; array order is send order |
| follow_up_steps | [any] | false | none | none |
| ai_custom_qa | [any] | false | none | none |
| personalization | any | false | none | CORE-4857 AI personalization config, when the automation has it (DM types only). Null otherwise. Configure via POST /automations/dm; use POST /personalization/* to preview. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | AutomationPersonalizationConfig | false | none | CORE-4857 — the AI-personalization config on a DM automation, read back. Projected from config.PERSONALIZATION (the block the send engine reads).Present only when personalization was configured — via the portal composer or via POST /automations/dm with a personalization object. nullon automations that don't use it. Product/offer strings are the fixed values the brand approved; the Content/Product-Discussion blocks are AI-generated per creator at send time and so aren't stored here. |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
AutomationMessagingDetail
{
"creator_message": "string",
"message_type": "string",
"message_sequence": [
{
"message_type": "string",
"message_entry": "string",
"product_id": "string",
"days_after_previous": 0,
"has_image": true
}
],
"follow_up_steps": [
{
"message_type": "string",
"message_entry": "string",
"product_id": "string",
"days_after_previous": 0,
"has_image": true
}
],
"personalization": {},
"ai_custom_qa": [
null
],
"spark_code_form": {}
}
AutomationMessagingDetail
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_message | any | false | none | The main DM / creator message body the automation sends (config.CREATOR_MESSAGE). Placeholders (e.g. {creator_name}) are NOT substituted — this is the template. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| message_type | any | false | none | Selected message type / mode (config.SELECTED_MESSAGE_TYPE). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| message_sequence | [AutomationMessageStep] | false | none | Ordered initial-outreach steps (config.addons). Array order IS send order (text / image / product card / TC card). |
| follow_up_steps | [AutomationMessageStep] | false | none | Delayed follow-up steps (config.FOLLOW_UP_STEPS / followup_steps). |
| personalization | any | false | none | AI-personalization settings when the automation enabled it (projected config.PERSONALIZATION). Null for non-personalized DMs. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | object | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| ai_custom_qa | [any] | false | none | AI-chatbot Q&A knowledge base entries (ai_config.custom_messages). |
| spark_code_form | any | false | none | Spark-code form settings, for automations created through this API and in the portal alike. recipient_criteria is the portal's audience filter — null when the automation selects by CRM group, or when it was created through the API. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | object | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
AutomationMetricsResponse
{
"data_available": true,
"is_full_view": false,
"tab_counts": {
"creator_tracker_count": 0,
"sample_request_count": 0,
"video_count": 0,
"reply_count": 0,
"unread_count": 0
},
"top_line_metrics": {
"creators_reached": 0,
"dm_response_count": 0,
"reply_rate": 0,
"unique_creators_posted": 0,
"post_rate": 0,
"videos_count": 0,
"total_revenue": 0,
"total_views": 0,
"total_shares": 0,
"total_likes": 0
}
}
AutomationMetricsResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data_available | boolean | false | none | none |
| is_full_view | boolean | false | none | none |
| tab_counts | TabCounts | true | none | none |
| top_line_metrics | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | TopLineMetrics | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
AutomationPersonalizationConfig
{
"enabled": false,
"tone": "string",
"fallback_message": "string",
"offer_discussion": "string",
"product_description": "string",
"product_selling_points": "string",
"word_counts": {
"property1": 0,
"property2": 0
},
"name_source": "string"
}
AutomationPersonalizationConfig
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| enabled | boolean | false | none | Whether the send engine personalizes this automation's DM. |
| tone | any | false | none | AI rewrite tone (engaging |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| fallback_message | any | false | none | Sent verbatim (name/product blocks filled) to creators with too little signal to personalize. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| offer_discussion | any | false | none | [Offer Discussion] block value. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_description | any | false | none | [Product Description] block value. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_selling_points | any | false | none | [Product Selling Points] block value. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| word_counts | any | false | none | Approximate per-AI-block word-count targets, e.g. {"content_discussion": 25, "product_discussion": 20}. Null uses the brevity default. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | object | false | none | none |
| »» additionalProperties | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| name_source | any | false | none | Which name fills the creator-name token (CORE-7779): first_name (the shipping first name on the creator's last order) or display_name (their TikTok display name). Null on automations that never set it -- same as first_name. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
AutomationProductDetail
{
"product_id": "string",
"product_name": "string",
"commission_rate": 0,
"shop_min_commission": 0,
"shop_ads_commission_rate": 0
}
AutomationProductDetail
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| commission_rate | any | false | none | Base commission, whole-number percent (20.0 == 20%). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_min_commission | any | false | none | Shop minimum commission, whole-number percent. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_ads_commission_rate | any | false | none | Shop Ads commission, whole-number percent. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
AutomationResourceV2
{
"automation_id": 0,
"shop_id": 0,
"automation_name": "string",
"automation_type": "string",
"automation_status": "string",
"state": "string",
"config": {},
"schedule": {},
"creators_to_include": {},
"creators_to_exclude": {},
"crm_group_id": "string",
"ai_enabled": false,
"end_date": "string",
"created_at": "string",
"updated_at": "string",
"created_via": "string",
"side_effects": {}
}
AutomationResourceV2
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| automation_id | any | false | none | None on dry-run. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | integer | true | none | none |
| automation_name | string | true | none | none |
| automation_type | string | true | none | One of: target_collab |
| automation_status | string | true | none | none |
| state | string | true | none | none |
| config | object | false | none | Full config as stored. Type-specific. |
| schedule | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | object | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creators_to_include | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | object | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creators_to_exclude | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | object | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| crm_group_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| ai_enabled | boolean | false | none | none |
| end_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| created_at | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| updated_at | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| created_via | any | false | none | Surface that created the automation. Always populated on response: rows with NULL or empty created_via (predating migration 020) are surfaced as portal since the portal was historically the only writer. Common values: portal |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| side_effects | any | false | none | Backend side-effects, e.g. {'crm_group_created': ''} on sample_request creates. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | object | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
AutomationSampleRequestRequest
{
"automation_name": "string",
"sample_request": {
"action": "approve",
"rejection_reason": "NOT_MATCH",
"approval_message": "string",
"rejection_message": "string",
"message_images": [
"string"
],
"products": {
"include_all_products": false,
"selected_products": [
{
"product_id": "string",
"max_approvals_per_week": 10000
}
],
"weekly_auto_approval_per_product": 1
},
"minimum_performance_criteria": {
"followers": 0,
"avg_views": 0,
"engagement_rate": 1,
"post_rate": 1,
"creator_gmv_30_days": 0,
"gmv_per_sample": 0
},
"maximum_performance_criteria": {
"followers": 0,
"avg_views": 0,
"engagement_rate": 1,
"post_rate": 1,
"creator_gmv_30_days": 0,
"gmv_per_sample": 0
},
"auto_approval_settings": {
"enabled": false,
"total_weekly_approved_sample_limit": 1,
"always_approve_status": "string",
"always_approve_from_lists_ids": [
0
]
},
"target_list": [
0
]
},
"schedule": {
"Monday_maxCreators": 0,
"Tuesday_maxCreators": 0,
"Wednesday_maxCreators": 0,
"Thursday_maxCreators": 0,
"Friday_maxCreators": 0,
"Saturday_maxCreators": 0,
"Sunday_maxCreators": 0,
"start_time": "string",
"end_time": "string",
"timezone": "string"
},
"creators_to_exclude": {
"list_upload": [
"string"
],
"lists_selected": [
"string"
],
"crm_groups": [
"string"
],
"exclude_previously_messaged": false
}
}
AutomationSampleRequestRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| automation_name | string | true | none | none |
| sample_request | SampleRequestPayload | true | none | Inner sample_request config — mirrors the legacysample_request_config shape exactly (the worker reads from it). |
| schedule | any | false | none | Optional — sample_request can run continuously. If set, the automation only auto-approves/rejects during scheduled hours. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | AutomationSchedule | false | none | Per-day creator-outreach caps + run window. Stored into Automations.schedule JSONB. Same shape as the existing portal payload — keeps the portal and Public API agreeing on schema. |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creators_to_exclude | CreatorsToExclude | false | none | Optional creator exclusion. Persists as config.excluded_creators (sibling of sample_request_config) using {excluded_lists_ids, excluded_crm_groups_ids, excluded_creator_ids} shape — matches reacher-web-react formDataTransformer.ts. |
AutomationSchedule
{
"Monday_maxCreators": 0,
"Tuesday_maxCreators": 0,
"Wednesday_maxCreators": 0,
"Thursday_maxCreators": 0,
"Friday_maxCreators": 0,
"Saturday_maxCreators": 0,
"Sunday_maxCreators": 0,
"start_time": "string",
"end_time": "string",
"timezone": "string"
}
AutomationSchedule
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| Monday_maxCreators | integer | false | none | none |
| Tuesday_maxCreators | integer | false | none | none |
| Wednesday_maxCreators | integer | false | none | none |
| Thursday_maxCreators | integer | false | none | none |
| Friday_maxCreators | integer | false | none | none |
| Saturday_maxCreators | integer | false | none | none |
| Sunday_maxCreators | integer | false | none | none |
| start_time | any | false | none | HH:MM 24-hour, in timezone. Hours 00-23, minutes 00-59. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_time | any | false | none | HH:MM 24-hour, in timezone. Hours 00-23, minutes 00-59. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| timezone | any | false | none | IANA timezone name, e.g. America/Los_Angeles |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
AutomationScheduleDetail
{
"daily_caps": {
"property1": 0,
"property2": 0
},
"start_time": "string",
"timezone": "string"
}
AutomationScheduleDetail
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| daily_caps | object | false | none | Per-weekday max-creators-per-day cap. Only days the automation runs are present; a day absent here means it doesn't send that day. Keys are weekday names (Monday…Sunday). |
| » additionalProperties | integer | false | none | none |
| start_time | any | false | none | Daily send-window start time, 24-hour HH:MM (config.SCHEDULE startTime). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| timezone | any | false | none | Business-hours timezone for the 9am–9pm send-window restriction (config.business_hours_timezone). Null when the restriction is OFF. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
AutomationSentMessagesResponse
{
"automation_id": 0,
"automation_name": "string",
"automation_type": "string",
"template": {
"automation_id": 0,
"automation_name": "string",
"automation_type": "string",
"tc_invite_message": "string",
"message_sequence": [
null
],
"follow_up_steps": [
null
],
"ai_custom_qa": [
null
],
"personalization": {
"enabled": false,
"tone": "string",
"fallback_message": "string",
"offer_discussion": "string",
"product_description": "string",
"product_selling_points": "string",
"word_counts": {
"property1": 0,
"property2": 0
},
"name_source": "string"
}
},
"dm_sent": {
"exact_copy": true,
"groups": [
{
"creator_name": "string",
"creator_id": "string",
"last_sent_at": "string",
"messages": [
{
"content": "string",
"sent_at": "string",
"status": "string"
}
]
}
],
"creators_returned": 0,
"total_creators": 0,
"total_messages": 0,
"message": "string"
},
"tc_sent": {
"exact_copy": false,
"coverage_note": "string",
"template_text": "string",
"placeholders_present": false,
"invitations": [
{
"sent_at": "string",
"status": "string",
"creator_count": 0,
"creators": [
"string"
],
"creators_truncated": false,
"expiration_date": "string"
}
],
"invitations_returned": 0,
"total_invitations": 0,
"total_creators_invited": 0,
"status_breakdown": {
"property1": 0,
"property2": 0
},
"campaign": {
"campaign_id": 0,
"campaign_name": "string"
},
"message": "string"
},
"message": "string"
}
AutomationSentMessagesResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| automation_id | integer | true | none | none |
| automation_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| automation_type | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| template | AutomationMessagesTemplateResponse | true | none | Message templates configured on one automation (CORE-5593). This is the configured copy — placeholders like {{creators username}}or {creator_name} are not substituted. For the exact per-creator textthat was actually sent, use GET /automations/{id}/sent-messages. |
| dm_sent | SentDmSection | true | none | none |
| tc_sent | SentTcSection | true | none | none |
| message | any | false | none | Explicit empty state when the automation has sent nothing at all |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
AutomationStatsMetrics
{
"total_creators_reached": 0,
"total_sample_requests": 0,
"total_creators": 0,
"total_emails_sent": 0,
"total_dm_messages_sent": 0,
"total_dm_response_count": 0,
"total_reply_rate": 0,
"total_email_open_count": 0,
"total_email_reply_count": 0,
"total_email_open_rate": 0,
"total_email_reply_rate": 0
}
AutomationStatsMetrics
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| total_creators_reached | integer | false | none | Total creators reached across all automations |
| total_sample_requests | integer | false | none | Total sample requests across all automations |
| total_creators | integer | false | none | Total creators across all automations |
| total_emails_sent | integer | false | none | Total emails sent across all email automations |
| total_dm_messages_sent | integer | false | none | 30-day DMs sent (denominator for total_reply_rate). |
| total_dm_response_count | integer | false | none | 30-day DM responses (from automation_metrics). |
| total_reply_rate | any | false | none | 30-day DM reply rate (%). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| total_email_open_count | integer | false | none | Total email opens. |
| total_email_reply_count | integer | false | none | Total email replies. |
| total_email_open_rate | any | false | none | Email open rate (%); null when no emails sent. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| total_email_reply_rate | any | false | none | Email reply rate (%); null when no emails sent. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
AutomationStatsResponse
{
"total_automations": 0,
"live_automations": 0,
"archived_automations": 0,
"email_automations": 0,
"regular_automations": 0,
"by_type": {
"property1": 0,
"property2": 0
},
"by_status": {
"property1": 0,
"property2": 0
},
"by_type_and_state": {
"property1": {
"property1": 0,
"property2": 0
},
"property2": {
"property1": 0,
"property2": 0
}
},
"metrics": {
"total_creators_reached": 0,
"total_sample_requests": 0,
"total_creators": 0,
"total_emails_sent": 0,
"total_dm_messages_sent": 0,
"total_dm_response_count": 0,
"total_reply_rate": 0,
"total_email_open_count": 0,
"total_email_reply_count": 0,
"total_email_open_rate": 0,
"total_email_reply_rate": 0
}
}
AutomationStatsResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| total_automations | integer | true | none | Total number of automations (regular + email) |
| live_automations | integer | true | none | Number of live (active) automations |
| archived_automations | integer | true | none | Number of archived automations |
| email_automations | integer | true | none | Number of email automations |
| regular_automations | integer | true | none | Number of regular (non-email) automations |
| by_type | object | true | none | Count of automations by type (includes 'Email' for email automations) |
| » additionalProperties | integer | false | none | none |
| by_status | object | true | none | Count of automations by status |
| » additionalProperties | integer | false | none | none |
| by_type_and_state | object | true | none | Count of automations by type and state (live/archived) |
| » additionalProperties | object | false | none | none |
| »» additionalProperties | integer | false | none | none |
| metrics | AutomationStatsMetrics | true | none | Aggregated metrics |
AutomationTargetCollabDetail
{
"invitation_name": "string",
"invitation_message": "string",
"valid_until": "string",
"content_type": "string",
"products": [
{
"product_id": "string",
"product_name": "string",
"commission_rate": 0,
"shop_min_commission": 0,
"shop_ads_commission_rate": 0
}
],
"offer_free_samples": true,
"auto_approve_samples": true,
"auto_resolve_conflicts": "string",
"support_contact_email": "string",
"support_contact_phone": "string",
"invite_start_before_days": "string",
"invite_expire_after_days": "string"
}
AutomationTargetCollabDetail
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| invitation_name | any | false | none | TC invitation name (config.BASE_INVITATION_NAME). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| invitation_message | any | false | none | The Target Collab card message shown to invited creators (config.TARGET_COLLAB_MESSAGE). Placeholders are NOT substituted. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| valid_until | any | false | none | TC card expiry date (config.VALID_UNTIL). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| content_type | any | false | none | Requested content type for the collaboration. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| products | [AutomationProductDetail] | false | none | [A product attached to a Target Collab / TC-cleanup automation. Commission rates are WHOLE-NUMBER PERCENTS (e.g. 20.0 == 20%), exactlyas stored on the automation and shown in the portal — not 0–1 decimals.] |
| offer_free_samples | any | false | none | Whether the collab offers free samples. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | boolean | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| auto_approve_samples | any | false | none | Whether incoming sample requests auto-approve. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | boolean | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| auto_resolve_conflicts | any | false | none | Conflicting-invite resolution policy shown on the portal's TC card (config.AUTO_RESOLVE_CONFLICTS). Either a named policy (e.g. MOVE_NOT_ACCEPTED) or the toggle state as "true" / "false". |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| support_contact_email | any | false | none | Brand support-contact email shown ON the TC invitation card the creator receives (customer-provided; config.EMAIL). Not a Reacher service address. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| support_contact_phone | any | false | none | Brand support-contact phone shown on the TC card (config.PHONE_NUMBER). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| invite_start_before_days | any | false | none | TC-cleanup: re-target invites started more than N days ago (empty = no bound). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| invite_expire_after_days | any | false | none | TC-cleanup: re-target invites expiring after N days (empty = no bound). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
AutomationTargetCollabRequest
{
"automation_name": "string",
"schedule": {
"Monday_maxCreators": 0,
"Tuesday_maxCreators": 0,
"Wednesday_maxCreators": 0,
"Thursday_maxCreators": 0,
"Friday_maxCreators": 0,
"Saturday_maxCreators": 0,
"Sunday_maxCreators": 0,
"start_time": "string",
"end_time": "string",
"timezone": "string"
},
"creators_to_include": {
"list_upload": [
"string"
],
"lists_selected": [
"string"
],
"filters": {
"product_categories": [
"string"
],
"follower_count": {
"min": 0,
"max": 0
},
"creator_ethnicity": [
"string"
],
"gender": [
"string"
],
"age_range": [
"string"
],
"languages": [
"string"
],
"community": [
"string"
],
"gmv": {
"min": 0,
"max": 0
},
"units_sold": {
"min": 0,
"max": 0
},
"average_views": {
"min": 0,
"max": 0
},
"engagement_rate": {
"min": 0,
"max": 0
},
"post_rate": {
"min": 0,
"max": 0
},
"video_gpm": {
"min": 0,
"max": 0
},
"live_gpm": {
"min": 0,
"max": 0
},
"follower_age": [
"string"
],
"follower_gender": [
"string"
],
"face_visibility": [
"string"
],
"content_style": [
"string"
],
"production_quality": [
"string"
],
"personality_tone": [
"string"
],
"body_type": [
"string"
],
"hair_type": [
"string"
]
},
"crm_group_id": "string",
"crm_group_entered_after": "2019-08-24",
"crm_group_entered_before": "2019-08-24"
},
"creators_to_exclude": {
"list_upload": [
"string"
],
"lists_selected": [
"string"
],
"crm_groups": [
"string"
],
"exclude_previously_messaged": false
},
"target_collab": {
"invitation_name": "string",
"valid_until": "2019-08-24",
"message": "string",
"products": [
{
"product_id": "string",
"commission_rate": 1,
"shop_min_commission": 1,
"shop_ads_commission_rate": 1
}
],
"content_type": "no_preference",
"sample_policy": {
"offer_free_samples": false,
"auto_approve": false,
"send_to": "brand_recipient"
},
"support_contact": {
"email": "string",
"phone": "string"
}
},
"messages": [
{
"type": "message",
"body": "string",
"image_url": "string",
"product_id": "string",
"submission_url_slug": "string"
}
],
"follow_ups": [
{
"delay_days": 30,
"addons": [
{
"type": "message",
"body": "string",
"image_url": "string",
"product_id": "string",
"submission_url_slug": "string"
}
]
}
],
"ai_enabled": false,
"end_date": "2019-08-24",
"auto_resolve_conflicts": "SKIP_ALL",
"is_evergreen": false,
"business_hours_timezone": "string"
}
AutomationTargetCollabRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| automation_name | string | true | none | none |
| schedule | AutomationSchedule | true | none | Per-day creator-outreach caps + run window. Stored into Automations.schedule JSONB. Same shape as the existing portal payload — keeps the portal and Public API agreeing on schema. |
| creators_to_include | CreatorsToInclude | false | none | Outreach-paradigm recipient inclusion. Three mutually-exclusive modes (cf. INTERNAL-design-review.md §11A): * lists mode — list_upload and/or lists_selected populated* filters mode — filters populated (dynamic by attribute)* crm_group mode — crm_group_id populated (saved predicate)The validator below rejects any request that mixes modes. The creator_source_type discriminator written to config is derivedfrom which mode is set — callers don't need to set it explicitly. |
| creators_to_exclude | CreatorsToExclude | false | none | Outreach-paradigm recipient exclusion. Mirrors creators_to_omit inthe legacy DB column / frontend payload, plus the boolean exclude_previously_messaged flag from the portal's Exclude Creators panel. |
| target_collab | TargetCollabConfig | true | none | TC-specific config — invitation metadata, commission rates, sample policy, content type, support contact. Maps to the legacy TC config blob shape (UPPERCASE root keys: BASE_INVITATION_NAME, VALID_UNTIL, TARGET_COLLAB_MESSAGE, EMAIL, PHONE_NUMBER, OFFER_FREE_SAMPLES, AUTO_APPROVE, PRODUCTS) — the worker reads from those, so the translator flattens this nested model accordingly. |
| messages | [MessageAddon] | false | none | Initial-outreach addons — text, images, product cards, etc. ALL items in this list are sent immediately together when the automation engages a creator. Use follow_ups for delayed follow-up steps. Empty messages = invite-only TC. |
| follow_ups | [FollowUpStep] | false | none | Delayed follow-up steps. Each step has delay_days after the prior step (or after the initial outreach for the first follow-up) and one or more addons that fire together. Use this to build a multi-touch sequence. |
| ai_enabled | boolean | false | none | none |
| end_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| auto_resolve_conflicts | string | false | none | How the runtime handles creators who already have a pending TC invite from another automation. SKIP_ALL leaves them untouched; MOVE_NOT_ACCEPTED (default — matches portal-created automations) re-targets creators whose prior invite was never accepted; MOVE_ALL re-targets regardless of prior invite state. Maps to config.AUTO_RESOLVE_CONFLICTS. |
| is_evergreen | boolean | false | none | When true, the automation continuously re-evaluates its creators_to_include.filters and queues newly-qualifying creators on each run. Has no effect for lists mode (lists are static) or crm_group mode (CRM groups are inherently evergreen). Maps to top-level Automations.is_evergreen column. |
| business_hours_timezone | any | false | none | When set, the runtime restricts outbound message delivery (initial outreach + follow-ups) to 9am–9pm in this IANA timezone (e.g. America/Los_Angeles). Null disables the restriction — messages can fire at any time within the schedule's daily window. The 9–9 window is fixed; only the timezone is configurable. Distinct from schedule.timezone, which governs when the automation evaluates its queue (per CORE-3031). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| auto_resolve_conflicts | SKIP_ALL |
| auto_resolve_conflicts | MOVE_NOT_ACCEPTED |
| auto_resolve_conflicts | MOVE_ALL |
AutomationTargetingDetail
{
"creator_source_type": "string",
"include_lists": [
"string"
],
"include_uploads": [
null
],
"crm_group_id": "string",
"exclude_lists": [
"string"
],
"exclude_crm_groups": [
null
],
"exclude_previously_messaged": true,
"filters": {},
"ai_search_filters": {}
}
AutomationTargetingDetail
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_source_type | any | false | none | Creator selection mode (config.creator_source_type): lists / filters / crmGroup. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| include_lists | [string] | false | none | Selected vault list IDs (creators_to_include.lists_selected). |
| include_uploads | [any] | false | none | Inline uploaded creator handles/entries (creators_to_include.list_upload). |
| crm_group_id | any | false | none | Selected CRM group id, when in crmGroup mode. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| exclude_lists | [string] | false | none | Excluded vault list IDs (creators_to_exclude.lists_selected). |
| exclude_crm_groups | [any] | false | none | Excluded CRM group ids (creators_to_exclude.crm_groups). |
| exclude_previously_messaged | any | false | none | Skip creators already messaged (config.exclude_previously_messaged). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | boolean | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| filters | any | false | none | Legacy attribute filters for dynamic selection (config.Filters). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | object | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| ai_search_filters | any | false | none | AI-search attribute filters, when the automation uses AI-only filters (config.ai_search_filters). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | object | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
AutomationTcCleanupRequest
{
"automation_name": "string",
"schedule": {
"Monday_maxCreators": 0,
"Tuesday_maxCreators": 0,
"Wednesday_maxCreators": 0,
"Thursday_maxCreators": 0,
"Friday_maxCreators": 0,
"Saturday_maxCreators": 0,
"Sunday_maxCreators": 0,
"start_time": "string",
"end_time": "string",
"timezone": "string"
},
"creators_to_include": {
"list_upload": [
"string"
],
"lists_selected": [
"string"
],
"filters": {
"product_categories": [
"string"
],
"follower_count": {
"min": 0,
"max": 0
},
"creator_ethnicity": [
"string"
],
"gender": [
"string"
],
"age_range": [
"string"
],
"languages": [
"string"
],
"community": [
"string"
],
"gmv": {
"min": 0,
"max": 0
},
"units_sold": {
"min": 0,
"max": 0
},
"average_views": {
"min": 0,
"max": 0
},
"engagement_rate": {
"min": 0,
"max": 0
},
"post_rate": {
"min": 0,
"max": 0
},
"video_gpm": {
"min": 0,
"max": 0
},
"live_gpm": {
"min": 0,
"max": 0
},
"follower_age": [
"string"
],
"follower_gender": [
"string"
],
"face_visibility": [
"string"
],
"content_style": [
"string"
],
"production_quality": [
"string"
],
"personality_tone": [
"string"
],
"body_type": [
"string"
],
"hair_type": [
"string"
]
},
"crm_group_id": "string",
"crm_group_entered_after": "2019-08-24",
"crm_group_entered_before": "2019-08-24"
},
"creators_to_exclude": {
"list_upload": [
"string"
],
"lists_selected": [
"string"
],
"crm_groups": [
"string"
],
"exclude_previously_messaged": false
},
"products": [
{
"product_id": "string",
"commission_rate": 1,
"shop_min_commission": 1,
"shop_ads_commission_rate": 1
}
],
"invite_start_before_days": 1,
"invite_expire_after_days": 1,
"end_date": "2019-08-24"
}
AutomationTcCleanupRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| automation_name | string | true | none | none |
| schedule | AutomationSchedule | true | none | Per-day creator-outreach caps + run window. Stored into Automations.schedule JSONB. Same shape as the existing portal payload — keeps the portal and Public API agreeing on schema. |
| creators_to_include | CreatorsToInclude | false | none | Outreach-paradigm recipient inclusion. Three mutually-exclusive modes (cf. INTERNAL-design-review.md §11A): * lists mode — list_upload and/or lists_selected populated* filters mode — filters populated (dynamic by attribute)* crm_group mode — crm_group_id populated (saved predicate)The validator below rejects any request that mixes modes. The creator_source_type discriminator written to config is derivedfrom which mode is set — callers don't need to set it explicitly. |
| creators_to_exclude | CreatorsToExclude | false | none | Outreach-paradigm recipient exclusion. Mirrors creators_to_omit inthe legacy DB column / frontend payload, plus the boolean exclude_previously_messaged flag from the portal's Exclude Creators panel. |
| products | [TargetCollabProduct] | true | none | Products to re-invite the matching creators for. Cleanup uses the same TargetCollabProduct shape (product_id + commission rates) as a regular TC. Required — runtime needs at least one product to issue the re-invite. |
| invite_start_before_days | any | false | none | Re-target only creators whose original TC invite was sent at least N days ago. Null = no lower bound on invite age. Persists as config.INVITE_START_BEFORE_DAYS. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| invite_expire_after_days | any | false | none | Re-target only creators whose original TC invite expires within the next N days. Null = no upper bound on time-to-expiry. Persists as config.INVITE_EXPIRE_AFTER_DAYS. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
AutomationTemplate
{
"id": "string",
"title": "string",
"description": "string"
}
AutomationTemplate
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| id | string | true | none | Unique template identifier |
| title | string | true | none | Template title |
| description | string | true | none | Template description |
AutomationUpdateRequest
{
"automation_name": "string",
"schedule": {
"Monday_maxCreators": 0,
"Tuesday_maxCreators": 0,
"Wednesday_maxCreators": 0,
"Thursday_maxCreators": 0,
"Friday_maxCreators": 0,
"Saturday_maxCreators": 0,
"Sunday_maxCreators": 0,
"start_time": "string",
"end_time": "string",
"timezone": "string"
},
"creators_to_include": {
"list_upload": [
"string"
],
"lists_selected": [
"string"
],
"filters": {
"product_categories": [
"string"
],
"follower_count": {
"min": 0,
"max": 0
},
"creator_ethnicity": [
"string"
],
"gender": [
"string"
],
"age_range": [
"string"
],
"languages": [
"string"
],
"community": [
"string"
],
"gmv": {
"min": 0,
"max": 0
},
"units_sold": {
"min": 0,
"max": 0
},
"average_views": {
"min": 0,
"max": 0
},
"engagement_rate": {
"min": 0,
"max": 0
},
"post_rate": {
"min": 0,
"max": 0
},
"video_gpm": {
"min": 0,
"max": 0
},
"live_gpm": {
"min": 0,
"max": 0
},
"follower_age": [
"string"
],
"follower_gender": [
"string"
],
"face_visibility": [
"string"
],
"content_style": [
"string"
],
"production_quality": [
"string"
],
"personality_tone": [
"string"
],
"body_type": [
"string"
],
"hair_type": [
"string"
]
},
"crm_group_id": "string",
"crm_group_entered_after": "2019-08-24",
"crm_group_entered_before": "2019-08-24"
},
"creators_to_exclude": {
"list_upload": [
"string"
],
"lists_selected": [
"string"
],
"crm_groups": [
"string"
],
"exclude_previously_messaged": false
},
"messages": [
{
"type": "message",
"body": "string",
"image_url": "string",
"product_id": "string",
"submission_url_slug": "string"
}
],
"follow_ups": [
{
"delay_days": 30,
"addons": [
{
"type": "message",
"body": "string",
"image_url": "string",
"product_id": "string",
"submission_url_slug": "string"
}
]
}
],
"target_collab": {
"invitation_name": "string",
"valid_until": "2019-08-24",
"message": "string",
"products": [
{
"product_id": "string",
"commission_rate": 1,
"shop_min_commission": 1,
"shop_ads_commission_rate": 1
}
],
"content_type": "no_preference",
"sample_policy": {
"offer_free_samples": true,
"auto_approve": true,
"send_to": "brand_recipient"
},
"support_contact": {
"email": "string",
"phone": "string"
},
"lock_receivers_profiles": true
},
"dm_config": {
"spark_code": {
"only_collect_creator_information": false,
"spark_code_submission_url": "string"
}
},
"sample_request": {
"action": "approve",
"rejection_reason": "NOT_MATCH",
"approval_message": "string",
"rejection_message": "string",
"message_images": [
"string"
],
"products": {
"include_all_products": false,
"selected_products": [
{
"product_id": "string",
"max_approvals_per_week": 10000
}
],
"weekly_auto_approval_per_product": 1
},
"minimum_performance_criteria": {
"followers": 0,
"avg_views": 0,
"engagement_rate": 1,
"post_rate": 1,
"creator_gmv_30_days": 0,
"gmv_per_sample": 0
},
"maximum_performance_criteria": {
"followers": 0,
"avg_views": 0,
"engagement_rate": 1,
"post_rate": 1,
"creator_gmv_30_days": 0,
"gmv_per_sample": 0
},
"auto_approval_settings": {
"enabled": false,
"total_weekly_approved_sample_limit": 1,
"always_approve_status": "string",
"always_approve_from_lists_ids": [
0
]
},
"target_list": [
0
]
},
"ai_enabled": true,
"is_evergreen": true,
"end_date": "2019-08-24",
"business_hours_timezone": "string",
"email_sent_per_day": 1,
"subject": "string",
"body": "string"
}
AutomationUpdateRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| automation_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| schedule | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | AutomationSchedule | false | none | Per-day creator-outreach caps + run window. Stored into Automations.schedule JSONB. Same shape as the existing portal payload — keeps the portal and Public API agreeing on schema. |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creators_to_include | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | CreatorsToInclude | false | none | Outreach-paradigm recipient inclusion. Three mutually-exclusive modes (cf. INTERNAL-design-review.md §11A): * lists mode — list_upload and/or lists_selected populated* filters mode — filters populated (dynamic by attribute)* crm_group mode — crm_group_id populated (saved predicate)The validator below rejects any request that mixes modes. The creator_source_type discriminator written to config is derivedfrom which mode is set — callers don't need to set it explicitly. |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creators_to_exclude | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | CreatorsToExclude | false | none | Outreach-paradigm recipient exclusion. Mirrors creators_to_omit inthe legacy DB column / frontend payload, plus the boolean exclude_previously_messaged flag from the portal's Exclude Creators panel. |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| messages | any | false | none | Replace the initial-outreach addon set. ALL items are sent immediately together when the automation engages a creator. Pass [] to clear messages (invite-only). Use follow_ups for delayed sequencing. Only valid for target_collab and dm automations. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [MessageAddon] | false | none | [One element of a messages[].addons array — a single content blockinside a follow-up step. Polymorphic by type.Per PR #1513 round-3 review (coderabbitai): each type has requiredfields validated below. Without this, {"type": "image"} (noimage_url) slipped through and was persisted to the config blob, leaving the runtime with an addon that advertised a type but had no payload to render.] |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| follow_ups | any | false | none | Replace the delayed follow-up sequence. Pass [] to clear. Only valid for target_collab and dm automations. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [FollowUpStep] | false | none | [One delayed follow-up after the initial outreach. Each step has a delay (days after the prior step / initial outreach for the first follow-up) and one or more addons that run together when the step fires. Per architecture review 2026-05-01 the API was refactored from a single messages: List[MessageStep] array (with step discriminator)into TWO arrays: messages for initial outreach, follow_ups fordelayed steps. Mirrors the runtime config shape ( config.addons[]vs config.FOLLOW_UP_STEPS[]) — the previous translator wasflattening follow-up addons into config.addons[] where theruntime never reads them, silently dropping follow-up sends.] |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| target_collab | any | false | none | Partial update for the TC-specific config. Send only the keys you want to change — supported sub-keys mirror TargetCollabConfig: invitation_name, valid_until, message, products, content_type, sample_policy, support_contact, lock_receivers_profiles. Unknown keys are rejected with 422 (extra='forbid'). The translator merges into the existing config blob and dual-writes to the legacy UPPERCASE root. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | TargetCollabPatchPayload | false | none | All-Optional companion to TargetCollabConfig for PATCH bodies.extra="forbid" rejects typos so a PATCH like {invitatoin_name:<br>"..."} returns 422 instead of silently no-op'ing. |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| dm_config | any | false | none | Partial update for the DM-specific config. Currently supports spark_code only (other dm_config keys were removed 2026-05-01). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | DmConfigPatchPayload | false | none | All-Optional companion to DmConfig for PATCH bodies. |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sample_request | any | false | none | Partial update for the sample-request config. Send only the keys you want to change — supported sub-keys mirror SampleRequestPayload: action, rejection_reason, approval_message, rejection_message, message_images, products, minimum_performance_criteria, maximum_performance_criteria, auto_approval_settings, target_list. Unknown keys (top-level OR nested) are rejected with 422 (extra='forbid'). The translator routes both criteria blocks through the V2 prefix + percent-scale helper. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | SampleRequestPatchPayload | false | none | All-Optional companion to SampleRequestPayload for PATCH bodies.Reuses the create-time nested types ( SampleRequestProducts,SampleRequestPerformanceCriteria, SampleRequestAutoApprovalSettings)which already have extra="forbid". |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| ai_enabled | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | boolean | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| is_evergreen | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | boolean | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| business_hours_timezone | any | false | none | Set or change the 9am–9pm send-window timezone (CORE-3031). Pass an IANA name to enable, or the empty string "" to disable. Only valid for target_collab and dm automations. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| email_sent_per_day | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| subject | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| body | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
AutomationUpdateRequestPublic
{
"name": "string",
"trigger_frequency": "daily",
"campaign_ids": [
"string"
],
"conditions": [
{
"metric": "creative_roi",
"operator": "lt",
"value": 0,
"lookback_days": 3
}
],
"actions": [
{
"action_type": "set_up_creative_boost",
"params": {}
}
],
"guardrails": [
{
"rule_type": "total_creative_boost_cost",
"operator": "lt",
"value": 0
}
],
"boost_start_date": "2019-08-24",
"boost_end_date": "2019-08-24"
}
AutomationUpdateRequestPublic
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| trigger_frequency | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | TriggerFrequency | false | none | How often the automation evaluates its conditions. Only daily is honoured by the offline execution engine today; theportal FE submits this value exclusively. |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| campaign_ids | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| conditions | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [ConditionRulePublic] | false | none | [One condition row in an automation's trigger logic.] |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| actions | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [ActionRulePublic] | false | none | [One side-effect the automation performs when its conditions fire.] |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| guardrails | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [GuardrailRulePublic] | false | none | [A safety cap that prevents the automation from spending past a limit.] |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| boost_start_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| boost_end_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
AutomationWriteResponseV2
{
"data": {
"automation_id": 0,
"shop_id": 0,
"automation_name": "string",
"automation_type": "string",
"automation_status": "string",
"state": "string",
"config": {},
"schedule": {},
"creators_to_include": {},
"creators_to_exclude": {},
"crm_group_id": "string",
"ai_enabled": false,
"end_date": "string",
"created_at": "string",
"updated_at": "string",
"created_via": "string",
"side_effects": {}
},
"dry_run": false,
"side_effects": {}
}
AutomationWriteResponseV2
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | AutomationResourceV2 | true | none | Canonical write-endpoint response. Replaces the v1 AutomationResource (which mirrored the legacy single-shape body). Now reflects the four-type taxonomy — automation_type is the public-API type, not theDB string. The DB string is in _internal_type for debugging only. |
| dry_run | boolean | false | none | none |
| side_effects | any | false | none | Backend side-effects, e.g. {'crm_group_created': 'uuid-...'} for sample_request creates. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | object | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
AutomationsListAggregate
{
"creators_reached": 0,
"tc_invites": 0,
"tc_invites_creator_count": 0,
"creators_messaged": 0,
"emails_sent": 0,
"sample_request": 0,
"sample_approved": 0,
"videos_posted": 0,
"videos_converted": 0,
"spark_codes": 0,
"added_showcase_affiliates": 0,
"accepted_tc_count": 0,
"tc_showcase_creator_count": 0,
"tc_content_creator_count": 0,
"tc_acceptance_rate": 0,
"coverage_through": "string"
}
AutomationsListAggregate
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creators_reached | any | false | none | Shop-wide distinct creators reached, summed across daily rollups in the window. Matches the portal's 'Creators Reached' column. NOT a global distinct count — a creator reached on multiple days is counted on each. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| tc_invites | any | false | none | Shop-wide count of Target Collab invitations sent, summed across daily rollups in the window. Matches the portal's 'Target Collabs' column. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| tc_invites_creator_count | any | false | none | Shop-wide distinct creators in Target Collab creator-list arrays, computed per day and summed across the window. Matches the portal dashboard's 'Total Creators' sub-label under Target Collabs — this is the field that customers comparing API to UI most commonly expect. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creators_messaged | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| emails_sent | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sample_request | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sample_approved | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| videos_posted | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| videos_converted | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| spark_codes | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| added_showcase_affiliates | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| accepted_tc_count | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| tc_showcase_creator_count | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| tc_content_creator_count | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| tc_acceptance_rate | any | false | none | Average TC acceptance rate across the daily rollups in the window (mean of daily rates, not creator-weighted). Mirrors the portal dashboard's computation. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| coverage_through | any | false | none | Last date (YYYY-MM-DD) actually present in the rollup within the window. The rollup refreshes ~every 6h and excludes the current day, so when this is earlier than the requested end_date the totals above under-count (or read 0) for the days after it and lag the live per-row values. Compare it to your end_date before trusting the totals; None means no rollup day was available in the window. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
AutomationsListPaginatedResponse
{
"data": [
{
"automation_id": 0,
"automation_name": "string",
"automation_type": "string",
"is_evergreen": false,
"status": "string",
"status_message": "string",
"gmv": 0,
"sample_requests": 0,
"accepted_requests": 0,
"videos_posted": 0,
"videos_converted": 0,
"creators_reached": 0,
"target_collab_cleanup_creators_reached": 0,
"dm_response_count": 0,
"reply_rate": 0,
"skipped": 0,
"total_creators": 0,
"creators_remaining": 0,
"created_at": "string",
"completed_at": "string",
"created_via": "string"
}
],
"currency": "string",
"pagination": null,
"date_range": {
"start_date": "string",
"end_date": "string"
},
"shops_queried": [
"string"
],
"aggregate": {
"creators_reached": 0,
"tc_invites": 0,
"tc_invites_creator_count": 0,
"creators_messaged": 0,
"emails_sent": 0,
"sample_request": 0,
"sample_approved": 0,
"videos_posted": 0,
"videos_converted": 0,
"spark_codes": 0,
"added_showcase_affiliates": 0,
"accepted_tc_count": 0,
"tc_showcase_creator_count": 0,
"tc_content_creator_count": 0,
"tc_acceptance_rate": 0,
"coverage_through": "string"
},
"excluded": {}
}
AutomationsListPaginatedResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | [AutomationListItem] | true | none | none |
| currency | string | true | none | none |
| pagination | any | true | none | none |
| date_range | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | DateRange | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shops_queried | any | false | none | Shop names included when querying multiple shops (x-shop-id: all or comma-separated). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| aggregate | any | false | none | Shop-wide windowed metric totals — populated only when a date filter is supplied. These are NOT sums of the per-row fields above; they come from the same agency rollup the portal Outreach Metrics dashboard reads. Use this object when you want numbers that match the portal UI exactly. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | AutomationsListAggregate | false | none | Shop-wide windowed metric totals matching the portal's Outreach Metrics dashboard. Sourced from analytics.agency_dashboard_table(a daily pre-aggregated rollup) and SUMmed across the daily rows inside the requested window — same computation the portal UI does. SHOP-WIDE — NOT per-automation. Counted DISTINCT per day, then summed across days; a creator reached on Tue AND Wed counts twice. Populated only when start_date and/or end_date is suppliedon the request (the aggregate is window-scoped by design). Noneon unfiltered calls. IMPORTANT — this rollup LAGS: it refreshes ~every 6h and excludes the current day, so a fresh/just-elapsed day may have no row yet. Read coverage_through (the last day actually covered): when it is earlierthan your end_date these totals under-count — or read 0 for a singlefresh day — and will NOT equal the sum of the per-row creators_reached.Use the per-row values when you need exactness for recent days. Mapping to the portal's "Outreach Metrics" card columns: - creators_reached → "Creators Reached"- tc_invites → "Target Collabs"- tc_invites_creator_count → "Total Creators" sub-labelunder Target Collabs |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| excluded | any | false | none | Present only when this endpoint hides automations that exist for the shop, so 'none shown' can be told apart from 'none exist'. pagination.total_count counts only rows THIS endpoint returns (live, non-email). Keys: archived (count hidden unless show_archived=true); email (count of email automations — a separate table managed via POST /automations/email, no list read path yet); and a note. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | object | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
AutomationsListRequest
{
"page": 1,
"page_size": 50,
"sort_by": "gmv",
"sort_dir": "asc",
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"automation_type": "string",
"status": "string",
"show_archived": false,
"created_via": [
"string"
],
"exclude_created_via": [
"string"
]
}
AutomationsListRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| page | integer | false | none | none |
| page_size | integer | false | none | none |
| sort_by | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sort_dir | string | false | none | none |
| start_date | any | false | none | Inclusive window start (YYYY-MM-DD). Scopes ACTIVITY, not creation: when supplied (alone or with end_date) the row set is restricted to automations that sent outreach in the window (an initial DM or a Target Collab invite dated inside it), so a long-running automation created earlier still appears with its in-window throughput. creators_reached / skipped / total_creators likewise switch from LIFETIME materialized-view values to in-window DISTINCT counts against the raw event tables. created_at is used only for sorting. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_date | any | false | none | Inclusive window end (YYYY-MM-DD). When supplied (alone or with start_date), see start_date for the activity-window and creator-metric semantics. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| automation_type | any | false | none | Filter by the raw Automation.automation_type value, matched EXACTLY (case-sensitive). These values are historical/unnormalized — known examples: Target Collab, TC Cleanup, New Sample Request Processing. Unknown values (including the lowercase target_collab / tc_cleanup forms) match nothing. Email also returns nothing — email automations live in a separate table with no list read path yet; see the excluded block and POST /automations/email. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| status | any | false | none | Filter by status. Accepts either the display status (Completed |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| show_archived | boolean | false | none | Include archived automations (state=archived). Default false mirrors the portal; the excluded block reports how many archived rows are hidden while this is false. |
| created_via | any | false | none | Include only automations created by these surfaces. Common values: portal |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| exclude_created_via | any | false | none | Exclude automations created by these surfaces. Applied after created_via. Example: ["api_direct"] hides the API direct invite — {handle} rows produced by POST /public/v1/target-collabs so the list shows only your managed automations. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | gmv |
| anonymous | created_at |
| anonymous | completed_at |
| anonymous | creators_reached |
| anonymous | dm_response_count |
| sort_dir | asc |
| sort_dir | desc |
BatchProgress
{
"batch_id": "4da22c97-b7d5-4e31-8c3a-03870ebc7b20",
"status": "queued",
"total_count": 0,
"sent_count": 0,
"failed_count": 0,
"envelopes": [
{
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"batch_id": "4da22c97-b7d5-4e31-8c3a-03870ebc7b20",
"campaign_id": 0,
"campaign_name": "string",
"creator_id": 0,
"creator_name": "string",
"creator_handle": "string",
"contract_title": "string",
"template_source": "standard",
"terms": {
"campaign_type": "retainer",
"brand_name": "string",
"brand_representative_name": "string",
"deliverables": 1,
"posting_platform": "TikTok",
"posting_requirements": "",
"posting_start_date": "2019-08-24",
"effective_date": "2019-08-24",
"expiry_date": "2019-08-24",
"products": [
{
"product_id": "string",
"product_name": "string"
}
],
"all_products": false,
"require_video_link_email": false,
"video_link_email": "string",
"commission_pct": 100,
"expenses_reimbursable": false,
"revision_rounds": 0,
"include_usage_rights": true,
"usage_rights_months": 3,
"usage_rights_duration_days": 90,
"usage_rights_scope": "organic_only",
"usage_exclusivity_enabled": false,
"usage_exclusivity_months": 3,
"agreement_clause": "string",
"termination_notice_days": 30,
"governing_law_jurisdiction": "New York",
"reward": {
"kind": "retainer",
"mode": "fixed",
"payment_per_post": 0,
"tiers": [
{
"name": "string",
"retainer": 0,
"gmv_threshold": 0
}
],
"gmv_bonus_tiers": [
{
"gmv_threshold": 0,
"bonus_amount": 0
}
],
"recurring": false,
"payment_schedule": "one_time",
"payment_due_days": 30,
"minimum_gmv_floor": 0
}
},
"status": "draft",
"brand_signed_at": "2019-08-24T14:15:22Z",
"creator_signed_at": "2019-08-24T14:15:22Z",
"effective_date": "2019-08-24",
"expiry_date": "2019-08-24",
"last_error": "string"
}
],
"failures": [
{
"creator_id": 0,
"error_code": "string",
"error_message": "string"
}
]
}
BatchProgress
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| batch_id | string(uuid) | true | none | none |
| status | string | true | none | none |
| total_count | integer | true | none | none |
| sent_count | integer | true | none | none |
| failed_count | integer | true | none | none |
| envelopes | [ContractEnvelopeOut] | false | none | [Always includes terms so the FE can render the preview without a second round-trip.] |
| failures | [FailureItem] | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| status | queued |
| status | sending |
| status | completed |
| status | partial_failure |
| status | failed |
Benefit
{
"term": "string",
"detail": "string"
}
Benefit
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| term | string | true | none | none |
| detail | string | true | none | none |
BingoGoalTemplate
"total_gmv"
BingoGoalTemplate
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| BingoGoalTemplate | string | false | none | The goals a card square can carry. Every one resolves to a metric already tracked, so a square is verifiable without anyone ticking it by hand. |
Enumerated Values
| Property | Value |
|---|---|
| BingoGoalTemplate | total_gmv |
| BingoGoalTemplate | single_video_gmv |
| BingoGoalTemplate | videos_each_gmv |
| BingoGoalTemplate | total_views |
| BingoGoalTemplate | single_video_views |
| BingoGoalTemplate | videos_each_views |
| BingoGoalTemplate | total_likes |
| BingoGoalTemplate | single_video_likes |
| BingoGoalTemplate | videos_each_likes |
| BingoGoalTemplate | video_count |
| BingoGoalTemplate | posting_streak |
| BingoGoalTemplate | live_count |
| BingoGoalTemplate | live_gmv |
| BingoGoalTemplate | use_hashtag |
| BingoGoalTemplate | feature_product |
BingoPricing
{
"campaign_type": "bingo",
"reward_type": "cash",
"metric_type": "gmv",
"bingo_grid_size": 3,
"bingo_line_length": 3,
"bingo_squares": [
{
"template": "total_gmv",
"x": "0",
"y": "0"
}
],
"bingo_line_reward": 0,
"bingo_payout_rule": "single",
"bingo_max_lines": 1
}
BingoPricing
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| campaign_type | string | false | none | none |
| reward_type | string | false | none | none |
| metric_type | string | false | none | none |
| bingo_grid_size | integer | false | none | none |
| bingo_line_length | integer | false | none | none |
| bingo_squares | [BingoSquare] | true | none | [One goal on the card.extra="forbid": the card round-trips through JSONB and back into aper-creator rewards snapshot, so an unknown key must not smuggle through.] |
| bingo_line_reward | any | true | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| bingo_payout_rule | string | false | none | none |
| bingo_max_lines | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| bingo_grid_size | 3 |
| bingo_grid_size | 4 |
| bingo_line_length | 3 |
| bingo_line_length | 4 |
| bingo_payout_rule | single |
| bingo_payout_rule | per_line |
| bingo_payout_rule | per_line_capped |
BingoSquare
{
"template": "total_gmv",
"x": "0",
"y": "0"
}
BingoSquare
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| template | BingoGoalTemplate | true | none | The goals a card square can carry. Every one resolves to a metric already tracked, so a square is verifiable without anyone ticking it by hand. |
| x | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| y | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
BlacklistAddRequest
{
"creators": [
"@somecreator",
"another.creator"
]
}
BlacklistAddRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creators | [string] | true | none | Creator handles. A leading @ and surrounding whitespace are stripped and the handle is lowercased before storage. URLs are rejected. Duplicates within the request and handles already on the list are skipped, not errors. |
BlacklistAddResponse
{
"added_count": 0,
"duplicates_skipped": 0,
"invalid_skipped": 0,
"invalid_creators": [
"string"
],
"message": "string"
}
BlacklistAddResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| added_count | integer | true | none | Handles newly blacklisted. |
| duplicates_skipped | integer | true | none | Handles already on the list, left untouched. |
| invalid_skipped | integer | true | none | Handles rejected as malformed (URLs, blanks). |
| invalid_creators | [string] | false | none | The rejected handles, as submitted. |
| message | string | true | none | Human-readable summary of the outcome. |
BlacklistClearResponse
{
"removed_count": 0
}
BlacklistClearResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| removed_count | integer | true | none | Rows deleted from the list. |
BlacklistListResponse
{
"creators": [
{
"id": 0,
"creator": "string",
"added_at": "string"
}
],
"total_count": 0
}
BlacklistListResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creators | [BlacklistedCreator] | true | none | Blacklisted handles, most recently added first. |
| total_count | integer | true | none | Number of blacklisted handles. |
BlacklistRemoveResponse
{
"removed_count": 0,
"creator": "string"
}
BlacklistRemoveResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| removed_count | integer | true | none | Rows deleted from the list. |
| creator | string | true | none | Normalized handle that was removed. |
BlacklistedCreator
{
"id": 0,
"creator": "string",
"added_at": "string"
}
BlacklistedCreator
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| id | integer | true | none | Row ID, stable for this shop. |
| creator | string | true | none | Normalized creator handle. |
| added_at | any | false | none | ISO-8601 timestamp the handle was blacklisted. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
BrandProfile
{
"website_url": "string",
"brand_name": "string",
"voice_descriptors": [
"string"
],
"target_audience": "string",
"extracted_categories": [
"string"
],
"extraction_model": "string",
"extracted_at": "2019-08-24T14:15:22Z",
"source": "string"
}
BrandProfile
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| website_url | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| brand_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| voice_descriptors | [string] | false | none | none |
| target_audience | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| extracted_categories | [string] | false | none | none |
| extraction_model | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| extracted_at | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date-time) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| source | any | false | none | analyzed (freshly extracted) or cache (already had one). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
BrandProfileWriteResponse
{
"data": {
"website_url": "string",
"brand_name": "string",
"voice_descriptors": [
"string"
],
"target_audience": "string",
"extracted_categories": [
"string"
],
"extraction_model": "string",
"extracted_at": "2019-08-24T14:15:22Z",
"source": "string"
},
"dry_run": false
}
BrandProfileWriteResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | BrandProfile | true | none | The analysed brand profile stored for the shop. |
| dry_run | boolean | false | none | none |
BrandVoiceResponse
{
"shop_id": 0,
"voice_descriptors": [
"string"
],
"brand_voice": ""
}
BrandVoiceResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | integer | true | none | none |
| voice_descriptors | [string] | false | none | none |
| brand_voice | string | false | none | none |
BrandVoiceWriteResponse
{
"data": {
"shop_id": 0,
"voice_descriptors": [
"string"
],
"brand_voice": ""
},
"dry_run": false
}
BrandVoiceWriteResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | BrandVoiceResponse | true | none | none |
| dry_run | boolean | false | none | none |
BriefContent
{
"kicker": "",
"signatureHooks": [
"string"
],
"winningHooks": [
{
"text": "string",
"lead": true
}
],
"socialProof": [
"string"
],
"benefits": [
{
"term": "string",
"detail": "string"
}
],
"contentIdeas": [
{
"title": "string",
"detail": "string"
}
],
"shopTagline": ""
}
BriefContent
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| kicker | string | false | none | none |
| signatureHooks | [string] | false | none | none |
| winningHooks | [WinningHook] | false | none | none |
| socialProof | [string] | false | none | none |
| benefits | [Benefit] | false | none | none |
| contentIdeas | [ContentIdea] | false | none | none |
| shopTagline | string | false | none | none |
BriefListPagination
{
"total_count": 0,
"page": 0,
"page_size": 0,
"total_pages": 0
}
BriefListPagination
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| total_count | integer | true | none | none |
| page | integer | true | none | none |
| page_size | integer | true | none | none |
| total_pages | integer | true | none | none |
BriefListResponse
{
"briefs": [
{
"id": 0,
"shop_id": 0,
"product_ids": [
null
],
"template_id": "string",
"accent_color": "string",
"main_header_background": "string",
"name": "string",
"content": {
"kicker": "",
"signatureHooks": [
"string"
],
"winningHooks": [
{
"text": "string",
"lead": true
}
],
"socialProof": [
"string"
],
"benefits": [
{
"term": "string",
"detail": "string"
}
],
"contentIdeas": [
{
"title": "string",
"detail": "string"
}
],
"shopTagline": ""
},
"image_overrides": {},
"status": "string",
"created_by_email": "string",
"created_at": "string",
"updated_at": "string",
"products": [
{
"id": "string",
"name": "",
"brand": "",
"price": "",
"image": ""
}
]
}
],
"pagination": {
"total_count": 0,
"page": 0,
"page_size": 0,
"total_pages": 0
}
}
BriefListResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| briefs | [BriefResponse] | true | none | none |
| pagination | BriefListPagination | true | none | none |
BriefProductSummary
{
"id": "string",
"name": "",
"brand": "",
"price": "",
"image": ""
}
BriefProductSummary
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| id | string | true | none | none |
| name | string | false | none | none |
| brand | string | false | none | none |
| price | string | false | none | none |
| image | string | false | none | none |
BriefResponse
{
"id": 0,
"shop_id": 0,
"product_ids": [
null
],
"template_id": "string",
"accent_color": "string",
"main_header_background": "string",
"name": "string",
"content": {
"kicker": "",
"signatureHooks": [
"string"
],
"winningHooks": [
{
"text": "string",
"lead": true
}
],
"socialProof": [
"string"
],
"benefits": [
{
"term": "string",
"detail": "string"
}
],
"contentIdeas": [
{
"title": "string",
"detail": "string"
}
],
"shopTagline": ""
},
"image_overrides": {},
"status": "string",
"created_by_email": "string",
"created_at": "string",
"updated_at": "string",
"products": [
{
"id": "string",
"name": "",
"brand": "",
"price": "",
"image": ""
}
]
}
BriefResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| id | integer | true | none | none |
| shop_id | integer | true | none | none |
| product_ids | [any] | true | none | none |
| template_id | string | true | none | none |
| accent_color | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| main_header_background | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| content | BriefContent | true | none | none |
| image_overrides | object | true | none | none |
| status | string | true | none | none |
| created_by_email | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| created_at | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| updated_at | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| products | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [BriefProductSummary] | false | none | [Compact catalog identity for the index-card poster thumbnails. Deliberately NOT a ProductRef: no per-product insight reads(description/topHooks/brandVoice are generation context the cards never render), so a list page resolves in one batched catalog query (CORE-6712).] |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
BulkExcludeVideosRequest
{
"video_ids": [
"string"
],
"reasons": [
"guidelines"
],
"note": "",
"scope": "campaign",
"source_file": "string"
}
BulkExcludeVideosRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video_ids | [string] | true | none | none |
| reasons | [ExclusionReason] | true | none | [Why a brand excluded a video. Shown to the creator, so every code has copy.] |
| note | string | false | none | none |
| scope | ExclusionScope | false | none | How far an uploaded file reaches.campaign is the default: the button lives on one campaign's Content taband acting only there is what a brand expects. shop is the opt-in thatalso excludes the video from every other campaign it appears in, which is the whole point of the upload but is far more destructive, so it is never implied. |
| source_file | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
BulkExclusionPreviewRequest
{
"video_ids": [
"string"
],
"scope": "campaign"
}
BulkExclusionPreviewRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video_ids | [string] | true | none | none |
| scope | ExclusionScope | false | none | How far an uploaded file reaches.campaign is the default: the button lives on one campaign's Content taband acting only there is what a brand expects. shop is the opt-in thatalso excludes the video from every other campaign it appears in, which is the whole point of the upload but is far more destructive, so it is never implied. |
BuyersRankingEntry
{
"rank": 0,
"ranking_type": "string",
"entity_id": "string",
"entity_name": "string",
"creator_name": "string",
"new_customers": 0,
"customer_contribution": 0,
"period_months": 0,
"customer_type": 0
}
BuyersRankingEntry
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| rank | integer | true | none | none |
| ranking_type | string | true | none | product or video. |
| entity_id | string | true | none | Product id or video id, per ranking_type. |
| entity_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_name | any | false | none | Public TikTok handle, on video rankings. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| new_customers | integer | true | none | Buyers whose first purchase from this shop came through this entity. |
| customer_contribution | any | false | none | This entity's share of the shop's new customers (0-1). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| period_months | any | false | none | Trailing window TikTok ranked over (typically 12 months). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| customer_type | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
BuyersRankingResponse
{
"shop_id": 0,
"data": [
{
"rank": 0,
"ranking_type": "string",
"entity_id": "string",
"entity_name": "string",
"creator_name": "string",
"new_customers": 0,
"customer_contribution": 0,
"period_months": 0,
"customer_type": 0
}
]
}
BuyersRankingResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | integer | true | none | none |
| data | [BuyersRankingEntry] | true | none | none |
CampaignArchivedResponse
{
"campaign_id": 0,
"status": "archived"
}
CampaignArchivedResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| campaign_id | integer | true | none | none |
| status | string | false | none | none |
CampaignCreateRequest
{
"campaign_name": "string",
"campaign_type": "retainer",
"creator_source": "my_community",
"start_date": "string",
"end_date": "string",
"description": "string",
"status": "published",
"pricing": {
"campaign_type": "retainer",
"posts": 1,
"payment_per_creator": 0,
"reward_type": "cash",
"metric_type": "gmv",
"minimum_gmv_required": 0,
"minimum_gmv_required_enabled": false,
"minimum_views_required": 0,
"minimum_views_required_enabled": false,
"minimum_videos_required": 0
},
"products": {
"all_selected": false,
"items": [
{
"product_id": "string",
"tap_link": "string",
"product_name": "string"
}
],
"use_first_product_image": true,
"custom_image": "string",
"campaign_image": "string"
},
"creators": [
{
"property1": "string",
"property2": "string"
}
],
"window_url": "string",
"is_available_to_all": false,
"requires_approval": false,
"exclusive_participation": false,
"creator_level": [
"string"
],
"support_email": "string",
"short_header_message": "string",
"content_guidelines": {
"property1": [
"string"
],
"property2": [
"string"
]
},
"inspiration_links": [
"string"
],
"has_tiered_payout": false,
"payout_structure": {},
"grace_period": 365,
"reminders": {
"enabled": false,
"message_before_3_days": "string",
"message_before_1_day": "string"
},
"email_templates": {
"enabled": true,
"application": {},
"acceptance": {},
"rejection": {}
}
}
CampaignCreateRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| campaign_name | string | true | none | none |
| campaign_type | CampaignType | true | none | Supported campaign types. |
| creator_source | CreatorSource | true | none | How creators are sourced for a campaign. |
| start_date | string | true | none | none |
| end_date | any | false | none | YYYY-MM-DD. REQUIRED for challenge / leaderboard / live_gmv_challenge campaigns (the portal launch form requires an end date for these); optional only for retainer campaigns, which may run open-ended. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| description | any | false | none | REQUIRED for launch. Rich-text (HTML) campaign description shown to creators. Must contain visible text — an empty string or HTML-only value like '' is rejected, matching the portal launch form. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| status | CampaignStatus | false | none | DB-level campaign status. The frontend filter param 'active'/'past' are UI aliases — 'active' maps to published, 'past' maps to != published. |
| pricing | any | true | none | none |
oneOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | RetainerPricing | false | none | Pricing configuration for retainer campaigns. |
xor
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | ChallengePricing | false | none | Pricing configuration for challenge campaigns. |
xor
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | LeaderboardPricing | false | none | Pricing configuration for leaderboard campaigns. Extra keys are IGNORED (the codebase default, matching every sibling pricing class): the brand FE sends UI-only toggles like minimum_gmv_required_enabled that are not modelled here. Thesmuggling protection the materializer needs comes from re-parsing the stored template pricing through this model, which drops unknown keys so they never reach a materialized instance — not from extra="forbid",which would break the live create/edit path. |
xor
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | LiveGMVChallengePricing | false | none | Pricing configuration for live GMV challenge campaigns. |
xor
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | RacePricing | false | none | Shared prize pool, fixed value per qualifying unit, first come first served.extra="forbid": unlike the legacy types, whose frontend sends UI-onlytoggles these models never declared, this is a new surface with no legacy payload to tolerate. A misspelled or unsupported payout field must fail loudly rather than be silently dropped -- which is also what makes the minimum-floor rejection real rather than decorative. |
xor
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | BingoPricing | false | none | A card of goals, paid per completed line. See RacePricing for extra=forbid. |
xor
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | SweepstakesPricing | false | none | Points buy entries; one winner drawn weighted by points share. See RacePricing for why extra="forbid". |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| products | any | false | none | REQUIRED for launch. The portal launch form needs at least one product: send products.all_selected=true to include every shop product, or products.items=[...] with 1-10 products. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | CampaignProducts | false | none | Product configuration for a campaign. |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creators | any | false | none | Optional list of creators to seed into the campaign. Mirrors the portal's contract exactly (see community.schemas.campaign.CampaignCreate.creators) so the public API doesn't fork from /api/marketplace/v2. Each dict is opaque to validation but is typically `{"creator_id": int, "tier": str |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [object] | false | none | none |
| »» additionalProperties | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| »»» anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| »»» anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| »»» anonymous | null | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| window_url | any | false | none | HTTPS URL — public landing/preview page for this campaign. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| is_available_to_all | boolean | false | none | none |
| requires_approval | boolean | false | none | none |
| exclusive_participation | boolean | false | none | While on, a creator active in another overlapping campaign of this shop cannot be activated here (and vice versa). |
| creator_level | any | false | none | Creator tier filter (list or CSV string). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| support_email | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| short_header_message | any | false | none | REQUIRED for launch. Short headline shown on the campaign card. Must be a non-empty string — the portal launch form rejects a blank value. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| content_guidelines | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | object | false | none | none |
| »» additionalProperties | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| inspiration_links | any | false | none | List of HTTPS URLs (inspiration videos, mood-boards, etc.). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| has_tiered_payout | boolean | false | none | none |
| payout_structure | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | object | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| grace_period | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| reminders | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | CampaignReminders | false | none | Reminder configuration for a campaign. |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| email_templates | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | CampaignEmailTemplates | false | none | Email template configuration for a campaign. |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
CampaignCreatedResponse
{
"campaign_id": 0,
"uuid_id": "string",
"status": "created",
"invite_link": "string"
}
CampaignCreatedResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| campaign_id | integer | true | none | none |
| uuid_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| status | string | false | none | none |
| invite_link | any | false | none | Public invite URL the caller can share with creators to join this campaign. Subdomain is picked by creator_source: social_army campaigns (legacy partnership) use https://soco.reacherapp.com; every other source — my_community and the rest — uses https://creator.reacherapp.com. Full pattern: {base}/campaigns/{shop_id}/{uuid_id}. Always populated on a successful 201. Falsy only in the unexpected case where the service returned without setting uuid_id. Available on every campaign endpoint that returns a campaign payload: POST /campaigns, GET /campaigns, GET /campaigns/{id}, GET /campaigns/{id}/detail — uniform contract. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
CampaignCreatorDiscordItem
{
"tiktok_handle": "string",
"discord_handle": "string",
"discord_user_id": "string",
"campaign_id": 0,
"campaign_name": "string"
}
CampaignCreatorDiscordItem
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| tiktok_handle | any | false | none | The TikTok handle this creator posts as for the campaign — the one they chose when enrolling, or their primary handle if they made no per-campaign choice. DB: creator_tiktok_auth.tiktok_username. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| discord_handle | any | false | none | Creator's linked Discord username. Creator-provided and optional — null when the creator has not connected Discord (only returned when with_discord_only=false). DB: creator_discord_links.username. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| discord_user_id | any | false | none | Discord's stable numeric user id (snowflake) for the creator. Unlike the handle it never changes, so it is the reliable key for matching a Discord server member to this creator. DB: creator_discord_links.discord_user_id. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| campaign_id | integer | true | none | Campaign the creator is linked to. DB: campaign_creator_mapping.campaign_id. |
| campaign_name | any | false | none | Campaign name. DB: campaigns.campaign_name. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
CampaignCreatorDiscordResponse
{
"data": [
{
"tiktok_handle": "string",
"discord_handle": "string",
"discord_user_id": "string",
"campaign_id": 0,
"campaign_name": "string"
}
],
"pagination": null
}
CampaignCreatorDiscordResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | [CampaignCreatorDiscordItem] | true | none | [One campaign-linked creator's TikTok + Discord handles. Grain is (campaign, creator): a creator working with several of your campaigns appears once per campaign. Deliberately excludes the creator's internal id, email, phone, address, avatar and Stripe state — the same public-API privacy projection every other creator surface uses.] |
| pagination | any | true | none | none |
CampaignDeletedResponse
{
"campaign_id": 0,
"status": "deleted"
}
CampaignDeletedResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| campaign_id | integer | true | none | none |
| status | string | false | none | none |
CampaignEmailTemplates
{
"enabled": true,
"application": {},
"acceptance": {},
"rejection": {}
}
CampaignEmailTemplates
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| enabled | boolean | false | none | none |
| application | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | object | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| acceptance | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | object | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| rejection | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | object | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
CampaignLeaderboardResponse
{
"campaign_id": 0,
"campaign_name": "",
"scoring_mode": "single",
"metric_type": "gmv",
"weighted_metrics": [
{}
],
"start_date": "string",
"end_date": "string",
"currency_code": "USD",
"currency_symbol": "$",
"standings": [
{
"rank": 0,
"creator_id": "string",
"handle": "string",
"creator_name": "string",
"avatar_url": "string",
"composite_score": 0,
"score_breakdown": [
{
"metric_type": "string",
"weight": 0,
"contribution": 0,
"raw_value": 0
}
],
"gmv": 0,
"views": 0,
"videos_posted": 0,
"units_sold": 0,
"avg_views_per_post": 0,
"live_gmv": 0,
"live_session_count": 0,
"combined_gmv": 0,
"frozen": false
}
],
"micro_challenge": {
"micro_campaign_id": 0,
"name": "",
"window_start_at": "string",
"window_end_at": "string",
"status": "live",
"scoring_mode": "single",
"metric_type": "gmv",
"standings": [
{
"rank": 0,
"creator_id": "string",
"handle": "string",
"creator_name": "string",
"avatar_url": "string",
"composite_score": 0,
"score_breakdown": [
{
"metric_type": "string",
"weight": 0,
"contribution": 0,
"raw_value": 0
}
],
"gmv": 0,
"views": 0,
"videos_posted": 0,
"units_sold": 0,
"avg_views_per_post": 0,
"live_gmv": 0,
"live_session_count": 0,
"combined_gmv": 0,
"frozen": false
}
]
},
"total_creators": 0,
"standings_frozen": false,
"standings_frozen_at": "string",
"standings_frozen_reason": "string",
"standings_period_end": "string",
"values_windowed": true,
"as_of": "string",
"pagination": {
"page": 0,
"page_size": 0,
"total_count": 0,
"total_pages": 0
}
}
CampaignLeaderboardResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| campaign_id | integer | true | none | none |
| campaign_name | string | false | none | none |
| scoring_mode | string | false | none | single |
| metric_type | string | false | none | Ranking metric for single-metric campaigns; the composite's tie-break/display metric for weighted. |
| weighted_metrics | any | false | none | Metric/weight pairs (summing to 100) for weighted campaigns; null for single-metric. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [object] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| start_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| currency_code | string | false | none | none |
| currency_symbol | string | false | none | none |
| standings | [LeaderboardStanding] | false | none | [A single creator's rank + score + per-metric stats in a campaign.] |
| micro_challenge | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | MicroChallengeBoardResponse | false | none | The nested micro-challenge ("blitz") board for a parent campaign. A micro-challenge is a windowed sub-contest. Its standings are scored over videos posted inside [window_start_at, window_end_at) only.Populated when a window is currently live, or was live within the last 7 days; otherwise the parent response's micro_challenge is null. |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| total_creators | integer | true | none | Full participant count (active + Paid/Settled), independent of pagination. |
| standings_frozen | boolean | false | none | True once the board is locked. Standings then stop changing: every metric and rank comes from the locked snapshot. |
| standings_frozen_at | any | false | none | ISO-8601 timestamp the board locked. Null while live. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| standings_frozen_reason | any | false | none | What locked it: end_lag (2 days after the close, the affiliate-sync lag), first_payout, stop_close (a stop condition tripped), exclusion (re-locked after a video exclusion), manual_backfill, or legacy. Null while live. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| standings_period_end | any | false | none | Last day (YYYY-MM-DD, shop-local) the board counts sales for: the earlier of end_date and a stop-condition trip. Sales after it never reach the standings. Null for an open-ended campaign that is still running. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| values_windowed | boolean | false | none | True when gmv, views, units_sold and videos_posted are bounded to the campaign period (the normal case). False only while the daily ledger is unreachable: the board then shows lifetime values, which equal the windowed ones for a running campaign and overstate a campaign closed within the last two days. A locked board is never served unwindowed. |
| as_of | string | true | none | ISO-8601 UTC timestamp the standings were computed. On a locked board the values have not changed since standings_frozen_at. |
| pagination | community__schemas__common__PaginationMeta | true | none | Pagination metadata returned in list responses. |
CampaignProducts
{
"all_selected": false,
"items": [
{
"product_id": "string",
"tap_link": "string",
"product_name": "string"
}
],
"use_first_product_image": true,
"custom_image": "string",
"campaign_image": "string"
}
CampaignProducts
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| all_selected | boolean | false | none | Whether all shop products are selected |
| items | [ProductItem-Input] | false | none | Selected product list |
| use_first_product_image | any | false | none | Use first product image as campaign image |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | boolean | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| custom_image | any | false | none | Custom campaign image (base64 or URL) |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| campaign_image | any | false | none | Resolved campaign image URL (read-only) |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
CampaignReminders
{
"enabled": false,
"message_before_3_days": "string",
"message_before_1_day": "string"
}
CampaignReminders
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| enabled | boolean | false | none | none |
| message_before_3_days | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| message_before_1_day | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
CampaignStatus
"published"
CampaignStatus
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| CampaignStatus | string | false | none | DB-level campaign status. The frontend filter param 'active'/'past' are UI aliases — 'active' maps to published, 'past' maps to != published. |
Enumerated Values
| Property | Value |
|---|---|
| CampaignStatus | published |
| CampaignStatus | draft |
| CampaignStatus | deleted |
| CampaignStatus | archived |
CampaignType
"retainer"
CampaignType
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| CampaignType | string | false | none | Supported campaign types. |
Enumerated Values
| Property | Value |
|---|---|
| CampaignType | retainer |
| CampaignType | challenge |
| CampaignType | leaderboard |
| CampaignType | live_gmv_challenge |
| CampaignType | race |
| CampaignType | bingo |
| CampaignType | sweepstakes |
CampaignUpdateRequest
{
"campaign_name": "string",
"start_date": "string",
"end_date": "string",
"description": "string",
"status": "published",
"pricing": {
"campaign_type": "retainer",
"posts": 1,
"payment_per_creator": 0,
"reward_type": "cash",
"metric_type": "gmv",
"minimum_gmv_required": 0,
"minimum_gmv_required_enabled": false,
"minimum_views_required": 0,
"minimum_views_required_enabled": false,
"minimum_videos_required": 0
},
"products": {
"all_selected": false,
"items": [
{
"product_id": "string",
"tap_link": "string",
"product_name": "string"
}
],
"use_first_product_image": true,
"custom_image": "string",
"campaign_image": "string"
},
"creators": [
{
"property1": "string",
"property2": "string"
}
],
"window_url": "string",
"is_available_to_all": true,
"requires_approval": true,
"exclusive_participation": true,
"creator_level": [
"string"
],
"support_email": "string",
"short_header_message": "string",
"content_guidelines": {
"property1": [
"string"
],
"property2": [
"string"
]
},
"inspiration_links": [
"string"
],
"has_tiered_payout": true,
"payout_structure": {},
"grace_period": 365,
"reminders": {
"enabled": false,
"message_before_3_days": "string",
"message_before_1_day": "string"
},
"email_templates": {
"enabled": true,
"application": {},
"acceptance": {},
"rejection": {}
}
}
CampaignUpdateRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| campaign_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| start_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| description | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| status | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | CampaignStatus | false | none | DB-level campaign status. The frontend filter param 'active'/'past' are UI aliases — 'active' maps to published, 'past' maps to != published. |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| pricing | any | false | none | none |
anyOf - discriminator: campaign_type
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | any | false | none | none |
oneOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| »» anonymous | RetainerPricing | false | none | Pricing configuration for retainer campaigns. |
xor
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| »» anonymous | ChallengePricing | false | none | Pricing configuration for challenge campaigns. |
xor
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| »» anonymous | LeaderboardPricing | false | none | Pricing configuration for leaderboard campaigns. Extra keys are IGNORED (the codebase default, matching every sibling pricing class): the brand FE sends UI-only toggles like minimum_gmv_required_enabled that are not modelled here. Thesmuggling protection the materializer needs comes from re-parsing the stored template pricing through this model, which drops unknown keys so they never reach a materialized instance — not from extra="forbid",which would break the live create/edit path. |
xor
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| »» anonymous | LiveGMVChallengePricing | false | none | Pricing configuration for live GMV challenge campaigns. |
xor
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| »» anonymous | RacePricing | false | none | Shared prize pool, fixed value per qualifying unit, first come first served.extra="forbid": unlike the legacy types, whose frontend sends UI-onlytoggles these models never declared, this is a new surface with no legacy payload to tolerate. A misspelled or unsupported payout field must fail loudly rather than be silently dropped -- which is also what makes the minimum-floor rejection real rather than decorative. |
xor
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| »» anonymous | BingoPricing | false | none | A card of goals, paid per completed line. See RacePricing for extra=forbid. |
xor
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| »» anonymous | SweepstakesPricing | false | none | Points buy entries; one winner drawn weighted by points share. See RacePricing for why extra="forbid". |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| products | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | CampaignProducts | false | none | Product configuration for a campaign. |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creators | any | false | none | Optional list of creators to seed into the campaign. Mirrors the portal's contract exactly (see community.schemas.campaign.CampaignCreate.creators) so the public API doesn't fork from /api/marketplace/v2. Each dict is opaque to validation but is typically `{"creator_id": int, "tier": str |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [object] | false | none | none |
| »» additionalProperties | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| »»» anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| »»» anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| »»» anonymous | null | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| window_url | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| is_available_to_all | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | boolean | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| requires_approval | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | boolean | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| exclusive_participation | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | boolean | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_level | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| support_email | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| short_header_message | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| content_guidelines | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | object | false | none | none |
| »» additionalProperties | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| inspiration_links | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| has_tiered_payout | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | boolean | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| payout_structure | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | object | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| grace_period | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| reminders | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | CampaignReminders | false | none | Reminder configuration for a campaign. |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| email_templates | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | CampaignEmailTemplates | false | none | Email template configuration for a campaign. |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
CampaignUpdatedResponse
{
"campaign_id": 0,
"status": "updated",
"participant_sync": {
"applies_to": "string",
"fields": [
"string"
],
"updated": 0,
"unchanged": 0,
"skipped_paid": 0
}
}
CampaignUpdatedResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| campaign_id | integer | true | none | none |
| status | string | false | none | none |
| participant_sync | any | false | none | Present when the edit touched payout-affecting pricing fields; absent otherwise. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | ParticipantSync | false | none | How a payout-affecting edit was applied to existing participants. |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
CatalogProductItem
{
"shop_id": 0,
"product_id": "string",
"title": "string",
"description": "string",
"brand_name": "string",
"category_chain": [
null
],
"primary_image_url": "string",
"image_urls": [
null
],
"currency": "string",
"price_min_cents": 0,
"price_max_cents": 0,
"total_inventory": 0,
"sku_count": 0,
"out_of_stock_sku_count": 0,
"product_status": "string",
"affiliate_status": 0,
"is_cod_allowed": true,
"tiktok_created_at": "string",
"tiktok_updated_at": "string",
"updated_at": "string",
"skus": [
{
"sku_id": "string",
"seller_sku": "string",
"inventory": 0,
"variants": [
{
"name": "string",
"value_name": "string",
"value_id": "string",
"image_url": "string"
}
],
"updated_at": "string"
}
]
}
CatalogProductItem
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | integer | true | none | Reacher shop id that owns this product (useful for multi-shop syncs). |
| product_id | string | true | none | TikTok product id. |
| title | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| description | any | false | none | Product copy (HTML), from the catalog. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| brand_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| category_chain | [any] | false | none | Category hierarchy as stored by TikTok (leaf-last). |
| primary_image_url | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| image_urls | [any] | false | none | All image URLs for the product (empty when none are set). |
| currency | string | true | none | ISO 4217 currency for the *_cents fields. |
| price_min_cents | any | false | none | Lowest listed price across SKUs, in cents. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| price_max_cents | any | false | none | Highest listed price across SKUs, in cents. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| total_inventory | any | false | none | Product-level stock reported by TikTok. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sku_count | any | false | none | Number of SKUs. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| out_of_stock_sku_count | any | false | none | How many SKUs currently have zero stock. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_status | any | false | none | ACTIVATE / DRAFT / REVIEWING / etc. Null for unofficial shops. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| affiliate_status | any | false | none | TikTok affiliate eligibility (1=ELIGIBLE, 2/6=OUT_OF_STOCK, 3/999=UNAVAILABLE, 4=PLATFORM_DEACTIVATED). Refreshed every sync. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| is_cod_allowed | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | boolean | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| tiktok_created_at | any | false | none | When TikTok created the listing (ISO 8601 UTC). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| tiktok_updated_at | any | false | none | When TikTok last changed the listing (ISO 8601 UTC). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| updated_at | any | false | none | When Reacher last synced this product row (ISO 8601 UTC, microsecond precision). Feed the max value from a batch back as the next request's updated_since to drive a best-effort incremental sync. The filter is inclusive (>=), so re-fetch the boundary and de-dupe by product_id. Deleted products are not returned as tombstones, and a SKU-only change only appears if the sync also advanced this updated_at — a full mirror must reconcile deletions out-of-band. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| skus | [CatalogSkuItem] | false | none | Per-SKU rows with stock. Empty when include_skus=false. |
CatalogSkuItem
{
"sku_id": "string",
"seller_sku": "string",
"inventory": 0,
"variants": [
{
"name": "string",
"value_name": "string",
"value_id": "string",
"image_url": "string"
}
],
"updated_at": "string"
}
CatalogSkuItem
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sku_id | string | true | none | TikTok SKU id. |
| seller_sku | any | false | none | Merchant's own SKU code. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| inventory | integer | true | none | Current stock for this SKU. This can differ from the product-level total_inventory while a catalog sync is in progress, so do not assume the two always agree. |
| variants | [CatalogSkuVariant] | false | none | Variant dimensions (color/size/etc.) that identify this SKU. |
| updated_at | any | false | none | When Reacher last synced this SKU row (ISO 8601 UTC). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
CatalogSkuVariant
{
"name": "string",
"value_name": "string",
"value_id": "string",
"image_url": "string"
}
CatalogSkuVariant
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| name | any | false | none | Attribute name, e.g. 'Color' or 'Size'. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| value_name | any | false | none | Selected value, e.g. 'GOLDEN MEDIUM'. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| value_id | any | false | none | TikTok value id for the selected value. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| image_url | any | false | none | Variant swatch image for this attribute value. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
ChallengeGate
{
"metric": "video_count",
"threshold": 0
}
ChallengeGate
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| metric | string | true | none | none |
| threshold | number | true | none | none |
Enumerated Values
| Property | Value |
|---|---|
| metric | video_count |
| metric | gmv |
ChallengePaymentTier
{
"threshold": 0,
"compensation": 0,
"videos_required": 0,
"sessions_required": 0
}
ChallengePaymentTier
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| threshold | number | true | none | none |
| compensation | any | true | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| videos_required | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sessions_required | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
ChallengePricing
{
"campaign_type": "challenge",
"payment_tiers": [
{
"threshold": 0,
"compensation": 0,
"videos_required": 0
}
],
"reward_type": "cash",
"metric_type": "gmv",
"minimum_gmv_required": 0,
"minimum_gmv_required_enabled": false,
"minimum_views_required": 0,
"minimum_videos_required": 0,
"ranking_priority": "gmv"
}
ChallengePricing
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| campaign_type | string | false | none | none |
| payment_tiers | [PaymentTier] | true | none | At least one tier required |
| reward_type | RewardType | true | none | Cash or custom reward |
| metric_type | string | false | none | Performance metric to evaluate |
| minimum_gmv_required | any | false | none | Minimum GMV floor (gmv_videos gate) |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| minimum_gmv_required_enabled | boolean | false | none | Whether the minimum GMV floor is active |
| minimum_views_required | any | false | none | Minimum views floor (when metric is views) |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| minimum_videos_required | any | false | none | Minimum videos floor (videos_posted / gmv_videos gate) |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| ranking_priority | any | false | none | Primary ranking metric for gmv_videos contests; the other is a per-tier requirement |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| metric_type | gmv |
| metric_type | views |
| metric_type | videos_posted |
| metric_type | gmv_videos |
| anonymous | gmv |
| anonymous | videos |
ChallengeReward
{
"kind": "challenge",
"metric_type": "gmv",
"payment_tiers": [
{
"threshold": 0,
"compensation": 0,
"videos_required": 0,
"sessions_required": 0
}
],
"minimum_gate": {
"metric": "video_count",
"threshold": 0
},
"gmv_floor": 0,
"videos_floor": 0,
"live_gmv_floor": 0,
"sessions_floor": 0,
"ranking_priority": "gmv",
"payment_due_days": 30
}
ChallengeReward
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| kind | string | true | none | none |
| metric_type | string | true | none | none |
| payment_tiers | [ChallengePaymentTier] | true | none | none |
| minimum_gate | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | ChallengeGate | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| gmv_floor | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| videos_floor | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| live_gmv_floor | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sessions_floor | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| ranking_priority | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| payment_due_days | integer | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| metric_type | gmv |
| metric_type | views |
| metric_type | video_count |
| metric_type | gmv_videos |
| metric_type | live_gmv |
| metric_type | sessions |
| metric_type | sessions_and_live_gmv |
| anonymous | gmv |
| anonymous | videos |
| anonymous | live_gmv |
| anonymous | sessions |
ChangeDirection
"up"
ChangeDirection
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| ChangeDirection | string | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| ChangeDirection | up |
| ChangeDirection | down |
| ChangeDirection | flat |
ChangeMetric
{
"count": 0,
"changePct": 0,
"changeDirection": "up"
}
ChangeMetric
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| count | integer | true | none | none |
| changePct | number | true | none | none |
| changeDirection | ChangeDirection | true | none | none |
ChannelBaseline
{
"gmv": 0,
"impressions": 0,
"units_sold": 0,
"customers": 0
}
ChannelBaseline
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| gmv | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| impressions | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| units_sold | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| customers | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
ChannelGmvSplit
{
"gmv": 0,
"affiliate": 0,
"seller": 0
}
ChannelGmvSplit
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| gmv | number | true | none | none |
| affiliate | number | true | none | none |
| seller | number | true | none | none |
ChannelIndustryMedian
{
"as_of": "string",
"gmv": 0,
"impressions": 0,
"units_sold": 0,
"customers": 0
}
ChannelIndustryMedian
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| as_of | string | true | none | The day this benchmark was collected. |
| gmv | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| impressions | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| units_sold | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| customers | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
CohortAttributionResponse
{
"cohort_month": "2019-08-24",
"cohort_size": 0,
"attributed": 0,
"unattributed": 0,
"automations": [
{
"automation_id": 0,
"automation_name": "string",
"automation_type": "string",
"creators_sourced": 0,
"share": 0,
"first_run": "2019-08-24",
"last_run": "2019-08-24"
}
]
}
CohortAttributionResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| cohort_month | string(date) | true | none | none |
| cohort_size | integer | false | none | Total creators in the cohort. |
| attributed | integer | false | none | Cohort members traced to an automation. |
| unattributed | integer | false | none | Cohort members with no automation touch on record — organic, or reached before the 13-month outreach horizon. Reported rather than hidden: a near-total value means the join drifted, not that the shop ran no automations. |
| automations | [CohortAttributionRow] | false | none | [One automation that sourced part of a cohort (CORE-6003).] |
CohortAttributionRow
{
"automation_id": 0,
"automation_name": "string",
"automation_type": "string",
"creators_sourced": 0,
"share": 0,
"first_run": "2019-08-24",
"last_run": "2019-08-24"
}
CohortAttributionRow
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| automation_id | integer | true | none | none |
| automation_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| automation_type | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creators_sourced | integer | false | none | Cohort members first touched by this automation. |
| share | number | false | none | creators_sourced as a share of the cohort (0-100). |
| first_run | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| last_run | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
CohortCell
{
"offset": 0,
"posted": 0,
"gmv_count": 0,
"total_videos": 0
}
CohortCell
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| offset | integer | true | none | Months since cohort start (M0..M6). |
| posted | integer | false | none | Distinct creators who posted ≥1 video in this offset month. |
| gmv_count | integer | false | none | Distinct creators who drove GMV in this offset month. |
| total_videos | integer | false | none | Total videos posted by the cohort in this offset month. |
CohortCreator
{
"creator_key": "string",
"creator_display_name": "string",
"videos_posted": 0,
"gmv": "0"
}
CohortCreator
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_key | string | true | none | none |
| creator_display_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| videos_posted | integer | false | none | none |
| gmv | string | false | none | none |
CohortCreatorsResponse
{
"creators": [
{
"creator_key": "string",
"creator_display_name": "string",
"videos_posted": 0,
"gmv": "0"
}
],
"capped": false,
"cap": 500,
"direction": "active"
}
CohortCreatorsResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creators | [CohortCreator] | false | none | [One creator behind a clicked cell (drill-down).] |
| capped | boolean | false | none | True when the result hit the row cap and was truncated. |
| cap | integer | false | none | Max rows returned; results truncated beyond this. |
| direction | string | false | none | Which half of the cell this list is: 'active' (creators who qualified at that offset) or 'lapsed' (cohort members who did not). Echoed back so the FE cannot mislabel the list. |
CohortGridResponse
{
"shop_id": 0,
"product_id": "string",
"computed_date": "2019-08-24",
"offsets": [
0
],
"cohorts": [
{
"cohort_month": "2019-08-24",
"affiliates": 0,
"cells": [
{
"offset": 0,
"posted": 0,
"gmv_count": 0,
"total_videos": 0
}
]
}
]
}
CohortGridResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | integer | true | none | none |
| product_id | any | false | none | Product filter, or null for the all-products grid. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| computed_date | any | false | none | Snapshot date for the default (no-product) grid; null for the live product-filtered path. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| offsets | [integer] | false | none | Month offsets the grid tracks (M0..M6). |
| cohorts | [CohortRow] | false | none | [One cohort (creators grouped by month of first video) and its cells.] |
CohortRow
{
"cohort_month": "2019-08-24",
"affiliates": 0,
"cells": [
{
"offset": 0,
"posted": 0,
"gmv_count": 0,
"total_videos": 0
}
]
}
CohortRow
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| cohort_month | string(date) | true | none | First-video month for this cohort. |
| affiliates | integer | false | none | Cohort size (the denominator for % metrics). |
| cells | [CohortCell] | false | none | Triangle of populated month-offset cells. |
CommissionInfo
{
"commission_rate": 0,
"shop_ads_commission_rate": 0
}
CommissionInfo
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| commission_rate | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_ads_commission_rate | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
CompletionRateMetric
{
"rate": 0,
"changePct": 0,
"changeDirection": "up"
}
CompletionRateMetric
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| rate | number | true | none | none |
| changePct | number | true | none | none |
| changeDirection | ChangeDirection | true | none | none |
ConditionMetric
"creative_roi"
ConditionMetric
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| ConditionMetric | string | false | none | Metric a condition evaluates against the campaign / creative window. The first nine values are what the portal FE exposes in the Create-Automation form. The trailing four ( roi, spend, ctr,spend_pacing) appear in /templates payloads — accepted so acaller that round-trips a template through POST /automations isnot rejected by validation. |
Enumerated Values
| Property | Value |
|---|---|
| ConditionMetric | creative_roi |
| ConditionMetric | creative_revenue |
| ConditionMetric | campaign_roi |
| ConditionMetric | campaign_revenue |
| ConditionMetric | campaign_cost |
| ConditionMetric | click_through_rate |
| ConditionMetric | organic_engagement_rate |
| ConditionMetric | product_ad_clicks |
| ConditionMetric | 2s_video_view_rate |
| ConditionMetric | roi |
| ConditionMetric | spend |
| ConditionMetric | ctr |
| ConditionMetric | spend_pacing |
ConditionOperator
"lt"
ConditionOperator
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| ConditionOperator | string | false | none | Comparison operator. Both the FE's short form (lt, gte) andthe legacy symbol form ( >=, <) are accepted — the controllertreats them as synonyms. |
Enumerated Values
| Property | Value |
|---|---|
| ConditionOperator | lt |
| ConditionOperator | gte |
| ConditionOperator | >= |
| ConditionOperator | <= |
| ConditionOperator | > |
| ConditionOperator | < |
| ConditionOperator | == |
ConditionRulePublic
{
"metric": "creative_roi",
"operator": "lt",
"value": 0,
"lookback_days": 3
}
ConditionRulePublic
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| metric | ConditionMetric | true | none | Metric to evaluate. See ConditionMetric for the full set. |
| operator | ConditionOperator | true | none | Comparison operator. lt / gte are the FE forms; >= / < etc. are legacy and equally accepted. |
| value | number | true | none | Threshold the metric is compared against. |
| lookback_days | integer | false | none | How many days of history the metric is computed over. Default 3. |
ConnectedEntity
{
"id": "string",
"name": "string"
}
ConnectedEntity
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
ConnectedIGEntity
{
"id": "string",
"username": "string"
}
ConnectedIGEntity
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| username | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
ContentIdea
{
"title": "string",
"detail": "string"
}
ContentIdea
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| title | string | true | none | none |
| detail | string | true | none | none |
ContestRank
{
"rank": 1,
"reward": 0
}
ContestRank
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| rank | integer | true | none | none |
| reward | any | true | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
ContractEnvelopeOut
{
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"batch_id": "4da22c97-b7d5-4e31-8c3a-03870ebc7b20",
"campaign_id": 0,
"campaign_name": "string",
"creator_id": 0,
"creator_name": "string",
"creator_handle": "string",
"contract_title": "string",
"template_source": "standard",
"terms": {
"campaign_type": "retainer",
"brand_name": "string",
"brand_representative_name": "string",
"deliverables": 1,
"posting_platform": "TikTok",
"posting_requirements": "",
"posting_start_date": "2019-08-24",
"effective_date": "2019-08-24",
"expiry_date": "2019-08-24",
"products": [
{
"product_id": "string",
"product_name": "string"
}
],
"all_products": false,
"require_video_link_email": false,
"video_link_email": "string",
"commission_pct": 100,
"expenses_reimbursable": false,
"revision_rounds": 0,
"include_usage_rights": true,
"usage_rights_months": 3,
"usage_rights_duration_days": 90,
"usage_rights_scope": "organic_only",
"usage_exclusivity_enabled": false,
"usage_exclusivity_months": 3,
"agreement_clause": "string",
"termination_notice_days": 30,
"governing_law_jurisdiction": "New York",
"reward": {
"kind": "retainer",
"mode": "fixed",
"payment_per_post": 0,
"tiers": [
{
"name": "string",
"retainer": 0,
"gmv_threshold": 0
}
],
"gmv_bonus_tiers": [
{
"gmv_threshold": 0,
"bonus_amount": 0
}
],
"recurring": false,
"payment_schedule": "one_time",
"payment_due_days": 30,
"minimum_gmv_floor": 0
}
},
"status": "draft",
"brand_signed_at": "2019-08-24T14:15:22Z",
"creator_signed_at": "2019-08-24T14:15:22Z",
"effective_date": "2019-08-24",
"expiry_date": "2019-08-24",
"last_error": "string"
}
ContractEnvelopeOut
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| id | string(uuid) | true | none | none |
| batch_id | string(uuid) | true | none | none |
| campaign_id | integer | true | none | none |
| campaign_name | string | true | none | none |
| creator_id | integer | true | none | none |
| creator_name | string | true | none | none |
| creator_handle | string | true | none | none |
| contract_title | string | true | none | none |
| template_source | string | true | none | none |
| terms | ContractTerms | true | none | none |
| status | string | true | none | none |
| brand_signed_at | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date-time) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_signed_at | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date-time) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| effective_date | string(date) | true | none | none |
| expiry_date | string(date) | true | none | none |
| last_error | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| status | draft |
| status | sent |
| status | active |
| status | expired |
| status | voided |
| status | delivery_failed |
ContractProduct
{
"product_id": "string",
"product_name": "string"
}
ContractProduct
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_id | string | true | none | none |
| product_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
ContractTemplateOut
{
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"name": "string",
"clause_count": 0,
"created_at": "2019-08-24T14:15:22Z",
"updated_at": "2019-08-24T14:15:22Z"
}
ContractTemplateOut
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| id | string(uuid) | true | none | none |
| name | string | true | none | none |
| clause_count | integer | true | none | none |
| created_at | string(date-time) | true | none | none |
| updated_at | string(date-time) | true | none | none |
ContractTerms
{
"campaign_type": "retainer",
"brand_name": "string",
"brand_representative_name": "string",
"deliverables": 1,
"posting_platform": "TikTok",
"posting_requirements": "",
"posting_start_date": "2019-08-24",
"effective_date": "2019-08-24",
"expiry_date": "2019-08-24",
"products": [
{
"product_id": "string",
"product_name": "string"
}
],
"all_products": false,
"require_video_link_email": false,
"video_link_email": "string",
"commission_pct": 100,
"expenses_reimbursable": false,
"revision_rounds": 0,
"include_usage_rights": true,
"usage_rights_months": 3,
"usage_rights_duration_days": 90,
"usage_rights_scope": "organic_only",
"usage_exclusivity_enabled": false,
"usage_exclusivity_months": 3,
"agreement_clause": "string",
"termination_notice_days": 30,
"governing_law_jurisdiction": "New York",
"reward": {
"kind": "retainer",
"mode": "fixed",
"payment_per_post": 0,
"tiers": [
{
"name": "string",
"retainer": 0,
"gmv_threshold": 0
}
],
"gmv_bonus_tiers": [
{
"gmv_threshold": 0,
"bonus_amount": 0
}
],
"recurring": false,
"payment_schedule": "one_time",
"payment_due_days": 30,
"minimum_gmv_floor": 0
}
}
ContractTerms
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| campaign_type | string | true | none | none |
| brand_name | string | true | none | none |
| brand_representative_name | string | true | none | none |
| deliverables | integer | true | none | none |
| posting_platform | string | false | none | none |
| posting_requirements | string | false | none | none |
| posting_start_date | string(date) | true | none | none |
| effective_date | string(date) | true | none | none |
| expiry_date | string(date) | true | none | none |
| products | [ContractProduct] | false | none | none |
| all_products | boolean | false | none | none |
| require_video_link_email | boolean | false | none | none |
| video_link_email | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| commission_pct | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| expenses_reimbursable | boolean | false | none | none |
| revision_rounds | integer | false | none | none |
| include_usage_rights | boolean | false | none | none |
| usage_rights_months | integer | false | none | none |
| usage_rights_duration_days | integer | false | none | none |
| usage_rights_scope | string | false | none | none |
| usage_exclusivity_enabled | boolean | false | none | none |
| usage_exclusivity_months | integer | false | none | none |
| agreement_clause | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| termination_notice_days | integer | false | none | none |
| governing_law_jurisdiction | string | false | none | none |
| reward | any | true | none | none |
oneOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | RetainerReward | false | none | none |
xor
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | ChallengeReward | false | none | none |
xor
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | LeaderboardReward | false | none | none |
xor
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | ReimbursementReward | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| campaign_type | retainer |
| campaign_type | challenge |
| campaign_type | leaderboard |
| campaign_type | reimbursement |
| posting_platform | TikTok |
| posting_platform | |
| posting_platform | YouTube |
| posting_platform | TikTok+Instagram |
| revision_rounds | 0 |
| revision_rounds | 1 |
| revision_rounds | 2 |
| usage_rights_scope | organic_only |
| usage_rights_scope | organic_and_paid |
| usage_rights_scope | paid_only |
ContractWeightedMetric
{
"metric_type": "gmv",
"weight": 100
}
ContractWeightedMetric
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| metric_type | string | true | none | none |
| weight | number | true | none | none |
Enumerated Values
| Property | Value |
|---|---|
| metric_type | gmv |
| metric_type | avg_views_per_post |
| metric_type | views |
| metric_type | videos_posted |
| metric_type | units_sold |
| metric_type | live_gmv |
| metric_type | combined_gmv |
| metric_type | sessions |
CreateDepositIntentRequest
{
"amount": 100000,
"currency": "USD",
"success_url": "string",
"cancel_url": "string"
}
CreateDepositIntentRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| amount | number | true | none | Deposit amount |
| currency | string | false | none | ISO 4217 currency. The wallet's persisted currency overrides this for cross-currency safety. |
| success_url | string | true | none | URL Stripe redirects to on completion. Must use a Reacher-controlled host (app.reacherapp.com, portal.reacherapp.com, staging.reacherapp.com) or localhost/127.0.0.1 for development. |
| cancel_url | string | true | none | none |
CreateDraftDryRunResponse
{
"dry_run": true,
"would_create_for_handle": "string",
"content_type": "string",
"text": "string",
"image_url": "string",
"product_id": "string"
}
CreateDraftDryRunResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| dry_run | boolean | false | none | none |
| would_create_for_handle | string | true | none | none |
| content_type | string | true | none | none |
| text | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| image_url | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
CreateDraftRequest
{
"creator_handle": "string",
"text": "string",
"image_url": "stringstri",
"product_id": "string"
}
CreateDraftRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_handle | string | true | none | The creator's TikTok handle (with or without leading @). Must already have an open conversation with this shop — drafts can only be staged on existing conversations, the same prerequisite TikTok enforces on the live-send path. |
| text | any | false | none | Plain-text reply body. Set this OR image_url OR product_id (exactly one). message is accepted as an alias: it is what an assistant reaches for, and with extra=forbid the mismatch was a schema rejection before the clearer route-level validation below could run (CORE-6957). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| image_url | any | false | none | HTTPS URL of an image to send. Same SSRF + size + type constraints as the live /reply/image endpoint will apply when the human ships the draft — we do NOT fetch the URL at draft time (no outbound network call from this endpoint). Set this OR text OR product_id (exactly one). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_id | any | false | none | A TikTok product_id from THIS shop's catalog. Ownership is verified ONLY when the human clicks Send in the inbox — the draft endpoint does not pre-check the catalog (the catalog can change between draft and send anyway). Set this OR text OR image_url (exactly one). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
CreateDraftResponse
{
"id": 0,
"conversation_id": 0,
"content_type": "string",
"text_content": "string",
"payload": {},
"created_at": "string",
"expires_at": "string",
"created_by_api_key_id": 0
}
CreateDraftResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| id | integer | true | none | none |
| conversation_id | integer | true | none | none |
| content_type | string | true | none | 'text' |
| text_content | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| payload | object | false | none | none |
| created_at | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| expires_at | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| created_by_api_key_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
CreateGmvMaxCampaignRequest
{
"campaign_name": "string",
"campaign_type": "product",
"product_selection": "all",
"item_group_ids": [
"string"
],
"target_roas": 0,
"daily_budget": 0,
"schedule_type": "from_now",
"schedule_start_time": "string",
"schedule_end_time": "string",
"promotion_days": 1,
"auto_budget_enabled": true,
"affiliate_posts_enabled": true
}
CreateGmvMaxCampaignRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| campaign_name | string | true | none | Human-readable campaign name shown in Seller Center / the portal. |
| campaign_type | string | false | none | product (Product GMV Max) or live (LIVE GMV Max). Maps to TikTok shopping_ads_type PRODUCT / LIVE. |
| product_selection | string | true | none | all promotes every eligible product; customized restricts to the products in item_group_ids. Maps to TikTok product_specific_type ALL / CUSTOMIZED_PRODUCTS. |
| item_group_ids | any | false | none | Product (SPU / item_group_id) IDs to promote. Required and non-empty when product_selection is customized; must be omitted when product_selection is all. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| target_roas | number | true | none | Target ROAS. Required — TikTok GMV Max create always needs a target ROI: maps to TikTok roas_bid with deep_bid_type=VO_MIN_ROAS. |
| daily_budget | number | true | none | Daily budget in the shop's currency. Maps to TikTok budget. |
| schedule_type | string | true | none | from_now starts immediately with no end (TikTok SCHEDULE_FROM_NOW); start_end runs between schedule_start_time and schedule_end_time (TikTok SCHEDULE_START_END). |
| schedule_start_time | string | true | none | Campaign start time, TikTok format YYYY-MM-DD HH:MM:SS. Required for both from_now and start_end (TikTok always requires it). |
| schedule_end_time | any | false | none | Campaign end time, TikTok format YYYY-MM-DD HH:MM:SS. Required when schedule_type is start_end. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| promotion_days | any | false | none | Optional number of promotion days (LIVE GMV Max scheduling hint). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| auto_budget_enabled | any | false | none | Optional: let TikTok auto-manage the budget. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | boolean | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| affiliate_posts_enabled | any | false | none | Optional: allow affiliate creator posts to be used as creatives. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | boolean | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| campaign_type | product |
| campaign_type | live |
| product_selection | all |
| product_selection | customized |
| schedule_type | from_now |
| schedule_type | start_end |
CreateProfileResponse
{
"success": true,
"profile": {
"id": 0,
"title": "string",
"description": "string",
"search_query": "string",
"filters": {},
"source": "string",
"is_active": true,
"vault_file_resource_id": 0,
"is_hidden": true,
"is_deleted": true,
"hide_unsafe": true,
"creator_count": 0,
"last_search_at": "2019-08-24T14:15:22Z",
"created_at": "2019-08-24T14:15:22Z",
"updated_at": "2019-08-24T14:15:22Z",
"deleted_at": "2019-08-24T14:15:22Z"
},
"creator_count": 0
}
CreateProfileResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| success | boolean | true | none | none |
| profile | ProfileData | true | none | Profile data structure |
| creator_count | integer | true | none | none |
CreativeBriefUpdateRequest
{
"brief_name": "string",
"product_description": "string",
"when_to_use": "",
"image_urls": [
"string"
],
"content_angles": [
null
],
"unique_selling_points": [
null
],
"filming_recommendations": {},
"dos_and_donts": {},
"content_inspiration": [
null
],
"status": "drafted"
}
CreativeBriefUpdateRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| brief_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_description | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| when_to_use | string | false | none | none |
| image_urls | [string] | false | none | none |
| content_angles | [any] | false | none | none |
| unique_selling_points | [any] | false | none | none |
| filming_recommendations | object | false | none | none |
| dos_and_donts | object | false | none | none |
| content_inspiration | [any] | false | none | Inspiration videos. Entries missing key_points get them AI-generated from the video's analysis on save. At most 50 entries. |
| status | string | false | none | none |
CreativeBriefWriteResponse
{
"data": {},
"dry_run": false
}
CreativeBriefWriteResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | object | true | none | none |
| dry_run | boolean | false | none | none |
CreatorConversationItem
{
"creator_handle": "string",
"last_message_text": "string",
"last_message_time": "string",
"last_message_sender": "string",
"unread_count": 0
}
CreatorConversationItem
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_handle | any | false | none | Creator username (no leading @). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| last_message_text | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| last_message_time | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| last_message_sender | any | false | none | 'creator' or 'shop'. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| unread_count | integer | false | none | none |
CreatorConversationsResponse
{
"data": [
{
"creator_handle": "string",
"last_message_text": "string",
"last_message_time": "string",
"last_message_sender": "string",
"unread_count": 0
}
],
"offset": 0,
"limit": 0,
"has_more": true,
"total_count": 0,
"unread_conversations": 0,
"unreplied_conversations": 0
}
CreatorConversationsResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | [CreatorConversationItem] | true | none | none |
| offset | integer | true | none | none |
| limit | integer | true | none | none |
| has_more | boolean | true | none | none |
| total_count | integer | true | none | none |
| unread_conversations | integer | false | none | Number of conversations with at least one unread message (NOT the number of unread messages — see /creator-messages/stats unread_messages for that). Independent of the unread_only filter. |
| unreplied_conversations | integer | false | none | Number of conversations whose last message came from the creator (awaiting a shop reply). Independent of the unreplied_only filter. |
CreatorDetailResponse
{
"data": {
"creator_handle": "string",
"follower_count": 0,
"status": "string",
"shop_gmv": 0,
"overall_gmv": 0,
"creator_level": "string",
"overall_fulfillment_rate": 0,
"shop_units_sold": 0,
"shop_video_count": 0,
"video_views": 0,
"sample_received": 0,
"commission_rate": 0,
"est_commission": 0,
"fulfillment_rate": 0,
"tags": [
"string"
],
"product_id": "string",
"product_title": "string",
"updated_at": "string",
"created_at": "string"
},
"groups": [],
"products": [],
"videos": [],
"currency": "string"
}
CreatorDetailResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | CreatorListItem | true | none | none |
| groups | [CreatorGroupItem] | false | none | none |
| products | [CreatorProductItem] | false | none | none |
| videos | [VideoItem] | false | none | none |
| currency | string | true | none | none |
CreatorFilters
{
"product_categories": [
"string"
],
"follower_count": {
"min": 0,
"max": 0
},
"creator_ethnicity": [
"string"
],
"gender": [
"string"
],
"age_range": [
"string"
],
"languages": [
"string"
],
"community": [
"string"
],
"gmv": {
"min": 0,
"max": 0
},
"units_sold": {
"min": 0,
"max": 0
},
"average_views": {
"min": 0,
"max": 0
},
"engagement_rate": {
"min": 0,
"max": 0
},
"post_rate": {
"min": 0,
"max": 0
},
"video_gpm": {
"min": 0,
"max": 0
},
"live_gpm": {
"min": 0,
"max": 0
},
"follower_age": [
"string"
],
"follower_gender": [
"string"
],
"face_visibility": [
"string"
],
"content_style": [
"string"
],
"production_quality": [
"string"
],
"personality_tone": [
"string"
],
"body_type": [
"string"
],
"hair_type": [
"string"
]
}
CreatorFilters
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_categories | any | false | none | TikTok Shop product category names (e.g. 'Beauty & Personal Care'). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| follower_count | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | FilterRange | false | none | Inclusive numeric range. At least one of min / max must be set;the other is open-ended. Used by CreatorFilters for every range-style filter (GMV, followercount, average views, engagement rate, etc.). API exposes {min, max}objects; the translator converts to the legacy ["custom:min-max"]string form config.Filters expects. |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_ethnicity | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| gender | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| age_range | any | false | none | Age buckets, e.g. ['18-24', '25-34']. Buckets are platform-defined. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| languages | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| community | any | false | none | Community hashtags the creators post under. Available where the community-hashtag pipeline has coverage (currently US/UK/DE/ES) — GET /ai-search/hashtags is the live source of truth and returns valid hashtags for your region (404 where unsupported); a leading '#' is optional. Resolves the same audience the portal's community filter builds — the lever behind large niche segments (e.g. fitness) that product category alone can't target. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| gmv | any | false | none | Creator GMV in USD. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | FilterRange | false | none | Inclusive numeric range. At least one of min / max must be set;the other is open-ended. Used by CreatorFilters for every range-style filter (GMV, followercount, average views, engagement rate, etc.). API exposes {min, max}objects; the translator converts to the legacy ["custom:min-max"]string form config.Filters expects. |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| units_sold | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | FilterRange | false | none | Inclusive numeric range. At least one of min / max must be set;the other is open-ended. Used by CreatorFilters for every range-style filter (GMV, followercount, average views, engagement rate, etc.). API exposes {min, max}objects; the translator converts to the legacy ["custom:min-max"]string form config.Filters expects. |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| average_views | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | FilterRange | false | none | Inclusive numeric range. At least one of min / max must be set;the other is open-ended. Used by CreatorFilters for every range-style filter (GMV, followercount, average views, engagement rate, etc.). API exposes {min, max}objects; the translator converts to the legacy ["custom:min-max"]string form config.Filters expects. |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| engagement_rate | any | false | none | 0.0-1.0 fraction (e.g. 0.05 = 5%). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | FilterRange | false | none | Inclusive numeric range. At least one of min / max must be set;the other is open-ended. Used by CreatorFilters for every range-style filter (GMV, followercount, average views, engagement rate, etc.). API exposes {min, max}objects; the translator converts to the legacy ["custom:min-max"]string form config.Filters expects. |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| post_rate | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | FilterRange | false | none | Inclusive numeric range. At least one of min / max must be set;the other is open-ended. Used by CreatorFilters for every range-style filter (GMV, followercount, average views, engagement rate, etc.). API exposes {min, max}objects; the translator converts to the legacy ["custom:min-max"]string form config.Filters expects. |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video_gpm | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | FilterRange | false | none | Inclusive numeric range. At least one of min / max must be set;the other is open-ended. Used by CreatorFilters for every range-style filter (GMV, followercount, average views, engagement rate, etc.). API exposes {min, max}objects; the translator converts to the legacy ["custom:min-max"]string form config.Filters expects. |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| live_gpm | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | FilterRange | false | none | Inclusive numeric range. At least one of min / max must be set;the other is open-ended. Used by CreatorFilters for every range-style filter (GMV, followercount, average views, engagement rate, etc.). API exposes {min, max}objects; the translator converts to the legacy ["custom:min-max"]string form config.Filters expects. |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| follower_age | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| follower_gender | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| face_visibility | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| content_style | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| production_quality | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| personality_tone | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| body_type | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| hair_type | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
CreatorGroupItem
{
"group_id": "string",
"group_name": "string"
}
CreatorGroupItem
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| group_id | string | true | none | none |
| group_name | string | true | none | none |
CreatorInfo
{
"id": "string",
"handle": "string",
"name": "string",
"creatorImage": "string",
"followers": 0,
"creatorLevel": "string",
"fastGrowing": true,
"isRisingStar": true,
"returning": true,
"tags": [
"string"
]
}
CreatorInfo
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| id | string | true | none | none |
| handle | string | true | none | none |
| name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creatorImage | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| followers | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creatorLevel | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| fastGrowing | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | boolean | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| isRisingStar | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | boolean | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| returning | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | boolean | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| tags | [string] | false | none | none |
CreatorLevelCounts
{
"l0": 0,
"l1": 0,
"l2": 0,
"l3": 0,
"l4": 0,
"l5": 0,
"l6": 0,
"l7": 0
}
CreatorLevelCounts
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| l0 | integer | false | none | none |
| l1 | integer | false | none | none |
| l2 | integer | false | none | none |
| l3 | integer | false | none | none |
| l4 | integer | false | none | none |
| l5 | integer | false | none | none |
| l6 | integer | false | none | none |
| l7 | integer | false | none | none |
CreatorListItem
{
"creator_handle": "string",
"follower_count": 0,
"status": "string",
"shop_gmv": 0,
"overall_gmv": 0,
"creator_level": "string",
"overall_fulfillment_rate": 0,
"shop_units_sold": 0,
"shop_video_count": 0,
"video_views": 0,
"sample_received": 0,
"commission_rate": 0,
"est_commission": 0,
"fulfillment_rate": 0,
"tags": [
"string"
],
"product_id": "string",
"product_title": "string",
"updated_at": "string",
"created_at": "string"
}
CreatorListItem
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_handle | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| follower_count | any | false | none | DB: follower_num |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| status | any | false | none | Display status from rev_status_mapping() |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_gmv | any | false | none | Lifetime shop-specific GMV. DB: crm_creators.gmv |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| overall_gmv | any | false | none | Overall GMV from regional creator table. DB: Creator.gmv_num |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_level | any | false | none | GMV tier L0–L7, using the same thresholds as the dashboard's 'Creators by Level' chart (derived from overall_gmv: L0=$0, L1<$5k, L2<$25k, L3<$60k, L4<$150k, L5<$400k, L6<$1.0M, L7≥$1.0M). Null when overall GMV is unavailable for the creator. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| overall_fulfillment_rate | any | false | none | Overall fulfillment rate from regional creator table |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_units_sold | any | false | none | DB: item_sold |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_video_count | any | false | none | DB: video_num |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video_views | any | false | none | DB: content_video_views |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sample_received | any | false | none | DB: sample_received_num |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| commission_rate | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| est_commission | any | false | none | DB: estimate_commission |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| fulfillment_rate | any | false | none | Shop-specific fulfillment rate from crm_creators |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| tags | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_title | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| updated_at | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| created_at | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
CreatorListResponse
{
"profile_id": 0,
"profile_title": "string",
"total_creators": 0,
"page": 0,
"limit": 0,
"creators": [
{}
]
}
CreatorListResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| profile_id | integer | true | none | none |
| profile_title | string | true | none | none |
| total_creators | integer | true | none | none |
| page | integer | true | none | none |
| limit | integer | true | none | none |
| creators | [object] | true | none | none |
CreatorLookupItem
{
"ig_user_id": "string",
"username": "string",
"name": "string",
"followers_count": 0,
"verified": true,
"profile_picture_url": "string",
"source": "string"
}
CreatorLookupItem
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| ig_user_id | string | true | none | none |
| username | string | true | none | none |
| name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| followers_count | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| verified | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | boolean | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| profile_picture_url | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| source | string | true | none | none |
CreatorLookupResponse
{
"suggestions": [
{
"ig_user_id": "string",
"username": "string",
"name": "string",
"followers_count": 0,
"verified": true,
"profile_picture_url": "string",
"source": "string"
}
]
}
CreatorLookupResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| suggestions | [CreatorLookupItem] | false | none | none |
CreatorMessageDraft
{
"id": 0,
"conversation_id": 0,
"content_type": "string",
"text_content": "string",
"payload": {},
"created_at": "string",
"expires_at": "string",
"created_by_api_key_id": 0
}
CreatorMessageDraft
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| id | integer | true | none | none |
| conversation_id | integer | true | none | none |
| content_type | string | true | none | 'text' |
| text_content | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| payload | object | false | none | none |
| created_at | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| expires_at | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| created_by_api_key_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
CreatorMessageItem
{
"id": 0,
"sender": "string",
"content_type": "string",
"text": "string",
"sent_at": "string",
"sent_via": "string",
"image": {
"url": "string",
"width": 0,
"height": 0
},
"product_card": {
"product_id": "string",
"product_name": "string",
"image_url": "string"
},
"target_collaboration_card": {
"invitation_group_id": "string"
},
"free_sample_card": {
"apply_id": "string"
},
"crm_text_with_image_card": {
"title": "string",
"content": "string",
"url": "string"
},
"crm_text_with_products_card": {
"title": "string",
"content": "string",
"products": [
{
"product_id": "string",
"product_name": "string",
"image_url": "string"
}
]
}
}
CreatorMessageItem
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| id | integer | true | none | none |
| sender | string | true | none | 'creator' (inbound) or 'shop' (outbound). |
| content_type | string | true | none | none |
| text | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sent_at | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sent_via | any | false | none | For shop messages sent through Reacher: 'inbox' (a person in the Reacher inbox), 'api' (a Public API key) or 'mcp' (an agent through the MCP connector). Null for creator messages and history synced from TikTok. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| image | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | ImageContent | false | none | Image-specific content fields. |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_card | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | ProductCardContent | false | none | Product card-specific content fields. |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| target_collaboration_card | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | TargetCollaborationCardContent | false | none | Target collaboration card-specific content fields. |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| free_sample_card | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | FreeSampleCardContent | false | none | Free sample card-specific content fields. |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| crm_text_with_image_card | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | CrmTextWithImageCardContent | false | none | CRM text with image card content fields. |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| crm_text_with_products_card | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | CrmTextWithProductsCardContent | false | none | CRM text with products card content fields. |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
CreatorMessageStatsResponse
{
"total_conversations": 0,
"unread_conversations": 0,
"unreplied_conversations": 0,
"unread_messages": 0,
"has_data": true
}
CreatorMessageStatsResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| total_conversations | integer | true | none | Total conversations with message data for the shop. |
| unread_conversations | integer | true | none | Conversations with at least one unread message. |
| unreplied_conversations | integer | true | none | Conversations whose last message was from the creator (awaiting a shop reply). |
| unread_messages | integer | true | none | SUM of unread messages across all conversations — the total unread badge number. Distinct from unread_conversations. |
| has_data | boolean | true | none | True if the shop has any conversation with message data. |
CreatorMessagesResponse
{
"creator_handle": "string",
"data": [
{
"id": 0,
"sender": "string",
"content_type": "string",
"text": "string",
"sent_at": "string",
"sent_via": "string",
"image": {
"url": "string",
"width": 0,
"height": 0
},
"product_card": {
"product_id": "string",
"product_name": "string",
"image_url": "string"
},
"target_collaboration_card": {
"invitation_group_id": "string"
},
"free_sample_card": {
"apply_id": "string"
},
"crm_text_with_image_card": {
"title": "string",
"content": "string",
"url": "string"
},
"crm_text_with_products_card": {
"title": "string",
"content": "string",
"products": [
{
"product_id": "string",
"product_name": "string",
"image_url": "string"
}
]
}
}
],
"page": 0,
"has_more": true,
"page_size": 0,
"total_count": 0,
"total_pages": 0,
"has_previous": false
}
CreatorMessagesResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_handle | string | true | none | none |
| data | [CreatorMessageItem] | true | none | [A single creator-conversation message. The text field is populated for plain-text messages. For richer types(image, product card, target-collab card, free-sample card, CRM cards) the matching nested object below carries the type-specific payload — only the one matching content_type is populated; the rest are null.AI agents need these payloads to understand what was actually sent (image URL, product_id, invitation_group_id, etc.); without them a non-text content_type leaves the caller blind.] |
| page | integer | true | none | none |
| has_more | boolean | true | none | none |
| page_size | integer | false | none | Messages per page (fixed at 20 on this surface). |
| total_count | integer | false | none | Total messages in the conversation thread. |
| total_pages | integer | false | none | Total pages available. |
| has_previous | boolean | false | none | True when page > 1 and there is data. |
CreatorPerformanceItem
{
"creator_id": "string",
"creator_handle": "string",
"gmv": 0,
"units_sold": 0,
"order_count": 0,
"est_commission": 0,
"follower_count": 0
}
CreatorPerformanceItem
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_id | string | true | none | none |
| creator_handle | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| gmv | any | false | none | GMV earned in the date range (not lifetime) |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| units_sold | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| order_count | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| est_commission | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| follower_count | any | false | none | Latest follower count in the period |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
CreatorPerformanceRequest
{
"page": 1,
"page_size": 50,
"sort_by": "gmv",
"sort_dir": "asc",
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"creator_handle": "string",
"min_gmv": 0
}
CreatorPerformanceRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| page | integer | false | none | none |
| page_size | integer | false | none | none |
| sort_by | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sort_dir | string | false | none | none |
| start_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_handle | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| min_gmv | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | gmv |
| anonymous | units_sold |
| anonymous | order_count |
| anonymous | est_commission |
| anonymous | follower_count |
| sort_dir | asc |
| sort_dir | desc |
CreatorPerformanceResponse
{
"data": [
{
"creator_id": "string",
"creator_handle": "string",
"gmv": 0,
"units_sold": 0,
"order_count": 0,
"est_commission": 0,
"follower_count": 0
}
],
"currency": "string",
"pagination": null,
"date_range": {
"start_date": "string",
"end_date": "string"
},
"shops_queried": [
"string"
]
}
CreatorPerformanceResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | [CreatorPerformanceItem] | true | none | [Creator with period-specific metrics from creator_info (daily table).] |
| currency | string | true | none | none |
| pagination | any | true | none | none |
| date_range | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | DateRange | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shops_queried | any | false | none | Shop names included when querying multiple shops (x-shop-id: all or comma-separated). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
CreatorProductItem
{
"product_id": "string",
"product_title": "string",
"commission_rate": 0,
"shop_units_sold": 0,
"shop_gmv": 0,
"status": "string"
}
CreatorProductItem
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_id | string | true | none | none |
| product_title | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| commission_rate | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_units_sold | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_gmv | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| status | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
CreatorProductsPaginatedResponse
{
"data": [
{
"product_id": "string",
"product_title": "string",
"commission_rate": 0,
"shop_units_sold": 0,
"shop_gmv": 0,
"status": "string"
}
],
"currency": "string",
"pagination": null,
"shops_queried": [
"string"
]
}
CreatorProductsPaginatedResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | [CreatorProductItem] | true | none | none |
| currency | string | true | none | none |
| pagination | any | true | none | none |
| shops_queried | any | false | none | Shop names included when querying multiple shops (x-shop-id: all or comma-separated). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
CreatorProductsRequest
{
"page": 1,
"page_size": 50
}
CreatorProductsRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| page | integer | false | none | none |
| page_size | integer | false | none | none |
CreatorReplyDryRunResponse
{
"dry_run": true,
"would_send_to": "string",
"message": "string"
}
CreatorReplyDryRunResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| dry_run | boolean | false | none | none |
| would_send_to | string | true | none | none |
| message | string | true | none | none |
CreatorReplyImageDryRunResponse
{
"dry_run": true,
"would_send_to": "string",
"image_url": "string"
}
CreatorReplyImageDryRunResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| dry_run | boolean | false | none | none |
| would_send_to | string | true | none | none |
| image_url | string | true | none | none |
CreatorReplyImageInfo
{
"url": "string",
"width": 0,
"height": 0
}
CreatorReplyImageInfo
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| url | string | true | none | none |
| width | integer | false | none | none |
| height | integer | false | none | none |
CreatorReplyImageRequest
{
"image_url": "stringstri"
}
CreatorReplyImageRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| image_url | string | true | none | HTTPS URL of an image to forward to the creator. We fetch it server-side (must resolve to a public IP, return Content-Type image/*, ≤ 5 MB), then upload to TikTok and dispatch. |
CreatorReplyImageResponse
{
"conversation_id": 0,
"message_id": 0,
"message_index": 0,
"sent_at": "string",
"image": {
"url": "string",
"width": 0,
"height": 0
},
"dry_run": false
}
CreatorReplyImageResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| conversation_id | integer | true | none | none |
| message_id | integer | true | none | none |
| message_index | integer | true | none | none |
| sent_at | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| image | CreatorReplyImageInfo | true | none | none |
| dry_run | boolean | false | none | none |
CreatorReplyProductDryRunResponse
{
"dry_run": true,
"would_send_to": "string",
"product_id": "string"
}
CreatorReplyProductDryRunResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| dry_run | boolean | false | none | none |
| would_send_to | string | true | none | none |
| product_id | string | true | none | none |
CreatorReplyProductRequest
{
"product_id": "string"
}
CreatorReplyProductRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_id | string | true | none | A TikTok product_id from THIS shop's catalog. Sending another shop's product_id is rejected with 400. |
CreatorReplyProductResponse
{
"conversation_id": 0,
"message_id": 0,
"message_index": 0,
"sent_at": "string",
"product_id": "string",
"dry_run": false
}
CreatorReplyProductResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| conversation_id | integer | true | none | none |
| message_id | integer | true | none | none |
| message_index | integer | true | none | none |
| sent_at | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_id | string | true | none | none |
| dry_run | boolean | false | none | none |
CreatorReplyRequest
{
"message": "string"
}
CreatorReplyRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| message | string | true | none | Plain-text reply body to send to the creator. |
CreatorReplyResponse
{
"conversation_id": 0,
"message_id": 0,
"message_index": 0,
"text": "string",
"sent_at": "string",
"dry_run": false
}
CreatorReplyResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| conversation_id | integer | true | none | none |
| message_id | integer | true | none | none |
| message_index | integer | true | none | none |
| text | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sent_at | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| dry_run | boolean | false | none | none |
CreatorSource
"my_community"
CreatorSource
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| CreatorSource | string | false | none | How creators are sourced for a campaign. |
Enumerated Values
| Property | Value |
|---|---|
| CreatorSource | my_community |
| CreatorSource | social_army |
CreatorStateChangeResponse
{
"success": true,
"code": "ok",
"data": {}
}
CreatorStateChangeResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| success | boolean | true | none | none |
| code | string | false | none | none |
| data | object | false | none | none |
CreatorStatus
"pending"
CreatorStatus
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| CreatorStatus | string | false | none | Lifecycle status of a creator within a campaign. |
Enumerated Values
| Property | Value |
|---|---|
| CreatorStatus | pending |
| CreatorStatus | invited |
| CreatorStatus | applied |
| CreatorStatus | active |
| CreatorStatus | rejected |
| CreatorStatus | Paid/Settled |
| CreatorStatus | archived |
| CreatorStatus | completed |
| CreatorStatus | removed |
CreatorTrendSeries
{
"affiliate_gmv": [
0
],
"video_gmv": [
0
],
"videos_posted": [
0
],
"total_video_views": [
0
],
"units_sold": [
0
],
"commission": [
0
]
}
CreatorTrendSeries
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| affiliate_gmv | [number] | true | none | none |
| video_gmv | [number] | true | none | none |
| videos_posted | [integer] | true | none | none |
| total_video_views | [integer] | true | none | none |
| units_sold | [integer] | true | none | none |
| commission | [number] | true | none | none |
CreatorTrendsRequest
{
"creator_handles": [
"string"
],
"start_date": "2019-08-24",
"end_date": "2019-08-24"
}
CreatorTrendsRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_handles | [string] | true | none | Creator handles to fetch series for. Max 100 per call — this mirrors the internal per-page cap and keeps the response bounded. Handles that don't resolve in this shop are reported in unresolved_handles. |
| start_date | any | false | none | Window start (inclusive). Omit for a trailing 28-day window ending at end_date. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_date | any | false | none | Window end (inclusive). Defaults to today. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
CreatorTrendsResponse
{
"data": {
"property1": {
"affiliate_gmv": [
0
],
"video_gmv": [
0
],
"videos_posted": [
0
],
"total_video_views": [
0
],
"units_sold": [
0
],
"commission": [
0
]
},
"property2": {
"affiliate_gmv": [
0
],
"video_gmv": [
0
],
"videos_posted": [
0
],
"total_video_views": [
0
],
"units_sold": [
0
],
"commission": [
0
]
}
},
"days": [
"string"
],
"unresolved_handles": [
"string"
],
"currency": "string",
"date_range": {
"start_date": "string",
"end_date": "string"
}
}
CreatorTrendsResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | object | true | none | Keyed by creator handle. Creators with no activity are zero-filled, not omitted. |
| » additionalProperties | CreatorTrendSeries | false | none | Six parallel daily series. Every array has one entry per day in the window, ordered oldest → newest, aligned positionally with days. |
| days | [string] | true | none | ISO date axis for every series in data. |
| unresolved_handles | [string] | false | none | Requested handles with no creator record in this shop. Absent from data. |
| currency | string | true | none | none |
| date_range | ResolvedDateRange | true | none | The window the server actually used, after defaults were applied. |
CreatorVideosRequest
{
"page": 1,
"page_size": 50,
"sort_by": "video_gmv",
"sort_dir": "asc",
"start_date": "2019-08-24",
"end_date": "2019-08-24"
}
CreatorVideosRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| page | integer | false | none | none |
| page_size | integer | false | none | none |
| sort_by | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sort_dir | string | false | none | none |
| start_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | video_gmv |
| anonymous | views |
| anonymous | units_sold |
| anonymous | posted_date |
| anonymous | like_count |
| sort_dir | asc |
| sort_dir | desc |
CreatorsListPaginatedResponse
{
"data": [
{
"creator_handle": "string",
"follower_count": 0,
"status": "string",
"shop_gmv": 0,
"overall_gmv": 0,
"creator_level": "string",
"overall_fulfillment_rate": 0,
"shop_units_sold": 0,
"shop_video_count": 0,
"video_views": 0,
"sample_received": 0,
"commission_rate": 0,
"est_commission": 0,
"fulfillment_rate": 0,
"tags": [
"string"
],
"product_id": "string",
"product_title": "string",
"updated_at": "string",
"created_at": "string"
}
],
"currency": "string",
"pagination": null,
"date_range": {
"start_date": "string",
"end_date": "string"
},
"shops_queried": [
"string"
]
}
CreatorsListPaginatedResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | [CreatorListItem] | true | none | none |
| currency | string | true | none | none |
| pagination | any | true | none | none |
| date_range | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | DateRange | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shops_queried | any | false | none | Shop names included when querying multiple shops (x-shop-id: all or comma-separated). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
CreatorsListRequest
{
"page": 1,
"page_size": 50,
"sort_by": "shop_gmv",
"sort_dir": "asc",
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"status": "string",
"creator_handle": "string",
"min_shop_gmv": 0,
"min_overall_gmv": 0,
"min_videos": 0,
"min_followers": 0,
"group_id": "string",
"tags": [
"string"
],
"product_id": "string"
}
CreatorsListRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| page | integer | false | none | none |
| page_size | integer | false | none | none |
| sort_by | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sort_dir | string | false | none | none |
| start_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| status | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_handle | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| min_shop_gmv | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| min_overall_gmv | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| min_videos | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| min_followers | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| group_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| tags | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | shop_gmv |
| anonymous | follower_count |
| anonymous | shop_video_count |
| anonymous | shop_units_sold |
| anonymous | video_views |
| anonymous | updated_at |
| anonymous | created_at |
| sort_dir | asc |
| sort_dir | desc |
CreatorsSummaryRequest
{
"start_date": "2019-08-24",
"end_date": "2019-08-24"
}
CreatorsSummaryRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| start_date | any | false | none | Window start (inclusive). Omit for a trailing 28-day window ending at end_date. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_date | any | false | none | Window end (inclusive). Defaults to today. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
CreatorsSummaryResponse
{
"data": {
"new_creators": 0,
"gmv_generated": 0,
"video_posts": 0,
"orders": 0
},
"currency": "string",
"date_range": {
"start_date": "string",
"end_date": "string"
}
}
CreatorsSummaryResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | CreatorsSummaryTotals | true | none | none |
| currency | string | true | none | none |
| date_range | ResolvedDateRange | true | none | The window the server actually used, after defaults were applied. |
CreatorsSummaryTotals
{
"new_creators": 0,
"gmv_generated": 0,
"video_posts": 0,
"orders": 0
}
CreatorsSummaryTotals
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| new_creators | integer | true | none | Creators whose first-ever CRM record falls inside the window. |
| gmv_generated | number | true | none | Affiliate-attributed GMV earned in the window. |
| video_posts | integer | true | none | Distinct videos posted in the window. |
| orders | integer | true | none | Affiliate orders placed in the window. |
CreatorsToExclude
{
"list_upload": [
"string"
],
"lists_selected": [
"string"
],
"crm_groups": [
"string"
],
"exclude_previously_messaged": false
}
CreatorsToExclude
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| list_upload | [string] | false | none | none |
| lists_selected | [string] | false | none | none |
| crm_groups | [string] | false | none | UUIDs of existing CRM Groups whose current members should be excluded. Use GET /crm-groups to discover. |
| exclude_previously_messaged | boolean | false | none | Skip creators this shop has DM'd before in any prior automation. Maps to config.exclude_previously_messaged. |
CreatorsToInclude
{
"list_upload": [
"string"
],
"lists_selected": [
"string"
],
"filters": {
"product_categories": [
"string"
],
"follower_count": {
"min": 0,
"max": 0
},
"creator_ethnicity": [
"string"
],
"gender": [
"string"
],
"age_range": [
"string"
],
"languages": [
"string"
],
"community": [
"string"
],
"gmv": {
"min": 0,
"max": 0
},
"units_sold": {
"min": 0,
"max": 0
},
"average_views": {
"min": 0,
"max": 0
},
"engagement_rate": {
"min": 0,
"max": 0
},
"post_rate": {
"min": 0,
"max": 0
},
"video_gpm": {
"min": 0,
"max": 0
},
"live_gpm": {
"min": 0,
"max": 0
},
"follower_age": [
"string"
],
"follower_gender": [
"string"
],
"face_visibility": [
"string"
],
"content_style": [
"string"
],
"production_quality": [
"string"
],
"personality_tone": [
"string"
],
"body_type": [
"string"
],
"hair_type": [
"string"
]
},
"crm_group_id": "string",
"crm_group_entered_after": "2019-08-24",
"crm_group_entered_before": "2019-08-24"
}
CreatorsToInclude
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| list_upload | [string] | false | none | Ad-hoc creator handles (TikTok @-names) to include in this automation only. NOT persisted as a Lists row. |
| lists_selected | [string] | false | none | IDs of existing Lists (vault_files.resource_id) whose creators should be included. Use POST /lists to upload reusable lists. |
| filters | any | false | none | Dynamic creator selection by attribute. When set, the parent automation's is_evergreen=true flag re-evaluates the filter on every run. Mutually exclusive with list_upload/lists_selected and crm_group_id. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | CreatorFilters | false | none | Dynamic creator selection by attribute. When is_evergreen=true onthe parent automation, the filter is re-evaluated on every run. Mirrors the portal's "Filters" tab (formDataTransformer.ts:735-824 buildFilters for the legacy config.Filters shape, andbuildAISearchFilters for the AI-search variant). The translatorsplits AI-only fields out into config.ai_search_filters and setsconfig.uses_ai_filters=true accordingly.All fields are optional — set only the ones you care about. An empty CreatorFilters({}) is invalid (use lists mode instead). |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| crm_group_id | any | false | none | Single CRM group ID (UUID string). Membership is dynamic — the runtime re-evaluates on every send. Mutually exclusive with the other two modes. Use GET /crm-groups to discover available groups (returns the canonical IDs to pass here). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| crm_group_entered_after | any | false | none | Optional CRM-group filter — only include members who entered the group ON or AFTER this date. Ignored unless crm_group_id is set. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| crm_group_entered_before | any | false | none | Optional CRM-group filter — only include members who entered the group ON or BEFORE this date. Ignored unless crm_group_id is set. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
CrmContentItem
{
"content_id": "string",
"creator_id": "string",
"product_id": "string",
"content_type": "string",
"content_desc": "string",
"content_url": "string",
"thumbnail_url": "string",
"views": 0,
"likes": 0,
"comments": 0,
"paid_orders_count": 0,
"posted_time": "2019-08-24T14:15:22Z"
}
CrmContentItem
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| content_id | string | true | none | Video id; joins shop_video_gmv.video_id. |
| creator_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| content_type | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| content_desc | any | false | none | Caption. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| content_url | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| thumbnail_url | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| views | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| likes | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| comments | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| paid_orders_count | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| posted_time | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date-time) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
CrmContentResponse
{
"data": [
{
"content_id": "string",
"creator_id": "string",
"product_id": "string",
"content_type": "string",
"content_desc": "string",
"content_url": "string",
"thumbnail_url": "string",
"views": 0,
"likes": 0,
"comments": 0,
"paid_orders_count": 0,
"posted_time": "2019-08-24T14:15:22Z"
}
],
"pagination": {
"total_count": 0,
"page": 0,
"page_size": 0,
"total_pages": 0
}
}
CrmContentResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | [CrmContentItem] | true | none | [One piece of content a creator posted for a product.] |
| pagination | public_api__core__pagination__PaginationMeta | true | none | Pagination metadata returned in responses. |
CrmCreatorDetailData
{
"creator_id": "string",
"creator_name": "string",
"handle": "string",
"avatar_url": "string",
"tiktok_url": "string",
"tags": [
"string"
],
"follower_num": 0,
"creator_level": "string",
"shop_gmv": 0,
"affiliate_gmv_28d": 0,
"creator_gmv": 0,
"has_shop_data": true,
"top_products": [
{}
],
"shop_performance": {},
"affiliate_performance": {},
"sales_metrics": {},
"groups": [
{}
]
}
CrmCreatorDetailData
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_id | string | true | none | none |
| creator_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| handle | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| avatar_url | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| tiktok_url | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| tags | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| follower_num | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_level | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_gmv | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| affiliate_gmv_28d | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_gmv | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| has_shop_data | boolean | false | none | Whether this shop has any record of the creator — a sample request, posted content, an affiliate sale or a live session. false means the handle resolved only off the fleet-wide creator registry, so every shop-scoped figure below is structurally empty rather than genuinely zero. Distinguishes 'no relationship with this shop' from 'related, but nothing has happened yet'. |
| top_products | [object] | false | none | none |
| shop_performance | object | false | none | none |
| affiliate_performance | object | false | none | none |
| sales_metrics | object | false | none | none |
| groups | [object] | false | none | none |
CrmCreatorDetailResponse
{
"data": {
"creator_id": "string",
"creator_name": "string",
"handle": "string",
"avatar_url": "string",
"tiktok_url": "string",
"tags": [
"string"
],
"follower_num": 0,
"creator_level": "string",
"shop_gmv": 0,
"affiliate_gmv_28d": 0,
"creator_gmv": 0,
"has_shop_data": true,
"top_products": [
{}
],
"shop_performance": {},
"affiliate_performance": {},
"sales_metrics": {},
"groups": [
{}
]
}
}
CrmCreatorDetailResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | CrmCreatorDetailData | true | none | Creator Profile drawer: identity + shop/affiliate performance. |
CrmGroupCondition
{
"field": "string",
"operator": "string",
"value": null,
"value_count": 0
}
CrmGroupCondition
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| field | string | true | none | e.g. 'status', 'products', 'shop_gmv'. |
| operator | string | true | none | e.g. 'is_one_of', 'gte'. |
| value | any | true | none | none |
| value_count | any | false | none | Set only when value is a long list that has been sampled down. It is the true length; value holds the first 50 entries. Groups built from a dashboard segment store their whole membership inline, so this is common on those. Read the group's creator_count for its size, not len(value). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
CrmGroupFromSegmentRequest
{
"group_name": "string",
"tier": "string",
"automation_id": 1,
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"group_tags": [
"string"
]
}
CrmGroupFromSegmentRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| group_name | string | true | none | Name for the new group. Creation upserts by (shop, group_name) — reusing a name overwrites that group's definition and re-materializes its members. |
| tier | any | false | none | GMV tier code to narrow the segment, e.g. 'L3'. Omit for all tiers. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| automation_id | any | false | none | Restrict the segment to creators reached by this automation. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| start_date | any | false | none | Segment window start (inclusive). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_date | any | false | none | Segment window end (inclusive). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| group_tags | any | false | none | Optional tags to attach to the group. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
CrmGroupFromSegmentResponse
{
"data": {
"crm_group_id": "string",
"name": "string",
"creator_count": 0,
"handles_resolved": 0,
"group_tags": [
"string"
]
},
"dry_run": true
}
CrmGroupFromSegmentResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | CrmGroupFromSegmentResult | true | none | none |
| dry_run | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | boolean | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
CrmGroupFromSegmentResult
{
"crm_group_id": "string",
"name": "string",
"creator_count": 0,
"handles_resolved": 0,
"group_tags": [
"string"
]
}
CrmGroupFromSegmentResult
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| crm_group_id | any | false | none | UUID of the created group. Null on a dry run. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| name | string | true | none | none |
| creator_count | integer | true | none | Creators actually materialized into the group — those that mapped to a CRM record. This is the group's real size. |
| handles_resolved | integer | true | none | Creators the segment matched before CRM mapping. Always >= creator_count; the gap between the two is the drop-off from creators that have no CRM record (DM-only and organic creators cannot be grouped). |
| group_tags | [string] | false | none | none |
CrmGroupResource
{
"crm_group_id": "string",
"name": "string",
"description": "string",
"conditions": [
{
"field": "string",
"operator": "string",
"value": null,
"value_count": 0
}
],
"creator_count": 0,
"last_synced_at": "string",
"members_last_changed_at": "string"
}
CrmGroupResource
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| crm_group_id | string | true | none | UUID — stable across creator membership changes. |
| name | string | true | none | none |
| description | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| conditions | [CrmGroupCondition] | false | none | Filter conditions joined with AND. Membership semantics depend on how the group was built: filter-built groups are dynamic and creators flow in/out as their attributes change, while groups created from a dashboard segment (POST /crm-groups/from-segment) are snapshots whose members were fixed at creation. A single creatorNames condition is the signal for the latter. |
| creator_count | integer | true | none | Current member count. |
| last_synced_at | any | false | none | Group DEFINITION write time (crm_groups.updated_at), NOT a membership evaluation — it can be far older than the members (an edit doesn't even bump it). For membership freshness read members_last_changed_at. Kept for backward-compat. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| members_last_changed_at | any | false | none | When a creator most recently entered this group (MAX crm_creator_group_mappings.added_date) — the freshness signal the portal shows. Null if the group has no members. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
CrmGroupResponse
{
"data": {
"crm_group_id": "string",
"name": "string",
"description": "string",
"conditions": [
{
"field": "string",
"operator": "string",
"value": null,
"value_count": 0
}
],
"creator_count": 0,
"last_synced_at": "string",
"members_last_changed_at": "string"
}
}
CrmGroupResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | CrmGroupResource | true | none | none |
CrmGroupsPaginatedResponse
{
"data": [
{
"crm_group_id": "string",
"name": "string",
"description": "string",
"conditions": [
{
"field": "string",
"operator": "string",
"value": null,
"value_count": 0
}
],
"creator_count": 0,
"last_synced_at": "string",
"members_last_changed_at": "string"
}
],
"pagination": null
}
CrmGroupsPaginatedResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | [CrmGroupResource] | true | none | none |
| pagination | any | true | none | none |
CrmProductCardItem
{
"product_id": "string",
"product_name": "string",
"image_url": "string"
}
CrmProductCardItem
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_id | string | true | none | none |
| product_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| image_url | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
CrmRosterCreator
{
"id": "string",
"creator_id": "string",
"creator_name": "string",
"avatar_url": "string",
"follower_num": 0,
"tags": [
"string"
],
"bio": "string",
"categories": [
"string"
],
"curr_status": "string",
"status": "string",
"expired_in": 0,
"fulfillment_status": 0,
"fulfillment_rate": 0,
"sample_received_num": 0,
"product_id": "string",
"product_title": "string",
"sku_id": "string",
"sku_left_num": 0,
"gmv": 0,
"creator_gmv": 0,
"video_gmv": 0,
"affiliate_gmv_28d": 0,
"refund_gmv": 0,
"commission": 0,
"commission_rate": 0,
"estimate_commission": 0,
"units_sold": 0,
"item_sold": 0,
"refund_item_sold": 0,
"product_sold": 0,
"video_num": 0,
"live_num": 0,
"videos_posted": 0,
"total_video_views": 0,
"content_video_views": 0,
"avg_views": 0,
"engagement_rate": 0,
"video_release_date": "2019-08-24T14:15:22Z",
"video_url": "string",
"updated_at": "2019-08-24T14:15:22Z",
"products": [
{
"product_id": "string",
"product_title": "string",
"sku_image": "string",
"status": "string",
"requested_date": "string",
"expires_in": 0,
"quantity": 0
}
]
}
CrmRosterCreator
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| id | any | false | none | CRM row id — {creator_id}-{product_id}-{shop_id}. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_name | any | false | none | Public TikTok handle. Never the creator's real name. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| avatar_url | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| follower_num | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| tags | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| bio | any | false | none | The creator's TikTok profile bio/signature text. Null when not scraped for this creator. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| categories | any | false | none | Broad TikTok Shop product categories the creator has sold across (the whole set, not a single niche/content label). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| curr_status | any | false | none | Sample/collaboration status as a display label (e.g. Content Pending) — the upstream roster already resolves the raw TikTok code before it reaches this surface. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| status | any | false | none | Alias of curr_status, kept for caller convenience. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| expired_in | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| fulfillment_status | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| fulfillment_rate | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sample_received_num | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_title | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sku_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sku_left_num | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| gmv | any | false | none | Lifetime GMV this creator drove for this shop. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_gmv | any | false | none | The creator's total GMV across all shops. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video_gmv | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| affiliate_gmv_28d | any | false | none | Trailing-28-day affiliate GMV. Null when the shop has no affiliate ledger — deliberately not zero-filled. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| refund_gmv | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| commission | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| commission_rate | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| estimate_commission | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| units_sold | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| item_sold | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| refund_item_sold | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_sold | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video_num | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| live_num | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| videos_posted | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| total_video_views | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| content_video_views | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| avg_views | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| engagement_rate | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video_release_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date-time) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video_url | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| updated_at | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date-time) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| products | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [CrmRosterProduct] | false | none | [A product the creator is (or was) collaborating on.] |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
CrmRosterProduct
{
"product_id": "string",
"product_title": "string",
"sku_image": "string",
"status": "string",
"requested_date": "string",
"expires_in": 0,
"quantity": 0
}
CrmRosterProduct
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_id | string | true | none | none |
| product_title | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sku_image | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| status | any | false | none | Display status label for this creator × product. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| requested_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| expires_in | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| quantity | any | false | none | Remaining sample stock for the SKU (sku_left_num). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
CrmRosterResponse
{
"data": [
{
"id": "string",
"creator_id": "string",
"creator_name": "string",
"avatar_url": "string",
"follower_num": 0,
"tags": [
"string"
],
"bio": "string",
"categories": [
"string"
],
"curr_status": "string",
"status": "string",
"expired_in": 0,
"fulfillment_status": 0,
"fulfillment_rate": 0,
"sample_received_num": 0,
"product_id": "string",
"product_title": "string",
"sku_id": "string",
"sku_left_num": 0,
"gmv": 0,
"creator_gmv": 0,
"video_gmv": 0,
"affiliate_gmv_28d": 0,
"refund_gmv": 0,
"commission": 0,
"commission_rate": 0,
"estimate_commission": 0,
"units_sold": 0,
"item_sold": 0,
"refund_item_sold": 0,
"product_sold": 0,
"video_num": 0,
"live_num": 0,
"videos_posted": 0,
"total_video_views": 0,
"content_video_views": 0,
"avg_views": 0,
"engagement_rate": 0,
"video_release_date": "2019-08-24T14:15:22Z",
"video_url": "string",
"updated_at": "2019-08-24T14:15:22Z",
"products": [
{
"product_id": "string",
"product_title": "string",
"sku_image": "string",
"status": "string",
"requested_date": "string",
"expires_in": 0,
"quantity": 0
}
]
}
],
"pagination": {
"total_count": 0,
"page": 0,
"page_size": 0,
"total_pages": 0
}
}
CrmRosterResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | [CrmRosterCreator] | true | none | [One roster row: the surviving (creator × product) record per creator.] |
| pagination | public_api__core__pagination__PaginationMeta | true | none | Pagination metadata returned in responses. |
CrmStatusHistoryResponse
{
"data": [
{
"product_id": "string",
"previous_status": "string",
"previous_status_label": "string",
"new_status": "string",
"new_status_label": "string",
"transition_detected_at": "2019-08-24T14:15:22Z"
}
],
"pagination": {
"total_count": 0,
"page": 0,
"page_size": 0,
"total_pages": 0
}
}
CrmStatusHistoryResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | [CrmStatusTransition] | true | none | [One observed status change for a (creator, product) pair.] |
| pagination | public_api__core__pagination__PaginationMeta | true | none | Pagination metadata returned in responses. |
CrmStatusTransition
{
"product_id": "string",
"previous_status": "string",
"previous_status_label": "string",
"new_status": "string",
"new_status_label": "string",
"transition_detected_at": "2019-08-24T14:15:22Z"
}
CrmStatusTransition
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| previous_status | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| previous_status_label | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| new_status | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| new_status_label | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| transition_detected_at | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date-time) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
CrmTagsAddRequest
{
"creator_ids": [
"string"
],
"tags": [
"string"
]
}
CrmTagsAddRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_ids | [string] | true | none | Creator identifiers from the CRM roster (GET /crm/creators → creator_id). Tags apply to every product-row of each creator. Max 1000 per request. |
| tags | [string] | true | none | Tags to add. Re-adding a tag a creator already has is a no-op. Max 50 tags per request; per-tag and total-byte limits are enforced server-side. |
CrmTagsRemoveRequest
{
"creator_ids": [
"string"
],
"tags": [
"string"
],
"all_tags": false
}
CrmTagsRemoveRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_ids | [string] | true | none | Creator identifiers from the CRM roster (GET /crm/creators → creator_id). Max 1000 per request. |
| tags | [string] | false | none | Tags to remove. Ignored when all_tags is true. |
| all_tags | boolean | false | none | Remove EVERY tag from the named creators (ignores tags). |
CrmTagsWriteResponse
{
"data": {
"operation": "string",
"creators_updated": 0,
"tags": [
"string"
],
"all_tags": false
}
}
CrmTagsWriteResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | CrmTagsWriteResult | true | none | none |
CrmTagsWriteResult
{
"operation": "string",
"creators_updated": 0,
"tags": [
"string"
],
"all_tags": false
}
CrmTagsWriteResult
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| operation | string | true | none | Either "add" or "remove". |
| creators_updated | integer | true | none | Number of creator rows whose tag set actually changed. Adding a tag a creator already has, or removing one it doesn't have, is a no-op and is not counted — so this can be less than the number of creator_ids sent (including 0 when nothing changed). |
| tags | [string] | false | none | The tags that were added/removed (empty when all_tags was used). |
| all_tags | boolean | false | none | True if every tag was removed (remove only). |
CrmTextWithImageCardContent
{
"title": "string",
"content": "string",
"url": "string"
}
CrmTextWithImageCardContent
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| title | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| content | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| url | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
CrmTextWithProductsCardContent
{
"title": "string",
"content": "string",
"products": [
{
"product_id": "string",
"product_name": "string",
"image_url": "string"
}
]
}
CrmTextWithProductsCardContent
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| title | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| content | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| products | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [CrmProductCardItem] | false | none | [Single product within a CRM text with products card.] |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
DataFreshness
{
"lastSyncedAt": "string",
"isStale": false,
"isRefreshing": false
}
DataFreshness
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| lastSyncedAt | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| isStale | boolean | false | none | none |
| isRefreshing | boolean | false | none | none |
DateRange
{
"start_date": "string",
"end_date": "string"
}
DateRange
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| start_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
DeleteProfileResponse
{
"success": true,
"message": "string"
}
DeleteProfileResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| success | boolean | true | none | none |
| message | string | true | none | none |
DepositHistoryItem
{
"date": "string",
"amount": "string"
}
DepositHistoryItem
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| date | string | true | none | ISO 8601 at midnight, e.g. 2026-09-12T00:00:00. |
| amount | string | true | none | Amount in currency, e.g. "300.0". |
DepositHistoryResponse
{
"overview": {
"property1": {
"value": 0,
"description": "string"
},
"property2": {
"value": 0,
"description": "string"
}
},
"data": [
{
"date": "string",
"amount": "string"
}
],
"pagination": {
"page": 0,
"page_size": 0,
"total_count": 0,
"total_pages": 0
},
"currency": "USD"
}
DepositHistoryResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| overview | object | true | none | total_deposits — a bare number in currency. |
| » additionalProperties | OverviewMetric | false | none | A single metric displayed in a list endpoint's overview section. |
| data | [DepositHistoryItem] | true | none | [One wallet deposit in GET /campaigns/payments/deposits.] |
| pagination | PaginationMeta-Input | true | none | Pagination metadata returned in list responses. |
| currency | string | false | none | ISO 4217 code every amount in this response is denominated in. |
DepositIntentResponse
{
"session_id": "string",
"redirect_url": "string"
}
DepositIntentResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| session_id | string | true | none | Stripe Checkout session ID. |
| redirect_url | string | true | none | URL to redirect the user to in order to complete the deposit. No money moves until the user finishes Stripe's hosted checkout. |
DiscordAttachment
{
"filename": "string",
"content_type": "string",
"size_bytes": 0
}
DiscordAttachment
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| filename | string | true | none | none |
| content_type | string | true | none | none |
| size_bytes | integer | true | none | none |
DiscordChannelPublic
{
"id": "string",
"name": "string",
"type": 0,
"position": 0,
"parent_id": "string",
"parent_name": "string",
"can_post": true
}
DiscordChannelPublic
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| id | string | true | none | none |
| name | string | true | none | none |
| type | integer | true | none | 0 = text, 5 = announcement. |
| position | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| parent_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| parent_name | any | false | none | Category name, if any. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| can_post | boolean | true | none | Whether the bot can actually post here. |
DiscordChannelsPayload
{
"discord_guild_id": "string",
"channels": [
{
"id": "string",
"name": "string",
"type": 0,
"position": 0,
"parent_id": "string",
"parent_name": "string",
"can_post": true
}
]
}
DiscordChannelsPayload
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| discord_guild_id | string | true | none | none |
| channels | [DiscordChannelPublic] | false | none | [One postable Discord channel.] |
DiscordChannelsResponse
{
"data": {
"discord_guild_id": "string",
"channels": [
{
"id": "string",
"name": "string",
"type": 0,
"position": 0,
"parent_id": "string",
"parent_name": "string",
"can_post": true
}
]
}
}
DiscordChannelsResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | DiscordChannelsPayload | true | none | none |
DiscordDeleteResponse
{
"data": {
"ok": true,
"deleted_id": 0
},
"dry_run": false
}
DiscordDeleteResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | DiscordDeleteResult | true | none | none |
| dry_run | boolean | false | none | none |
DiscordDeleteResult
{
"ok": true,
"deleted_id": 0
}
DiscordDeleteResult
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| ok | boolean | true | none | none |
| deleted_id | integer | true | none | The id that was (or, on a dry run, would be) deleted. |
DiscordImage
{
"filename": "string",
"content_type": "string",
"data_base64": "string"
}
DiscordImage
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| filename | string | true | none | none |
| content_type | string | true | none | MIME type, e.g. image/png. Images + PDF/CSV/Excel/Word/txt. |
| data_base64 | string | true | none | The file's bytes, base64-encoded. Max 8MB decoded, ≤10 files per message. |
DiscordMessage
{
"id": 0,
"channel_id": "string",
"channel_name": "string",
"title": "string",
"content": "string",
"mention": {
"type": "none",
"role_id": "string"
},
"campaign_id": 0,
"attachments": [
{
"filename": "string",
"content_type": "string",
"size_bytes": 0
}
],
"sender": {
"type": "brand",
"user_id": "string",
"display_name": "string",
"avatar_url": "string"
},
"status": "string",
"scheduled_for": "2019-08-24T14:15:22Z",
"timezone": "string",
"recurrence": {
"frequency": "daily",
"end_type": "never",
"until": "2019-08-24",
"occurrences": 0
},
"paused": false,
"series_id": 0,
"occurrence_num": 0,
"occurrences_sent": 0,
"discord_message_id": "string",
"message_url": "string",
"sent_at": "2019-08-24T14:15:22Z",
"failure_reason": "string",
"failure_code": "string",
"audience_count": 0,
"reaction_count": 0,
"reply_count": 0,
"link_click_count": 0,
"upcoming_occurrences": [
"2019-08-24T14:15:22Z"
],
"created_at": "2019-08-24T14:15:22Z",
"updated_at": "2019-08-24T14:15:22Z"
}
DiscordMessage
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| id | integer | true | none | none |
| channel_id | string | true | none | none |
| channel_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| title | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| content | string | true | none | none |
| mention | MentionTarget | false | none | Who the announcement pings. role requires an explicit role_id. |
| campaign_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| attachments | [DiscordAttachment] | false | none | [One attachment on a message (the storage location stays internal).] |
| sender | any | false | none | Server member the post is shown as; null = the brand. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | SenderIdentity | false | none | Who the announcement appears to come from. The post is always made by the Reacher webhook; member only overrides thewebhook's display name + avatar for that one message (the APP badge stays). brand = the shop name, which is also what a NULL sender means on the row.On a request only user_id is trusted: the controller resolves it againstthe linked guild and takes display_name / avatar_url from Discord, so acaller cannot persist a fabricated identity. |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| status | string | true | none | scheduled, sending, sent, failed, or canceled. |
| scheduled_for | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date-time) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| timezone | string | true | none | none |
| recurrence | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | Recurrence | false | none | The parsed recurrence JSONB column / API contract.Parsed ONCE at the query-layer boundary ( parse_recurrence) so amalformed shape 400s at create time and can never blow up mid-dispatch. paused deliberately lives in its own column (the claim predicate mustmatch the partial index literally), so extra keys are ignored rather than rejected — legacy rows carrying paused in the blob still parse. |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| paused | boolean | false | none | none |
| series_id | any | false | none | Set on an occurrence of a recurring series. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| occurrence_num | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| occurrences_sent | integer | false | none | none |
| discord_message_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| message_url | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sent_at | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date-time) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| failure_reason | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| failure_code | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| audience_count | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| reaction_count | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| reply_count | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| link_click_count | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| upcoming_occurrences | any | false | none | Next fire times, on a recurring series' detail read. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| created_at | string(date-time) | true | none | none |
| updated_at | string(date-time) | true | none | none |
DiscordMessageCounts
{
"scheduled": 0,
"sent": 0,
"failed": 0
}
DiscordMessageCounts
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| scheduled | integer | false | none | none |
| sent | integer | false | none | none |
| failed | integer | false | none | none |
DiscordMessageCreateRequest
{
"channel_id": "string",
"content": "string",
"title": "string",
"mention": {
"type": "none",
"role_id": "string"
},
"scheduled_for": "2019-08-24T14:15:22Z",
"timezone": "string",
"recurrence": {
"frequency": "daily",
"end_type": "never",
"until": "2019-08-24",
"occurrences": 0
},
"campaign_id": 0,
"sender_user_id": "string",
"images": [
{
"filename": "string",
"content_type": "string",
"data_base64": "string"
}
]
}
DiscordMessageCreateRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| channel_id | string | true | none | Target Discord channel id. |
| content | string | true | none | Message body (≤ 2000 chars). |
| title | any | false | none | Optional bold header rendered above the body. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| mention | MentionTarget | false | none | Who to ping: none (default), here, everyone, or a role (needs role_id). |
| scheduled_for | any | false | none | When to post (ISO 8601). Omit to post immediately. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date-time) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| timezone | any | false | none | IANA tz for the schedule (defaults to the shop's). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| recurrence | any | false | none | Repeat the message. frequency is one of daily, weekdays, weekly, biweekly, monthly; end with end_type never / on (+until) / after (+occurrences). Requires scheduled_for as the first fire. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | Recurrence | false | none | The parsed recurrence JSONB column / API contract.Parsed ONCE at the query-layer boundary ( parse_recurrence) so amalformed shape 400s at create time and can never blow up mid-dispatch. paused deliberately lives in its own column (the claim predicate mustmatch the partial index literally), so extra keys are ignored rather than rejected — legacy rows carrying paused in the blob still parse. |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| campaign_id | any | false | none | Optional campaign to associate the post with. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sender_user_id | any | false | none | Discord user id of a member of the linked server to post AS — the message shows their server nickname and avatar instead of the brand's (Discord still marks it APP). Omit to post as the brand. Bots and non-members are rejected with 400. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| images | any | false | none | Up to 10 images / files to attach (e.g. a video-breakdown image), each base64-encoded and ≤ 8MB decoded. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [DiscordImage] | false | none | [An image / file to attach, sent inline as base64 (no upload step, no URL fetch — keeps the JSON contract MCP-callable and free of SSRF).] |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
DiscordMessageListResponse
{
"data": [
{
"id": 0,
"channel_id": "string",
"channel_name": "string",
"title": "string",
"content": "string",
"mention": {
"type": "none",
"role_id": "string"
},
"campaign_id": 0,
"attachments": [
{
"filename": "string",
"content_type": "string",
"size_bytes": 0
}
],
"sender": {
"type": "brand",
"user_id": "string",
"display_name": "string",
"avatar_url": "string"
},
"status": "string",
"scheduled_for": "2019-08-24T14:15:22Z",
"timezone": "string",
"recurrence": {
"frequency": "daily",
"end_type": "never",
"until": "2019-08-24",
"occurrences": 0
},
"paused": false,
"series_id": 0,
"occurrence_num": 0,
"occurrences_sent": 0,
"discord_message_id": "string",
"message_url": "string",
"sent_at": "2019-08-24T14:15:22Z",
"failure_reason": "string",
"failure_code": "string",
"audience_count": 0,
"reaction_count": 0,
"reply_count": 0,
"link_click_count": 0,
"upcoming_occurrences": [
"2019-08-24T14:15:22Z"
],
"created_at": "2019-08-24T14:15:22Z",
"updated_at": "2019-08-24T14:15:22Z"
}
],
"counts": {
"scheduled": 0,
"sent": 0,
"failed": 0
},
"pagination": {
"total_count": 0,
"page": 0,
"page_size": 0,
"total_pages": 0
}
}
DiscordMessageListResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | [DiscordMessage] | false | none | [A posted or scheduled message, with its engagement once delivered. A curated projection of the internal record — pipeline internals (delivery log, retry bookkeeping, rendered body, portal author identity) stay internal.] |
| counts | DiscordMessageCounts | false | none | none |
| pagination | public_api__core__pagination__PaginationMeta | true | none | Pagination metadata returned in responses. |
DiscordMessageResponse
{
"data": {
"id": 0,
"channel_id": "string",
"channel_name": "string",
"title": "string",
"content": "string",
"mention": {
"type": "none",
"role_id": "string"
},
"campaign_id": 0,
"attachments": [
{
"filename": "string",
"content_type": "string",
"size_bytes": 0
}
],
"sender": {
"type": "brand",
"user_id": "string",
"display_name": "string",
"avatar_url": "string"
},
"status": "string",
"scheduled_for": "2019-08-24T14:15:22Z",
"timezone": "string",
"recurrence": {
"frequency": "daily",
"end_type": "never",
"until": "2019-08-24",
"occurrences": 0
},
"paused": false,
"series_id": 0,
"occurrence_num": 0,
"occurrences_sent": 0,
"discord_message_id": "string",
"message_url": "string",
"sent_at": "2019-08-24T14:15:22Z",
"failure_reason": "string",
"failure_code": "string",
"audience_count": 0,
"reaction_count": 0,
"reply_count": 0,
"link_click_count": 0,
"upcoming_occurrences": [
"2019-08-24T14:15:22Z"
],
"created_at": "2019-08-24T14:15:22Z",
"updated_at": "2019-08-24T14:15:22Z"
}
}
DiscordMessageResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | DiscordMessage | true | none | A posted or scheduled message, with its engagement once delivered. A curated projection of the internal record — pipeline internals (delivery log, retry bookkeeping, rendered body, portal author identity) stay internal. |
DiscordMessageWriteResponse
{
"data": {
"id": 0,
"channel_id": "string",
"channel_name": "string",
"title": "string",
"content": "string",
"mention": {
"type": "none",
"role_id": "string"
},
"campaign_id": 0,
"attachments": [
{
"filename": "string",
"content_type": "string",
"size_bytes": 0
}
],
"sender": {
"type": "brand",
"user_id": "string",
"display_name": "string",
"avatar_url": "string"
},
"status": "string",
"scheduled_for": "2019-08-24T14:15:22Z",
"timezone": "string",
"recurrence": {
"frequency": "daily",
"end_type": "never",
"until": "2019-08-24",
"occurrences": 0
},
"paused": false,
"series_id": 0,
"occurrence_num": 0,
"occurrences_sent": 0,
"discord_message_id": "string",
"message_url": "string",
"sent_at": "2019-08-24T14:15:22Z",
"failure_reason": "string",
"failure_code": "string",
"audience_count": 0,
"reaction_count": 0,
"reply_count": 0,
"link_click_count": 0,
"upcoming_occurrences": [
"2019-08-24T14:15:22Z"
],
"created_at": "2019-08-24T14:15:22Z",
"updated_at": "2019-08-24T14:15:22Z"
},
"dry_run": false
}
DiscordMessageWriteResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | DiscordMessage | true | none | A posted or scheduled message, with its engagement once delivered. A curated projection of the internal record — pipeline internals (delivery log, retry bookkeeping, rendered body, portal author identity) stay internal. |
| dry_run | boolean | false | none | none |
DiscoveryCreatorsBody
{
"page": 1,
"limit": 100,
"sort_by": "relevance_score",
"sort_order": "desc",
"filters": {}
}
DiscoveryCreatorsBody
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| page | integer | false | none | 1-based page number. |
| limit | integer | false | none | Creators per page (max 1000). |
| sort_by | string | false | none | Column to sort by. One of: relevance_score, follower_count, gmv_num, avg_views, engagement_rate_segment. |
| sort_order | string | false | none | 'asc' or 'desc'. |
| filters | any | false | none | Extra filters applied on top of the profile's own query and filters — same shape as the AI-search filter payload, e.g. {"Performance": {"GMV": ["$5K-$10K"]}, "emailFilter": true}. Omit to get the profile's unmodified result set. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | object | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
DiscoveryProfileCreateBody
{
"title": "string",
"search_query": "string",
"description": "string",
"filters": {}
}
DiscoveryProfileCreateBody
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| title | string | true | none | Human-readable name for the brief. The stored title is regenerated from search_query + filters, so it may come back normalized rather than exactly as sent. |
| search_query | string | true | none | Natural-language description of the creators you want, e.g. 'skincare creators who film get-ready-with-me content'. |
| description | any | false | none | Optional longer note about what this brief is for. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| filters | any | false | none | Structured demographic filters layered on top of the query — {"Gender": ["female"], "Age": ["25-34"], "Ethnicity": [...], "Region": [...]}. Single values are normalized to arrays. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | object | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
DiscoveryProfileUpdateBody
{
"title": "string",
"description": "string",
"search_query": "string",
"filters": {},
"is_active": true,
"is_hidden": true,
"hide_unsafe": true
}
DiscoveryProfileUpdateBody
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| title | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| description | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| search_query | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| filters | any | false | none | Replaces the stored demographic filters wholesale. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | object | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| is_active | any | false | none | Whether the brief is refreshed on the usual schedule. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | boolean | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| is_hidden | any | false | none | Hide the brief from the profile list without deleting it. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | boolean | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| hide_unsafe | any | false | none | Exclude brand-unsafe creators from the match set. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | boolean | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
DiscoverySaveToListBody
{
"list_name": "string",
"description": "string",
"include_emails": false,
"filters": {}
}
DiscoverySaveToListBody
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| list_name | string | true | none | Name for the Vault list. |
| description | any | false | none | Optional list description. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| include_emails | boolean | false | none | Also save the creators' email list alongside the handle list. Required if you intend to drive an email automation from it. |
| filters | any | false | none | Extra filters narrowing the saved set, same shape as the AI-search filter payload. The profile itself is not modified. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | object | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
DmConfig
{
"spark_code": {
"only_collect_creator_information": false,
"spark_code_submission_url": "string"
}
}
DmConfig
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| spark_code | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | DmSparkCodeConfig | false | none | dm-mode=spark_code — TikTok spark code collection form. |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
DmConfigPatchPayload
{
"spark_code": {
"only_collect_creator_information": false,
"spark_code_submission_url": "string"
}
}
DmConfigPatchPayload
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| spark_code | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | DmSparkCodeConfig | false | none | dm-mode=spark_code — TikTok spark code collection form. |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
DmPersonalizationConfig
{
"enabled": true,
"tone": "engaging",
"fallback_message": "string",
"offer_discussion": "",
"product_description": "",
"product_selling_points": "",
"word_counts": {
"property1": 0,
"property2": 0
},
"name_source": "first_name"
}
DmPersonalizationConfig
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| enabled | boolean | false | none | Master switch. Set false to persist the config without personalizing sends (e.g. staging copy for later). |
| tone | any | false | none | AI rewrite tone. Null uses the engine default (engaging). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| fallback_message | string | true | none | Sent when a creator has too little signal to personalize. Required — personalization must always have a safe fallback. |
| offer_discussion | string | false | none | [Offer Discussion] block value — your offer text. |
| product_description | string | false | none | [Product Description] block value. Pre-resolve via POST /personalization/product-blocks. |
| product_selling_points | string | false | none | [Product Selling Points] block value. Pre-resolve via POST /personalization/product-blocks. |
| word_counts | any | false | none | Optional approximate word-count target per AI block, e.g. {"content_discussion": 25, "product_discussion": 20}. Only the two AI blocks (content_discussion, product_discussion) are honored; values are clamped to a sane range server-side. Null/absent uses the engine brevity default. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | object | false | none | none |
| »» additionalProperties | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| name_source | string | false | none | Which name fills the creator-name token (CORE-7779). first_name (default) uses the first name on the creator's most recent TikTok order -- a shipping name, which can differ from how they present on TikTok. display_name puts their TikTok display name first, falling back to the first name and then the handle when it isn't a usable name. |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | engaging |
| anonymous | bold |
| anonymous | inspirational |
| name_source | first_name |
| name_source | display_name |
DmSparkCodeConfig
{
"only_collect_creator_information": false,
"spark_code_submission_url": "string"
}
DmSparkCodeConfig
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| only_collect_creator_information | boolean | false | none | none |
| spark_code_submission_url | string | true | none | Portal-hosted form URL. Auto-generated if not provided by the route. |
DraftListResponse
{
"data": [
{
"id": 0,
"conversation_id": 0,
"content_type": "string",
"text_content": "string",
"payload": {},
"created_at": "string",
"expires_at": "string",
"created_by_api_key_id": 0
}
],
"page": 0,
"page_size": 0,
"total": 0,
"has_more": true
}
DraftListResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | [CreatorMessageDraft] | true | none | [One draft row, as returned by create / list / delete echo paths. Mirrors the column shape in conversation_message_drafts. Only thefield matching content_type is populated — for text drafts,text_content is set and payload is {}; for image draftspayload = {"image_url": "..."}; for product draftspayload = {"product_id": "..."}. Keeping the response shape tightmeans an agent caller can render the draft without parsing more than necessary.] |
| page | integer | true | none | none |
| page_size | integer | true | none | none |
| total | integer | true | none | none |
| has_more | boolean | true | none | none |
EmailAttachment
{
"name": "string",
"url": "string"
}
EmailAttachment
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| name | string | true | none | Display name for the attachment (e.g. deck.pdf). |
| url | string | true | none | Hosted HTTPS URL of the attachment. Reacher fetches the file from this URL at create time, runs the standard upload validation pipeline (size, MIME type, virus scan), and re-hosts to internal storage. The provided URL is NOT used at send time — only at create time. |
EmailCapacityResponse
{
"shop_id": 0,
"emails_sent_today": 0,
"daily_limit": 0,
"percent_used": 0,
"tier_limits": {
"default": 0,
"minimum": 0,
"maximum": 0
}
}
EmailCapacityResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | integer | true | none | none |
| emails_sent_today | integer | true | none | Emails sent by this shop today (server date). |
| daily_limit | integer | true | none | The denominator the portal's daily-send bar shows. |
| percent_used | number | true | none | emails_sent_today / daily_limit, as a percentage. |
| tier_limits | EmailTierLimits | true | none | The shop tier's emails/day entitlement, Extra Limits grants applied. |
EmailFilters
{
"min_creator_gmv": 0,
"min_followers": 0,
"min_engagement_rate": 1,
"min_avg_views": 0,
"regions": [
"string"
],
"categories": [
"string"
]
}
EmailFilters
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| min_creator_gmv | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| min_followers | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| min_engagement_rate | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| min_avg_views | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| regions | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| categories | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
EmailMailingList
{
"list_upload_emails": [
"string"
],
"lists_selected": [
"string"
]
}
EmailMailingList
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| list_upload_emails | [string] | false | none | none |
| lists_selected | [string] | false | none | none |
EmailTierLimits
{
"default": 0,
"minimum": 0,
"maximum": 0
}
EmailTierLimits
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| default | any | false | none | Cap a newly created email automation gets. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| minimum | any | false | none | Floor a cap is clamped up to. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| maximum | any | false | none | Ceiling a cap is clamped down to; null when uncapped. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
ExcludeVideosData
{
"excluded_video_ids": [
"string"
],
"already_excluded_video_ids": [
"string"
]
}
ExcludeVideosData
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| excluded_video_ids | [string] | true | none | none |
| already_excluded_video_ids | [string] | true | none | none |
ExcludeVideosDryRunData
{
"action": "exclude",
"campaign_id": 0,
"video_ids": [
"string"
],
"reasons": [
"string"
],
"note": "string"
}
ExcludeVideosDryRunData
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| action | string | true | none | none |
| campaign_id | integer | true | none | none |
| video_ids | [string] | true | none | none |
| reasons | [string] | true | none | none |
| note | string | true | none | none |
ExcludeVideosDryRunResponse
{
"dry_run": true,
"would": {
"action": "exclude",
"campaign_id": 0,
"video_ids": [
"string"
],
"reasons": [
"string"
],
"note": "string"
}
}
ExcludeVideosDryRunResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| dry_run | boolean | true | none | none |
| would | ExcludeVideosDryRunData | true | none | none |
ExcludeVideosRequest
{
"video_ids": [
"string"
],
"reasons": [
"guidelines"
],
"note": ""
}
ExcludeVideosRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video_ids | [string] | true | none | none |
| reasons | [ExclusionReason] | true | none | [Why a brand excluded a video. Shown to the creator, so every code has copy.] |
| note | string | false | none | none |
ExcludeVideosResponse
{
"success": true,
"code": "string",
"data": {
"excluded_video_ids": [
"string"
],
"already_excluded_video_ids": [
"string"
]
}
}
ExcludeVideosResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| success | boolean | true | none | none |
| code | string | true | none | none |
| data | ExcludeVideosData | true | none | none |
ExclusionReason
"guidelines"
ExclusionReason
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| ExclusionReason | string | false | none | Why a brand excluded a video. Shown to the creator, so every code has copy. |
Enumerated Values
| Property | Value |
|---|---|
| ExclusionReason | guidelines |
| ExclusionReason | off_brand |
| ExclusionReason | wrong_product |
| ExclusionReason | duplicate |
| ExclusionReason | other |
ExclusionScope
"campaign"
ExclusionScope
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| ExclusionScope | string | false | none | How far an uploaded file reaches.campaign is the default: the button lives on one campaign's Content taband acting only there is what a brand expects. shop is the opt-in thatalso excludes the video from every other campaign it appears in, which is the whole point of the upload but is far more destructive, so it is never implied. |
Enumerated Values
| Property | Value |
|---|---|
| ExclusionScope | campaign |
| ExclusionScope | shop |
FailureItem
{
"creator_id": 0,
"error_code": "string",
"error_message": "string"
}
FailureItem
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_id | integer | true | none | none |
| error_code | string | true | none | none |
| error_message | string | true | none | none |
FavoriteWriteBody
{
"entity_type": "string",
"entity_id": "string"
}
FavoriteWriteBody
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| entity_type | string | true | none | brand (a TikTok Shop seller) or product. |
| entity_id | string | true | none | Seller ID for brand, product ID for product. |
FavoriteWriteResponse
{
"ok": true,
"entity_type": "string",
"entity_id": "string"
}
FavoriteWriteResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| ok | boolean | true | none | none |
| entity_type | string | true | none | none |
| entity_id | string | true | none | none |
FavoritesListResponse
{
"entity_type": "string",
"entity_ids": [
"string"
]
}
FavoritesListResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| entity_type | string | true | none | none |
| entity_ids | [string] | true | none | Favorited IDs, most recently added first. |
FilterOption
{
"label": "string",
"value": "string"
}
FilterOption
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| label | string | true | none | none |
| value | string | true | none | none |
FilterRange
{
"min": 0,
"max": 0
}
FilterRange
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| min | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| max | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
FiltersResponse
{
"region": "US",
"filters": {
"property1": [
{
"label": "string",
"value": "string"
}
],
"property2": [
{
"label": "string",
"value": "string"
}
]
},
"sliders": {
"property1": {
"min": 0,
"max": 0,
"step": 0
},
"property2": {
"min": 0,
"max": 0,
"step": 0
}
}
}
FiltersResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| region | Region | true | none | none |
| filters | object | true | none | none |
| » additionalProperties | [FilterOption] | false | none | none |
| sliders | object | true | none | none |
| » additionalProperties | SliderFilterConfig | false | none | none |
FollowUpStep
{
"delay_days": 30,
"addons": [
{
"type": "message",
"body": "string",
"image_url": "string",
"product_id": "string",
"submission_url_slug": "string"
}
]
}
FollowUpStep
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| delay_days | integer | true | none | Days to wait after the prior step (or after initial outreach for the first follow-up). |
| addons | [MessageAddon] | true | none | Addons sent together when this follow-up step fires. Only message and image addon types are supported in follow-ups; product_card, spark_code_form, and target_invite are initial-outreach-only — use messages for those. |
FreeSampleCardContent
{
"apply_id": "string"
}
FreeSampleCardContent
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| apply_id | string | true | none | none |
FunnelStageData
{
"stage_id": "string",
"title": "string",
"description": "string",
"group_id": "string",
"creator_count": 0,
"percentage_of_funnel": 0,
"insights": {
"total_creators": 0,
"total_in_stage": 0,
"advanced_to_next_percentage": 0,
"conversion_label": "of previous status",
"median_time_in_status_days": 0
},
"automation_templates": [
{
"id": "string",
"title": "string",
"description": "string"
}
],
"active_automations": [
{
"automation_id": 0,
"automation_name": "string",
"automation_type": "string",
"sample_requests": 0,
"last_finished_at": "2019-08-24T14:15:22Z",
"status": "string",
"status_msg": "string",
"status_details": "string",
"creators_remaining": 0,
"creators_reached": 0,
"skipped": 0,
"total_creators": 0,
"crm_group_id": "string",
"crm_group_name": "string",
"ai_enabled": false,
"created_at": "2019-08-24T14:15:22Z",
"target_collab_cleanup_creators_reached": 0
}
],
"group_filters": {}
}
FunnelStageData
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| stage_id | string | true | none | Stage identifier |
| title | string | true | none | Stage display title |
| description | string | true | none | Stage description |
| group_id | any | false | none | Associated CRM group ID; null for synthetic stages |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_count | integer | true | none | Current number of creators in this stage |
| percentage_of_funnel | number | true | none | Percentage of total funnel |
| insights | FunnelStageInsights | true | none | Key insights for this stage |
| automation_templates | [AutomationTemplate] | false | none | Available templates |
| active_automations | [ActiveAutomation] | false | none | Active automations |
| group_filters | any | false | none | Filters applied to this group; null when no CRM group is associated |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | object | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
FunnelStageDetailResponse
{
"shop_id": 0,
"stage": {
"stage_id": "string",
"title": "string",
"description": "string",
"group_id": "string",
"creator_count": 0,
"percentage_of_funnel": 0,
"insights": {
"total_creators": 0,
"total_in_stage": 0,
"advanced_to_next_percentage": 0,
"conversion_label": "of previous status",
"median_time_in_status_days": 0
},
"automation_templates": [
{
"id": "string",
"title": "string",
"description": "string"
}
],
"active_automations": [
{
"automation_id": 0,
"automation_name": "string",
"automation_type": "string",
"sample_requests": 0,
"last_finished_at": "2019-08-24T14:15:22Z",
"status": "string",
"status_msg": "string",
"status_details": "string",
"creators_remaining": 0,
"creators_reached": 0,
"skipped": 0,
"total_creators": 0,
"crm_group_id": "string",
"crm_group_name": "string",
"ai_enabled": false,
"created_at": "2019-08-24T14:15:22Z",
"target_collab_cleanup_creators_reached": 0
}
],
"group_filters": {}
},
"products": {
"stage_id": "string",
"products": [
{
"product_id": "string",
"product_name": "string",
"image_url": "string",
"metrics": {
"property1": 0,
"property2": 0
}
}
],
"total": 0,
"page": 0,
"page_size": 0
}
}
FunnelStageDetailResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | integer | true | none | Shop the stage belongs to |
| stage | FunnelStageData | true | none | Stage counts, insights, templates and active automations |
| products | any | false | none | Per-product aggregates for this stage; null unless include_products=true was requested. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | StageProductsResponse | false | none | Response shape for POST /stage/{stage_id}/products. |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
FunnelStageInsights
{
"total_creators": 0,
"total_in_stage": 0,
"advanced_to_next_percentage": 0,
"conversion_label": "of previous status",
"median_time_in_status_days": 0
}
FunnelStageInsights
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| total_creators | integer | true | none | Unique creators in this stage |
| total_in_stage | integer | true | none | Total entries in this stage (same creator can have multiple). For GMV Generated this is the product-rows belonging to creators who generated GMV, so it can exceed the number of those creators. |
| advanced_to_next_percentage | number | true | none | Percentage conversion rate (from previous stage or of funnel) |
| conversion_label | string | false | none | Label for conversion metric (e.g., 'of funnel', 'of previous status', 'of sample approved') |
| median_time_in_status_days | integer | true | none | Median time spent in this status (days) |
GmvBonusTier
{
"gmv_threshold": 0,
"bonus_amount": 0
}
GmvBonusTier
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| gmv_threshold | number | true | none | none |
| bonus_amount | any | true | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
GmvMaxBofSettings
{
"shop_id": 0,
"auto_exclude_enabled": true
}
GmvMaxBofSettings
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | integer | true | none | none |
| auto_exclude_enabled | boolean | true | none | Whether the shop auto-excludes bottom-of-funnel creators. Defaults to false for shops that have never toggled it. |
GmvMaxBofSettingsResponse
{
"data": {
"shop_id": 0,
"auto_exclude_enabled": true
}
}
GmvMaxBofSettingsResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | GmvMaxBofSettings | true | none | none |
GmvMaxBofSettingsUpdateRequest
{
"auto_exclude_enabled": true
}
GmvMaxBofSettingsUpdateRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| auto_exclude_enabled | boolean | true | none | When true, the shop's GMV Max BOF reconcile job automatically excludes creators it flags as bottom-of-funnel. When false, only creators excluded manually (via POST /gmv-max/excluded-creators) are taken off delivery. |
GmvMaxBulkVideoExclusionResponse
{
"data": {
"requested": 0,
"excluded": 0,
"already_excluded": 0,
"invalid": [
"string"
],
"excluded_video_ids": [
"string"
]
}
}
GmvMaxBulkVideoExclusionResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | GmvMaxBulkVideoExclusionResult | true | none | none |
GmvMaxBulkVideoExclusionResult
{
"requested": 0,
"excluded": 0,
"already_excluded": 0,
"invalid": [
"string"
],
"excluded_video_ids": [
"string"
]
}
GmvMaxBulkVideoExclusionResult
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| requested | integer | true | none | How many ids were sent. |
| excluded | integer | true | none | Newly excluded videos. |
| already_excluded | integer | true | none | Valid ids that were already on the list. |
| invalid | [string] | true | none | Inputs that are not a numeric TikTok video id (not excluded). |
| excluded_video_ids | [string] | true | none | The ids newly excluded by this call. |
GmvMaxCampaignChangeItem
{
"field": "string",
"old_value": {},
"new_value": {},
"changed_at": "string"
}
GmvMaxCampaignChangeItem
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| field | string | true | none | Which campaign setting changed. |
| old_value | any | false | none | The setting's value before the change (JSON). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | any | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| new_value | any | false | none | The setting's value after the change (JSON). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | any | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| changed_at | any | false | none | ISO 8601 UTC timestamp of when the change was recorded. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
GmvMaxCampaignChangesResponse
{
"data": [
{
"field": "string",
"old_value": {},
"new_value": {},
"changed_at": "string"
}
],
"pagination": null
}
GmvMaxCampaignChangesResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | [GmvMaxCampaignChangeItem] | true | none | none |
| pagination | any | true | none | none |
GmvMaxCampaignDeliveryStatusResponse
{
"campaign_id": "string",
"shop_id": 0,
"data": [
{
"status": "delivering",
"creative_count": 0,
"spend": 0
}
],
"currency": "string"
}
GmvMaxCampaignDeliveryStatusResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| campaign_id | string | true | none | none |
| shop_id | integer | true | none | none |
| data | [GmvMaxDeliveryStatusItem] | true | none | none |
| currency | string | true | none | ISO currency code for the shop's region. |
GmvMaxCampaignItem
{
"shop_id": 0,
"campaign_id": "string",
"campaign_name": "string",
"status": "string",
"shopping_ads_type": "string",
"budget": 0,
"roas_bid": 0,
"last_synced_at": "string",
"currency": "string"
}
GmvMaxCampaignItem
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | integer | true | none | none |
| campaign_id | string | true | none | none |
| campaign_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| status | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shopping_ads_type | any | false | none | GMV Max objective / ads type. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| budget | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| roas_bid | any | false | none | Target ROAS bid set on the campaign. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| last_synced_at | any | false | none | ISO 8601 UTC of the most recent TikTok sync. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| currency | any | false | none | ISO currency code for the shop's region. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
GmvMaxCampaignMetricItem
{
"date": "string",
"spend": 0,
"impressions": 0,
"clicks": 0,
"orders": 0,
"gross_revenue": 0,
"cpc": 0,
"cpm": 0,
"ctr": 0,
"roas": 0,
"ad_roi": 0
}
GmvMaxCampaignMetricItem
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| date | string | true | none | ISO 8601 date (YYYY-MM-DD) for this metric row. |
| spend | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| impressions | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| clicks | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| orders | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| gross_revenue | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| cpc | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| cpm | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| ctr | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| roas | any | false | none | GMV Max ROAS for this day, computed by Reacher's sync as gross_revenue / spend (rounded to 4dp). At this grain this equals ad_roi. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| ad_roi | any | false | none | Ad ROI = gross_revenue (GMV) / spend (GMV Max spend) for this day, computed directly from this row and rounded to 4dp. Null when spend is 0 or missing (no divide-by-zero). Explicitly named for discoverability (CORE-6538); at the campaign-daily grain it is the same figure as roas — use whichever name is clearer. Distinct from a manual GMV/spend done against a different GMV source: both numerator and denominator here are the campaign's own GMV Max attributed values. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
GmvMaxCampaignMetricsResponse
{
"campaign_id": "string",
"shop_id": 0,
"data": [
{
"date": "string",
"spend": 0,
"impressions": 0,
"clicks": 0,
"orders": 0,
"gross_revenue": 0,
"cpc": 0,
"cpm": 0,
"ctr": 0,
"roas": 0,
"ad_roi": 0
}
],
"start_date": "string",
"end_date": "string",
"currency": "string"
}
GmvMaxCampaignMetricsResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| campaign_id | string | true | none | none |
| shop_id | integer | true | none | none |
| data | [GmvMaxCampaignMetricItem] | true | none | none |
| start_date | string | true | none | none |
| end_date | string | true | none | none |
| currency | string | true | none | none |
GmvMaxCampaignSettings
{
"status": "string",
"target_roas": 0,
"daily_budget": 0,
"schedule_type": "string",
"schedule_start_time": {},
"schedule_end_time": {},
"promotion_days": {},
"auto_budget_enabled": true,
"product_selection": {},
"roi_protection_enabled": true,
"affiliate_posts_enabled": true,
"placements": {}
}
GmvMaxCampaignSettings
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| status | any | false | none | Campaign operation status normalized to lower-case (e.g. enabled / disabled). From TikTok operation_status. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| target_roas | any | false | none | Target ROAS bid. From TikTok roas_bid. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| daily_budget | any | false | none | Campaign budget. From TikTok budget. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| schedule_type | any | false | none | TikTok schedule type (e.g. SCHEDULE_FROM_NOW, SCHEDULE_START_END). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| schedule_start_time | any | false | none | Scheduled start time as reported by TikTok. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | any | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| schedule_end_time | any | false | none | Scheduled end time as reported by TikTok. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | any | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| promotion_days | any | false | none | TikTok promotion-days sub-object, passed through unchanged. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | any | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| auto_budget_enabled | any | false | none | Whether auto-budget is on. From TikTok auto_budget. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | boolean | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_selection | any | false | none | Product selection mode. From TikTok product_specific_type. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | any | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| roi_protection_enabled | any | false | none | Whether ROI protection is enabled. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | boolean | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| affiliate_posts_enabled | any | false | none | Whether affiliate posts are enabled. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | boolean | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| placements | any | false | none | TikTok placements, passed through unchanged. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | any | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
GmvMaxCampaignSettingsResponse
{
"data": {
"status": "string",
"target_roas": 0,
"daily_budget": 0,
"schedule_type": "string",
"schedule_start_time": {},
"schedule_end_time": {},
"promotion_days": {},
"auto_budget_enabled": true,
"product_selection": {},
"roi_protection_enabled": true,
"affiliate_posts_enabled": true,
"placements": {}
},
"currency": "string"
}
GmvMaxCampaignSettingsResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | GmvMaxCampaignSettings | true | none | Normalised, snake_case view of a campaign's TikTok settings payload. Every field is derived from the campaign's raw_data (the TikTokcampaign/gmv_max/info response) by a single normalisation boundary;absent keys surface as null. |
| currency | string | true | none | ISO currency code for the shop's region. |
GmvMaxCampaignsResponse
{
"data": [
{
"shop_id": 0,
"campaign_id": "string",
"campaign_name": "string",
"status": "string",
"shopping_ads_type": "string",
"budget": 0,
"roas_bid": 0,
"last_synced_at": "string",
"currency": "string"
}
],
"shops_queried": [
"string"
]
}
GmvMaxCampaignsResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | [GmvMaxCampaignItem] | true | none | none |
| shops_queried | any | false | none | Shop names included when querying multiple shops (x-shop-id: all or comma-separated). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
GmvMaxCreativeMetricItem
{
"material_id": "string",
"date": "string",
"spend": 0,
"impressions": 0,
"clicks": 0,
"conversions": 0,
"revenue": 0,
"roi": 0,
"video_view_rate_2s": 0,
"video_view_rate_6s": 0,
"cost_per_order": 0,
"ctr": 0,
"video_ctr": 0,
"conversion_rate": 0,
"item_group_id": "string",
"delivery_status": "string",
"surface": "string",
"video_view_rate_p25": 0,
"video_view_rate_p50": 0,
"video_view_rate_p75": 0,
"video_view_rate_p100": 0
}
GmvMaxCreativeMetricItem
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| material_id | string | true | none | GMV Max creative (material) id. |
| date | string | true | none | ISO 8601 date (YYYY-MM-DD) for this metric row. |
| spend | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| impressions | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| clicks | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| conversions | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| revenue | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| roi | any | false | none | TikTok ROI (~ROAS) for this creative/day. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video_view_rate_2s | any | false | none | 2-second video view rate — the thumbstop rate (share of impressions watched for at least 2 seconds), percent (0–100). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video_view_rate_6s | any | false | none | 6-second video view rate, percent (0–100). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| cost_per_order | any | false | none | TikTok cost per order for this creative/day. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| ctr | any | false | none | Ad click-through rate (TikTok ad_click_rate), percent (0–100). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video_ctr | any | false | none | Video click-through rate to the product (TikTok product_click_rate), percent (0–100). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| conversion_rate | any | false | none | Ad conversion rate (TikTok ad_conversion_rate), percent. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| item_group_id | any | false | none | TikTok SPU / product id the creative delivered under (join key to product datasets). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| delivery_status | any | false | none | TikTok creative_delivery_status on this day (e.g. DELIVERING, EXCLUDED). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| surface | any | false | none | Delivery surface bucket: product_card, affiliate or brand (null when unknown). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video_view_rate_p25 | any | false | none | Watched-to-25% rate, percent (0–100). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video_view_rate_p50 | any | false | none | Watched-to-50% rate, percent (0–100). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video_view_rate_p75 | any | false | none | Watched-to-75% rate, percent (0–100). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video_view_rate_p100 | any | false | none | Watched-to-100% (completion) rate, percent (0–100). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
GmvMaxCreativeMetricsResponse
{
"campaign_id": "string",
"shop_id": 0,
"data": [
{
"material_id": "string",
"date": "string",
"spend": 0,
"impressions": 0,
"clicks": 0,
"conversions": 0,
"revenue": 0,
"roi": 0,
"video_view_rate_2s": 0,
"video_view_rate_6s": 0,
"cost_per_order": 0,
"ctr": 0,
"video_ctr": 0,
"conversion_rate": 0,
"item_group_id": "string",
"delivery_status": "string",
"surface": "string",
"video_view_rate_p25": 0,
"video_view_rate_p50": 0,
"video_view_rate_p75": 0,
"video_view_rate_p100": 0
}
],
"start_date": "string",
"end_date": "string",
"currency": "string"
}
GmvMaxCreativeMetricsResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| campaign_id | string | true | none | none |
| shop_id | integer | true | none | none |
| data | [GmvMaxCreativeMetricItem] | true | none | [One creative's metrics for a single day.video_view_rate_* are TikTok-reported percentages (0–100) for thiscreative on this day: 2s / 6s are the share of impressions watchedfor at least 2 / 6 seconds; p25–p100 are the share that watched to25 / 50 / 75 / 100% of the video. Null when TikTok did not report the metric. video_view_rate_2s is the thumbstop rate (2-second views ÷impressions × 100) — a creative clears a > 50 thumbstop bar when thisfield is above 50. Use impressions to weight it across a date range.] |
| start_date | string | true | none | none |
| end_date | string | true | none | none |
| currency | string | true | none | none |
GmvMaxDeliveryStatusItem
{
"status": "delivering",
"creative_count": 0,
"spend": 0
}
GmvMaxDeliveryStatusItem
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| status | string | true | none | Canonical delivery status, bucketed from TikTok's raw creative_delivery_status. NULL / unrecognised → unknown. |
| creative_count | integer | true | none | Distinct creatives whose latest daily row carries this status. |
| spend | number | true | none | Total ad spend across those creatives' latest daily rows. |
Enumerated Values
| Property | Value |
|---|---|
| status | delivering |
| status | not_delivering |
| status | in_review |
| status | rejected |
| status | inactive |
| status | unknown |
GmvMaxExcludeCreatorRequest
{
"handle": "string"
}
GmvMaxExcludeCreatorRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| handle | string | true | none | The creator's TikTok handle to exclude from GMV Max delivery — the same handle returned by GET /gmv-max/excluded-creators. Excludes the creator's videos from the shop's bottom-of-funnel ad boosts. |
GmvMaxExcludeCreatorWriteResponse
{
"data": {
"handle": "string",
"source": "string",
"reason": "string",
"bof_confidence": 0,
"excluded_video_count": 0,
"applied_status": "string",
"decided_by": "string",
"created_at": "2019-08-24T14:15:22Z",
"updated_at": "2019-08-24T14:15:22Z"
}
}
GmvMaxExcludeCreatorWriteResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | GmvMaxExcludedCreatorItem | true | none | One creator excluded from the shop's GMV Max bottom-of-funnel delivery. Mirrors the portal's BofExcludedCreatorItem shape 1:1 so the public read isbyte-identical to what the in-app GMV Max screen shows. |
GmvMaxExcludeVideoRequest
{
"video_id": "string",
"reason": "string"
}
GmvMaxExcludeVideoRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video_id | string | true | none | The TikTok video id to exclude — the same video_id / material_id returned by the GMV Max video and creative-metrics tools (a pasted TikTok video URL is accepted and unwrapped). Only this creative comes off spend; the creator's other videos keep delivering. |
| reason | any | false | none | Optional free-text note (e.g. 'zero orders at $12 spend'). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
GmvMaxExcludeVideoWriteResponse
{
"data": {
"video_id": "string",
"source": "string",
"reason": "string",
"excluded_campaign_count": 0,
"applied_status": "string",
"decided_by": "string",
"created_at": "2019-08-24T14:15:22Z",
"updated_at": "2019-08-24T14:15:22Z"
}
}
GmvMaxExcludeVideoWriteResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | GmvMaxExcludedVideoItem | true | none | One video (creative) excluded from the shop's GMV Max delivery. |
GmvMaxExcludeVideosBulkRequest
{
"video_ids": [
"string"
],
"reason": "string"
}
GmvMaxExcludeVideosBulkRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video_ids | [string] | true | none | TikTok video ids to exclude (max 500 per call). Duplicates are collapsed; already-excluded ids are counted, not re-written. |
| reason | any | false | none | Optional note stored on every row created by this call. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
GmvMaxExcludedCreatorItem
{
"handle": "string",
"source": "string",
"reason": "string",
"bof_confidence": 0,
"excluded_video_count": 0,
"applied_status": "string",
"decided_by": "string",
"created_at": "2019-08-24T14:15:22Z",
"updated_at": "2019-08-24T14:15:22Z"
}
GmvMaxExcludedCreatorItem
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| handle | string | true | none | The creator's TikTok handle. |
| source | string | true | none | How the exclusion was created: manual (via POST /gmv-max/excluded-creators or the portal) or auto_bof (the reconcile job's automatic bottom-of-funnel detection). |
| reason | any | false | none | Why the creator was flagged (populated for auto_bof rows). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| bof_confidence | any | false | none | Auto-detection confidence 0–100 (populated for auto_bof rows). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| excluded_video_count | integer | false | none | How many of the creator's videos this exclusion covers. |
| applied_status | string | true | none | Whether the exclusion has taken effect on spend: applied (live), pending (armed, reconcile job hasn't run yet), or failed. |
| decided_by | any | false | none | Who created the exclusion. For public-API writes this is the calling API key's identity (api_key:<prefix>). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| created_at | any | false | none | When the exclusion row was first created. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date-time) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| updated_at | any | false | none | When the reconcile job last touched this row. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date-time) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
GmvMaxExcludedCreatorRemoveResponse
{
"data": {
"handle": "string",
"removed": true
}
}
GmvMaxExcludedCreatorRemoveResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | GmvMaxExcludedCreatorRemoveResult | true | none | none |
GmvMaxExcludedCreatorRemoveResult
{
"handle": "string",
"removed": true
}
GmvMaxExcludedCreatorRemoveResult
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| handle | string | true | none | The handle that was targeted for removal. |
| removed | boolean | true | none | True if a row was removed; false if the creator wasn't excluded (a no-op — the call is still a 200). |
GmvMaxExcludedCreatorsListResponse
{
"data": [
{
"handle": "string",
"source": "string",
"reason": "string",
"bof_confidence": 0,
"excluded_video_count": 0,
"applied_status": "string",
"decided_by": "string",
"created_at": "2019-08-24T14:15:22Z",
"updated_at": "2019-08-24T14:15:22Z"
}
]
}
GmvMaxExcludedCreatorsListResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | [GmvMaxExcludedCreatorItem] | true | none | [One creator excluded from the shop's GMV Max bottom-of-funnel delivery. Mirrors the portal's BofExcludedCreatorItem shape 1:1 so the public read isbyte-identical to what the in-app GMV Max screen shows.] |
GmvMaxExcludedVideoItem
{
"video_id": "string",
"source": "string",
"reason": "string",
"excluded_campaign_count": 0,
"applied_status": "string",
"decided_by": "string",
"created_at": "2019-08-24T14:15:22Z",
"updated_at": "2019-08-24T14:15:22Z"
}
GmvMaxExcludedVideoItem
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video_id | string | true | none | The TikTok video id (== creative material_id). |
| source | string | true | none | How the exclusion was created: manual (API or portal) or auto_rule. |
| reason | any | false | none | Free-text note stored with the exclusion. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| excluded_campaign_count | integer | false | none | How many campaigns the video is confirmed EXCLUDED from after the last reconcile. |
| applied_status | string | true | none | Whether the exclusion has taken effect on spend: applied (live), pending (armed, reconcile job hasn't run yet or the video has no known product yet), no_creatives (the video is not in any active campaign right now), attempted, or failed (an actively delivering placement could not be excluded). |
| decided_by | any | false | none | Who created the exclusion (api_key:<prefix> for public-API writes). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| created_at | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date-time) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| updated_at | any | false | none | When the reconcile job last touched this row. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date-time) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
GmvMaxExcludedVideoRemoveResponse
{
"data": {
"video_id": "string",
"removed": true
}
}
GmvMaxExcludedVideoRemoveResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | GmvMaxExcludedVideoRemoveResult | true | none | none |
GmvMaxExcludedVideoRemoveResult
{
"video_id": "string",
"removed": true
}
GmvMaxExcludedVideoRemoveResult
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video_id | string | true | none | none |
| removed | boolean | true | none | True if a row was removed; false if the video wasn't excluded (still a 200). |
GmvMaxExcludedVideosListResponse
{
"data": [
{
"video_id": "string",
"source": "string",
"reason": "string",
"excluded_campaign_count": 0,
"applied_status": "string",
"decided_by": "string",
"created_at": "2019-08-24T14:15:22Z",
"updated_at": "2019-08-24T14:15:22Z"
}
]
}
GmvMaxExcludedVideosListResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | [GmvMaxExcludedVideoItem] | true | none | [One video (creative) excluded from the shop's GMV Max delivery.] |
GmvMaxInfo
{
"active": false,
"avg_roas": 0,
"tooltip": "Based on average ROAS across all active campaigns in your shop."
}
GmvMaxInfo
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| active | boolean | false | none | none |
| avg_roas | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| tooltip | string | false | none | none |
GmvMaxProductMetricItem
{
"date": "string",
"campaign_id": "string",
"item_group_id": "string",
"product_id": "string",
"cost": 0,
"gross_revenue": 0,
"orders": 0,
"roi": 0,
"ad_roi": 0,
"cost_per_order": 0
}
GmvMaxProductMetricItem
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| date | string | true | none | ISO 8601 date (YYYY-MM-DD) for this metric row. |
| campaign_id | string | true | none | Owning GMV Max campaign id. |
| item_group_id | string | true | none | TikTok SPU id (the product). |
| product_id | string | true | none | Alias of item_group_id — join key to product/sales datasets. |
| cost | any | false | none | Ad spend for this product on this campaign/day. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| gross_revenue | any | false | none | GMV attributed to this product/day. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| orders | any | false | none | SKU orders for this product/day. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| roi | any | false | none | TikTok ROI (~ROAS) for this product/day (daily value). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| ad_roi | any | false | none | Ad ROI = gross_revenue (GMV) / cost (GMV Max spend) for this product/day, computed directly from this row and rounded to 4dp. Null when cost is 0 or missing. Explicitly named for discoverability (CORE-6538). Unlike roi — which is TikTok's stored daily value under TikTok's own attribution — this is the transparent GMV/spend ratio and may differ from roi. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| cost_per_order | any | false | none | TikTok-native daily cost per order (not a window rollup). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
GmvMaxProductOverview
{
"cost": 0,
"gross_revenue": 0,
"orders": 0,
"cost_per_order": 0,
"roi": 0,
"ad_roi": 0
}
GmvMaxProductOverview
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| cost | any | false | none | Account-level total ad spend across the window. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| gross_revenue | any | false | none | Account-level total GMV across the window. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| orders | any | false | none | Account-level total SKU orders across the window. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| cost_per_order | any | false | none | Total cost / total orders across the window (recomputed). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| roi | any | false | none | Total gross_revenue / total cost across the window (recomputed). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| ad_roi | any | false | none | Blended Ad ROI = total gross_revenue (GMV) / total cost (GMV Max spend) across the window, account-level (all campaigns/products). Null when total cost is 0. This is the blended shop-level GMV/spend figure; identical to roi here — the canonical cross-endpoint name (CORE-6538). Distinct from the per-campaign ad_roi on /gmv-max/campaigns/{id}/metrics. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
GmvMaxProductSummaryItem
{
"campaign_id": "string",
"campaign_name": "string",
"status": "string",
"budget": 0,
"target_roi": 0,
"item_group_id": "string",
"product_id": "string",
"cost": 0,
"gross_revenue": 0,
"orders": 0,
"cost_per_order": 0,
"roi": 0,
"ad_roi": 0
}
GmvMaxProductSummaryItem
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| campaign_id | string | true | none | Owning GMV Max campaign id. |
| campaign_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| status | any | false | none | Campaign status (from gmv_max_campaigns). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| budget | any | false | none | Campaign budget. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| target_roi | any | false | none | Campaign target ROAS (roas_bid). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| item_group_id | string | true | none | TikTok SPU id (the product). |
| product_id | string | true | none | Alias of item_group_id. |
| cost | any | false | none | Window ad spend for this product. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| gross_revenue | any | false | none | Window GMV for this product. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| orders | any | false | none | Window SKU orders for this product. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| cost_per_order | any | false | none | Window cost / window orders (recomputed, not summed). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| roi | any | false | none | Window gross_revenue / window cost (recomputed). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| ad_roi | any | false | none | Ad ROI = window gross_revenue (GMV) / window cost (GMV Max spend) for this product, recomputed from the summed bases. Null when cost is 0. Identical to roi at this grain; the canonical cross-endpoint name (CORE-6538). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
GmvMaxProductSummaryRequest
{
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"campaign_id": "string"
}
GmvMaxProductSummaryRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| start_date | any | false | none | Inclusive window start (YYYY-MM-DD). Defaults to 29 days before end_date. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_date | any | false | none | Inclusive window end (YYYY-MM-DD). Defaults to yesterday. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| campaign_id | any | false | none | Restrict to a single GMV Max campaign. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
GmvMaxProductSummaryResponse
{
"shop_id": 0,
"currency": "string",
"start_date": "string",
"end_date": "string",
"overview": {
"cost": 0,
"gross_revenue": 0,
"orders": 0,
"cost_per_order": 0,
"roi": 0,
"ad_roi": 0
},
"products": [
{
"campaign_id": "string",
"campaign_name": "string",
"status": "string",
"budget": 0,
"target_roi": 0,
"item_group_id": "string",
"product_id": "string",
"cost": 0,
"gross_revenue": 0,
"orders": 0,
"cost_per_order": 0,
"roi": 0,
"ad_roi": 0
}
]
}
GmvMaxProductSummaryResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | integer | true | none | none |
| currency | string | true | none | ISO currency code for the shop's region. |
| start_date | string | true | none | none |
| end_date | string | true | none | none |
| overview | GmvMaxProductOverview | true | none | The Seller Center 'GMV Max Ads overview' card — account-level totals over the window, derived from the per-product sums; ratios recomputed from summed bases (never averaged). |
| products | [GmvMaxProductSummaryItem] | true | none | One row per (campaign, product), sorted by cost descending. |
GmvMaxProductTimeseriesRequest
{
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"campaign_id": "string",
"item_group_id": "string"
}
GmvMaxProductTimeseriesRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| start_date | any | false | none | Inclusive window start (YYYY-MM-DD). Defaults to 29 days before end_date (30-day window). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_date | any | false | none | Inclusive window end (YYYY-MM-DD). Defaults to yesterday (today's row is still incomplete). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| campaign_id | any | false | none | Restrict to a single GMV Max campaign. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| item_group_id | any | false | none | Restrict to a single product (TikTok SPU / item_group_id). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
GmvMaxProductTimeseriesResponse
{
"shop_id": 0,
"currency": "string",
"start_date": "string",
"end_date": "string",
"data": [
{
"date": "string",
"campaign_id": "string",
"item_group_id": "string",
"product_id": "string",
"cost": 0,
"gross_revenue": 0,
"orders": 0,
"roi": 0,
"ad_roi": 0,
"cost_per_order": 0
}
]
}
GmvMaxProductTimeseriesResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | integer | true | none | none |
| currency | string | true | none | ISO currency code for the shop's region. |
| start_date | string | true | none | none |
| end_date | string | true | none | none |
| data | [GmvMaxProductMetricItem] | true | none | none |
GmvMaxSpendBySurfaceResponse
{
"campaign_id": "string",
"shop_id": 0,
"data": [
{
"surface": "product_card",
"spend": 0,
"creative_count": 0
}
],
"start_date": "string",
"end_date": "string",
"currency": "string"
}
GmvMaxSpendBySurfaceResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| campaign_id | string | true | none | none |
| shop_id | integer | true | none | none |
| data | [GmvMaxSurfaceSpendItem] | true | none | none |
| start_date | string | true | none | none |
| end_date | string | true | none | none |
| currency | string | true | none | ISO currency code for the shop's region. |
GmvMaxSurfaceSpendItem
{
"surface": "product_card",
"spend": 0,
"creative_count": 0
}
GmvMaxSurfaceSpendItem
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| surface | string | true | none | Delivery surface, from surface_bucket. NULL / unrecognised → unknown. |
| spend | number | true | none | Total ad spend on this surface over the window. |
| creative_count | integer | true | none | Distinct creatives delivering on this surface over the window. |
Enumerated Values
| Property | Value |
|---|---|
| surface | product_card |
| surface | affiliate |
| surface | brand |
| surface | unknown |
GmvMaxVideoSummaryItem
{
"video_id": "string",
"campaign_ids": [
"string"
],
"item_group_id": "string",
"posted_date": "string",
"creator_name": "string",
"title": "string",
"spend": 0,
"revenue": 0,
"orders": 0,
"cost_per_order": 0,
"roi": 0,
"impressions": 0,
"clicks": 0,
"ctr": 0,
"video_ctr": 0,
"delivery_status": "string",
"surface": "string",
"first_active_date": "string",
"last_active_date": "string",
"is_excluded": true,
"exclusion_status": "string"
}
GmvMaxVideoSummaryItem
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video_id | string | true | none | TikTok video id (== creative material_id). |
| campaign_ids | [string] | true | none | Campaigns the video delivered in during the window. |
| item_group_id | any | false | none | TikTok SPU / product id (join key to product datasets); null on older rows. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| posted_date | any | false | none | Date the video was posted (YYYY-MM-DD), from the affiliate video record. Null for brand / product-card creatives Reacher has no post record for. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_name | any | false | none | Creator handle, when the video is an affiliate video. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| title | any | false | none | Video caption, when known. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| spend | number | true | none | Window ad spend. |
| revenue | number | true | none | Window gross revenue (GMV) attributed to the video. |
| orders | integer | true | none | Window orders. |
| cost_per_order | any | false | none | spend / orders over the window; null when no orders. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| roi | any | false | none | revenue / spend over the window; null when no spend. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| impressions | integer | true | none | none |
| clicks | integer | true | none | none |
| ctr | any | false | none | Impressions-weighted ad click-through rate over the window, percent (0–100). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video_ctr | any | false | none | Impressions-weighted video (product) click-through rate over the window, percent (0–100). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| delivery_status | any | false | none | Latest TikTok creative_delivery_status seen in the window (e.g. DELIVERING, EXCLUDED). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| surface | any | false | none | Latest delivery surface bucket: product_card, affiliate or brand. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| first_active_date | string | true | none | First day in the window with a metric row. |
| last_active_date | string | true | none | Last day in the window with a metric row. |
| is_excluded | boolean | true | none | True when the video is on the shop's GMV Max exclusion list. |
| exclusion_status | any | false | none | applied_status of the exclusion row when is_excluded is true. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
GmvMaxVideoSummaryRequest
{
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"campaign_id": "string",
"min_spend": 0,
"sort_by": "spend",
"sort_dir": "asc",
"page": 1,
"page_size": 50
}
GmvMaxVideoSummaryRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| start_date | any | false | none | Inclusive window start (YYYY-MM-DD). Defaults to 29 days before end_date. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_date | any | false | none | Inclusive window end (YYYY-MM-DD). Defaults to yesterday. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| campaign_id | any | false | none | Restrict to a single GMV Max campaign. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| min_spend | any | false | none | Only videos whose window spend is at least this amount. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sort_by | string | false | none | Column to sort by. |
| sort_dir | string | false | none | none |
| page | integer | false | none | none |
| page_size | integer | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| sort_by | spend |
| sort_by | revenue |
| sort_by | orders |
| sort_by | roi |
| sort_by | cost_per_order |
| sort_by | ctr |
| sort_by | video_ctr |
| sort_by | last_active_date |
| sort_dir | asc |
| sort_dir | desc |
GmvMaxVideoSummaryResponse
{
"shop_id": 0,
"currency": "string",
"start_date": "string",
"end_date": "string",
"data": [
{
"video_id": "string",
"campaign_ids": [
"string"
],
"item_group_id": "string",
"posted_date": "string",
"creator_name": "string",
"title": "string",
"spend": 0,
"revenue": 0,
"orders": 0,
"cost_per_order": 0,
"roi": 0,
"impressions": 0,
"clicks": 0,
"ctr": 0,
"video_ctr": 0,
"delivery_status": "string",
"surface": "string",
"first_active_date": "string",
"last_active_date": "string",
"is_excluded": true,
"exclusion_status": "string"
}
],
"pagination": {
"total_count": 0,
"page": 0,
"page_size": 0,
"total_pages": 0
}
}
GmvMaxVideoSummaryResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | integer | true | none | none |
| currency | string | true | none | ISO currency code for the shop's region. |
| start_date | string | true | none | none |
| end_date | string | true | none | none |
| data | [GmvMaxVideoSummaryItem] | true | none | [One video's GMV Max window totals across the campaigns it delivered in.] |
| pagination | public_api__core__pagination__PaginationMeta | true | none | Pagination metadata returned in responses. |
GmvRange
{
"min": 0,
"max": 0
}
GmvRange
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| min | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| max | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
GranularityEnum
"weekly"
GranularityEnum
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| GranularityEnum | string | false | none | Supported target granularity options |
Enumerated Values
| Property | Value |
|---|---|
| GranularityEnum | weekly |
| GranularityEnum | monthly |
| GranularityEnum | quarterly |
GuardrailRulePublic
{
"rule_type": "total_creative_boost_cost",
"operator": "lt",
"value": 0
}
GuardrailRulePublic
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| rule_type | GuardrailRuleType | true | none | Which limit this guardrail enforces. total_creative_boost_cost is the lifetime spend cap and is required on every set_up_creative_boost automation. |
| operator | any | false | none | Comparison operator. Optional — defaults to < for spend-cap-style guardrails when omitted. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | ConditionOperator | false | none | Comparison operator. Both the FE's short form (lt, gte) andthe legacy symbol form ( >=, <) are accepted — the controllertreats them as synonyms. |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| value | number | true | none | Threshold value. |
GuardrailRuleType
"total_creative_boost_cost"
GuardrailRuleType
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| GuardrailRuleType | string | false | none | What a guardrail enforces.total_creative_boost_cost is the lifetime spend cap and ismandatory on every set_up_creative_boost automation (enforcedby AutomationCreateRequest.validate_total_budget_cap). Theremaining values are metric-name guardrails that cap a specific metric per evaluation window. |
Enumerated Values
| Property | Value |
|---|---|
| GuardrailRuleType | total_creative_boost_cost |
| GuardrailRuleType | creative_roi |
| GuardrailRuleType | creative_revenue |
| GuardrailRuleType | campaign_roi |
| GuardrailRuleType | campaign_revenue |
| GuardrailRuleType | campaign_cost |
| GuardrailRuleType | max_budget_daily |
| GuardrailRuleType | cooldown_hours |
HTTPValidationError
{
"detail": [
{
"loc": [
"string"
],
"msg": "string",
"type": "string"
}
]
}
HTTPValidationError
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| detail | [ValidationError] | false | none | none |
HaloAmazonProduct
{
"asin": "string",
"marketplace_id": "string"
}
HaloAmazonProduct
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| asin | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| marketplace_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
HaloAnalysisRequest
{
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"amazon_asins": [
"string"
],
"shopify_product_ids": [
"string"
],
"lag_days": 0
}
HaloAnalysisRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| start_date | any | false | none | Inclusive window start (YYYY-MM-DD). Defaults to 29 days before end_date (a 30-day window). Max window 366 days. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_date | any | false | none | Inclusive window end (YYYY-MM-DD). Defaults to yesterday — today's revenue rows have not been pulled yet. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| amazon_asins | any | false | none | Restrict Amazon revenue and branded search to these ASINs. Omit for the shop total. Values come from GET /halo/products. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shopify_product_ids | any | false | none | Restrict Shopify revenue to these product IDs. Omit for the shop total. Values come from GET /halo/products. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| lag_days | integer | false | none | Shift TikTok views forward N days before correlating, to test a delayed halo (a video today, an Amazon order three days later). 0 correlates same-day. Sweep 0-14 and keep the strongest r. |
HaloAnalysisResponse
{
"shop_id": 0,
"start_date": "string",
"end_date": "string",
"lag_days": 0,
"summary": {
"base_sales": 0,
"incremental_revenue": 0,
"relationship_strength": 0,
"views_explain": 0
},
"channel_correlations": [
{
"channel": "string",
"r": 0,
"p_value": 0,
"label": "string"
}
],
"branded_search_correlation": {
"channel": "string",
"r": 0,
"p_value": 0,
"label": "string"
},
"attribution": {
"tiktok_gmv": 0,
"amazon": 0,
"shopify": 0,
"total": 0
}
}
HaloAnalysisResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | integer | true | none | none |
| start_date | string | true | none | none |
| end_date | string | true | none | none |
| lag_days | integer | true | none | none |
| summary | HaloAnalysisSummary | true | none | none |
| channel_correlations | [HaloCorrelation] | true | none | Per-channel Pearson results for the off-platform channels only. TikTok GMV vs TikTok views is excluded — both are driven by the same activity, so it correlates by construction and is not halo. |
| branded_search_correlation | any | false | none | TikTok views vs branded-search volume. Null when untracked. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | HaloCorrelation | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| attribution | HaloAttribution | true | none | Raw revenue sums per channel for the window. |
HaloAnalysisSummary
{
"base_sales": 0,
"incremental_revenue": 0,
"relationship_strength": 0,
"views_explain": 0
}
HaloAnalysisSummary
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| base_sales | any | false | none | Average daily Amazon+Shopify revenue over the 30 days BEFORE the window — the pre-period run rate the window is measured against. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| incremental_revenue | any | false | none | Window revenue minus (base_sales x days with data) — the revenue above the pre-period run rate. Negative means the window underperformed the baseline. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| relationship_strength | any | false | none | Pearson r between TikTok views and combined off-platform revenue at the requested lag. Null when fewer than 5 aligned day-pairs have data on both sides. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| views_explain | any | false | none | r-squared — the share of day-to-day revenue variance that moves with TikTok views. 0.42 reads as 'views explain ~42% of it'. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
HaloAttribution
{
"tiktok_gmv": 0,
"amazon": 0,
"shopify": 0,
"total": 0
}
HaloAttribution
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| tiktok_gmv | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| amazon | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shopify | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| total | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
HaloBrandedSearchPoint
{
"date": "string",
"search_terms": 0,
"click_share": 0
}
HaloBrandedSearchPoint
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| date | string | true | none | none |
| search_terms | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| click_share | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
HaloBrandedSearchRequest
{
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"asins": [
"string"
],
"lag_days": 0
}
HaloBrandedSearchRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| start_date | any | false | none | Inclusive window start (YYYY-MM-DD). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_date | any | false | none | Inclusive window end (YYYY-MM-DD). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| asins | any | false | none | Restrict to these ASINs. Omit for every tracked ASIN. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| lag_days | integer | false | none | Shift TikTok views forward N days before correlating. |
HaloBrandedSearchResponse
{
"shop_id": 0,
"start_date": "string",
"end_date": "string",
"lag_days": 0,
"asins": [
"string"
],
"total_search_terms": 0,
"average_click_share": 0,
"peak_date": "string",
"peak_search_terms": 0,
"correlation": {
"channel": "string",
"r": 0,
"p_value": 0,
"label": "string"
},
"top_search_terms": [
"string"
],
"series": [
{
"date": "string",
"search_terms": 0,
"click_share": 0
}
]
}
HaloBrandedSearchResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | integer | true | none | none |
| start_date | string | true | none | none |
| end_date | string | true | none | none |
| lag_days | integer | true | none | none |
| asins | any | false | none | The ASIN filter applied, echoed back. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| total_search_terms | any | false | none | Sum of daily branded-search volume. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| average_click_share | any | false | none | Mean of the daily click-share values. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| peak_date | any | false | none | Date of the highest branded-search volume. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| peak_search_terms | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| correlation | any | false | none | TikTok views vs branded search at the requested lag. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | HaloCorrelation | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| top_search_terms | any | false | none | Always null. Amazon's report gives us branded-search VOLUME per ASIN per day, not the query strings, so no term list exists to return. Reserved so the field can be populated without a breaking change if term-level data is ever ingested. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| series | [HaloBrandedSearchPoint] | true | none | none |
HaloChannelsResponse
{
"shop_id": 0,
"tiktok": true,
"amazon": true,
"shopify": true,
"branded_search": true,
"amazon_has_data": true,
"shopify_has_data": true
}
HaloChannelsResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | integer | true | none | none |
| tiktok | boolean | true | none | TikTok analytics have been collected. |
| amazon | boolean | true | none | An active Amazon (SP-API) auth exists. |
| shopify | boolean | true | none | An active Shopify auth exists. |
| branded_search | boolean | true | none | Amazon branded-search rows exist for this shop. |
| amazon_has_data | boolean | true | none | Amazon revenue rows exist. False while amazon is true means the connection is live but the first backfill is still running. |
| shopify_has_data | boolean | true | none | Shopify revenue rows exist (same connected-vs-synced split). |
HaloCorrelation
{
"channel": "string",
"r": 0,
"p_value": 0,
"label": "string"
}
HaloCorrelation
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| channel | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| r | any | false | none | Pearson r, 4 dp. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| p_value | any | false | none | Two-sided p-value, 6 dp. Below 0.05 is the usual bar. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| label | any | false | none | Very Weak / Weak / Moderate / Strong / Very Strong. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
HaloProductsResponse
{
"shop_id": 0,
"amazon": [
{
"asin": "string",
"marketplace_id": "string"
}
],
"shopify": [
{
"product_id": "string",
"product_name": "string"
}
]
}
HaloProductsResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | integer | true | none | none |
| amazon | any | false | none | Null when Amazon was not requested. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [HaloAmazonProduct] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shopify | any | false | none | Null when Shopify was not requested. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [HaloShopifyProduct] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
HaloShopifyProduct
{
"product_id": "string",
"product_name": "string"
}
HaloShopifyProduct
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
HaloTimeseriesResponse
{
"shop_id": 0,
"start_date": "string",
"end_date": "string",
"dates": [
"string"
],
"tiktok_views": [
0
],
"tiktok_gmv": [
0
],
"amazon_revenue": [
0
],
"shopify_revenue": [
0
],
"branded_search_terms": [
0
],
"branded_search_click_share": [
0
]
}
HaloTimeseriesResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | integer | true | none | none |
| start_date | string | true | none | none |
| end_date | string | true | none | none |
| dates | [string] | true | none | Contiguous date axis; every series aligns. |
| tiktok_views | [anyOf] | true | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| tiktok_gmv | [anyOf] | true | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| amazon_revenue | [anyOf] | true | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shopify_revenue | [anyOf] | true | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| branded_search_terms | [anyOf] | true | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| branded_search_click_share | [anyOf] | true | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
HaloViralVideo
{
"video_id": "string",
"title": "string",
"video_url": "string",
"thumbnail": "string",
"views": 0,
"units_sold": 0,
"video_gmv": 0,
"like_count": 0,
"comment_count": 0,
"share_count": 0,
"creator_name": "string",
"posted_date": "string"
}
HaloViralVideo
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| title | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video_url | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| thumbnail | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| views | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| units_sold | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video_gmv | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| like_count | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| comment_count | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| share_count | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| posted_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
HaloViralVideosResponse
{
"shop_id": 0,
"date": "string",
"videos": [
{
"video_id": "string",
"title": "string",
"video_url": "string",
"thumbnail": "string",
"views": 0,
"units_sold": 0,
"video_gmv": 0,
"like_count": 0,
"comment_count": 0,
"share_count": 0,
"creator_name": "string",
"posted_date": "string"
}
]
}
HaloViralVideosResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | integer | true | none | none |
| date | string | true | none | none |
| videos | [HaloViralVideo] | true | none | none |
HaloWindowRequest
{
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"amazon_asins": [
"string"
],
"shopify_product_ids": [
"string"
]
}
HaloWindowRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| start_date | any | false | none | Inclusive window start (YYYY-MM-DD). Defaults to 29 days before end_date (a 30-day window). Max window 366 days. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_date | any | false | none | Inclusive window end (YYYY-MM-DD). Defaults to yesterday — today's revenue rows have not been pulled yet. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| amazon_asins | any | false | none | Restrict Amazon revenue and branded search to these ASINs. Omit for the shop total. Values come from GET /halo/products. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shopify_product_ids | any | false | none | Restrict Shopify revenue to these product IDs. Omit for the shop total. Values come from GET /halo/products. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
HashtagAutocompleteResponse
{
"region": "US",
"query": "string",
"results": [
{
"hashtag": "string",
"creator_count": 0
}
]
}
HashtagAutocompleteResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| region | Region | true | none | none |
| query | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| results | [HashtagOption] | true | none | none |
HashtagOption
{
"hashtag": "string",
"creator_count": 0
}
HashtagOption
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| hashtag | string | true | none | none |
| creator_count | integer | true | none | none |
IdealProfileRef
{
"id": 0,
"name": "string"
}
IdealProfileRef
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| id | integer | true | none | none |
| name | string | true | none | none |
ImageBriefBrandAnalyzeRequest
{
"website_url": "string",
"refresh": false
}
ImageBriefBrandAnalyzeRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| website_url | string | true | none | The brand's public website URL to scrape and analyse (e.g. https://www.thebean.com). |
| refresh | boolean | false | none | Re-run the analysis even if a profile already exists for this URL. |
ImageBriefBrandVoiceRequest
{
"voice_descriptors": [
"string"
]
}
ImageBriefBrandVoiceRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| voice_descriptors | [string] | false | none | none |
ImageBriefCreateRequest
{
"product_ids": [
"string"
],
"template_id": "editorial-dark",
"accent_color": "string",
"main_header_background": "string",
"name": "string",
"content": {
"kicker": "",
"signatureHooks": [
"string"
],
"winningHooks": [
{
"text": "string",
"lead": true
}
],
"socialProof": [
"string"
],
"benefits": [
{
"term": "string",
"detail": "string"
}
],
"contentIdeas": [
{
"title": "string",
"detail": "string"
}
],
"shopTagline": ""
},
"image_overrides": {}
}
ImageBriefCreateRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_ids | [string] | false | none | none |
| template_id | string | false | none | none |
| accent_color | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| main_header_background | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| content | BriefContent | false | none | none |
| image_overrides | object | false | none | none |
ImageBriefDeleteData
{
"brief_id": 0,
"deleted": true
}
ImageBriefDeleteData
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| brief_id | integer | true | none | none |
| deleted | boolean | true | none | none |
ImageBriefDeleteResponse
{
"data": {
"brief_id": 0,
"deleted": true
},
"dry_run": false
}
ImageBriefDeleteResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | ImageBriefDeleteData | true | none | none |
| dry_run | boolean | false | none | none |
ImageBriefGenerateRequest
{
"product_ids": [
"string"
]
}
ImageBriefGenerateRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_ids | [string] | true | none | Products to build the brief from; index 0 is the hero. At most 3. |
ImageBriefGenerateResponse
{
"data": {
"kicker": "",
"signatureHooks": [
"string"
],
"winningHooks": [
{
"text": "string",
"lead": true
}
],
"socialProof": [
"string"
],
"benefits": [
{
"term": "string",
"detail": "string"
}
],
"contentIdeas": [
{
"title": "string",
"detail": "string"
}
],
"shopTagline": ""
},
"dry_run": false
}
ImageBriefGenerateResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | BriefContent | true | none | none |
| dry_run | boolean | false | none | none |
ImageBriefUpdateRequest
{
"product_ids": [
"string"
],
"template_id": "string",
"accent_color": "string",
"main_header_background": "string",
"name": "string",
"content": {
"kicker": "",
"signatureHooks": [
"string"
],
"winningHooks": [
{
"text": "string",
"lead": true
}
],
"socialProof": [
"string"
],
"benefits": [
{
"term": "string",
"detail": "string"
}
],
"contentIdeas": [
{
"title": "string",
"detail": "string"
}
],
"shopTagline": ""
},
"image_overrides": {},
"status": "draft"
}
ImageBriefUpdateRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_ids | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| template_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| accent_color | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| main_header_background | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| content | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | BriefContent | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| image_overrides | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | object | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| status | any | false | none | New lifecycle state, or omit to leave unchanged. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | draft |
| anonymous | published |
| anonymous | archived |
ImageBriefWriteResponse
{
"data": {
"id": 0,
"shop_id": 0,
"product_ids": [
null
],
"template_id": "string",
"accent_color": "string",
"main_header_background": "string",
"name": "string",
"content": {
"kicker": "",
"signatureHooks": [
"string"
],
"winningHooks": [
{
"text": "string",
"lead": true
}
],
"socialProof": [
"string"
],
"benefits": [
{
"term": "string",
"detail": "string"
}
],
"contentIdeas": [
{
"title": "string",
"detail": "string"
}
],
"shopTagline": ""
},
"image_overrides": {},
"status": "string",
"created_by_email": "string",
"created_at": "string",
"updated_at": "string",
"products": [
{
"id": "string",
"name": "",
"brand": "",
"price": "",
"image": ""
}
]
},
"dry_run": false
}
ImageBriefWriteResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | BriefResponse | true | none | none |
| dry_run | boolean | false | none | none |
ImageContent
{
"url": "string",
"width": 0,
"height": 0
}
ImageContent
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| url | string | true | none | none |
| width | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| height | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
InstagramBusinessDiscoveryResponse
{
"username": "string",
"name": "",
"biography": "",
"profile_picture_url": "",
"followers_count": 0,
"media_count": 0,
"ig_user_id": ""
}
InstagramBusinessDiscoveryResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| username | string | true | none | The resolved IG handle, without the @. |
| name | string | false | none | Display name; empty when unset. |
| biography | string | false | none | Profile bio text. |
| profile_picture_url | string | false | none | Meta-hosted avatar URL. These are short-lived signed URLs — re-fetch rather than storing them. |
| followers_count | integer | false | none | Public follower count. |
| media_count | integer | false | none | Public post count. |
| ig_user_id | string | false | none | The looked-up account's IG user ID (not this shop's). |
InstagramOwnMediaResponse
{
"data": [
{}
]
}
InstagramOwnMediaResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | [object] | false | none | Up to 24 of the connected account's most recent IG posts, newest first. Each row carries id, caption, media_type, media_url, thumbnail_url, permalink, timestamp, like_count and comments_count as Meta returns them — the shape is passed through so new Graph fields appear without an API change. |
IntegrationStatus
{
"key": "string",
"status": "string",
"connected_at": "string"
}
IntegrationStatus
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| key | string | true | none | Integration identifier — e.g. tiktok_shop_affiliate, tiktok_shop_customer_service, tiktok_for_business, amazon, shopify, discord, meta, slack. |
| status | string | true | none | connected, disconnected, or coming_soon for an integration that isn't available to this shop yet. |
| connected_at | any | false | none | ISO-8601 timestamp of when the connection was established; null unless status is connected. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
IntegrationsStatusResponse
{
"shop_id": 0,
"integrations": [
{
"key": "string",
"status": "string",
"connected_at": "string"
}
]
}
IntegrationsStatusResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | integer | true | none | Shop the matrix describes. |
| integrations | [IntegrationStatus] | true | none | One row per integration offered to this shop. |
LeaderboardCreatorItem
{
"creator_id": "string",
"creator_handle": "string",
"total_video_gmv": 0,
"total_units_sold": 0,
"qualifying_video_count": 0,
"products": [
{
"product_id": "string",
"product_name": "string",
"video_gmv": 0,
"units_sold": 0,
"video_count": 0
}
]
}
LeaderboardCreatorItem
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_handle | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| total_video_gmv | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| total_units_sold | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| qualifying_video_count | integer | false | none | DISTINCT video_id count for this creator across the selected products — a video spanning several selected products counts once. |
| products | [LeaderboardProductBreakdown] | false | none | [One product's contribution to a creator's leaderboard row. GMV/units are summed over the creator's qualifying video-product rows for this product; video_count is the DISTINCT video_id count for this product.] |
LeaderboardPricing
{
"campaign_type": "leaderboard",
"leaderboard_ranks": [
{
"rank": 1,
"reward": 0
}
],
"reward_type": "cash",
"metric_type": "gmv",
"scoring_mode": "single",
"weighted_metrics": [
{
"metric_type": "gmv",
"weight": 100
}
],
"minimum_gmv_required": 0,
"minimum_views_required": 0,
"minimum_videos_required": 0,
"minimum_live_gmv_required": 0,
"minimum_sessions_required": 0
}
LeaderboardPricing
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| campaign_type | string | false | none | none |
| leaderboard_ranks | [LeaderboardRank] | true | none | At least one rank required |
| reward_type | RewardType | true | none | Cash or custom reward |
| metric_type | string | false | none | Performance metric to evaluate |
| scoring_mode | string | false | none | Rank by a single metric or by a weighted composite score |
| weighted_metrics | any | false | none | Metric weights (must sum to 100) when scoring_mode is weighted |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [WeightedMetricItem] | false | none | [One metric + weight entry in a weighted leaderboard.extra="forbid": template pricing JSONB round-trips through themicro-challenge materializer — unknown keys must not smuggle through.] |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| minimum_gmv_required | any | false | none | Minimum GMV threshold (when metric includes gmv) |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| minimum_views_required | any | false | none | Minimum views threshold (when metric is views) |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| minimum_videos_required | any | false | none | Minimum videos floor (gmv_videos gate; ranking stays by GMV) |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| minimum_live_gmv_required | any | false | none | Minimum LIVE GMV floor (when metric is live_gmv) |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| minimum_sessions_required | any | false | none | Minimum LIVE sessions floor (weighted gate on a sessions weight) |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| metric_type | gmv |
| metric_type | views |
| metric_type | videos_posted |
| metric_type | gmv_videos |
| metric_type | live_gmv |
| metric_type | gmv_and_live_gmv |
| metric_type | videos_gmv_and_live_gmv |
| scoring_mode | single |
| scoring_mode | weighted |
LeaderboardProductBreakdown
{
"product_id": "string",
"product_name": "string",
"video_gmv": 0,
"units_sold": 0,
"video_count": 0
}
LeaderboardProductBreakdown
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video_gmv | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| units_sold | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video_count | integer | false | none | none |
LeaderboardRank
{
"rank": 1,
"reward": 0
}
LeaderboardRank
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| rank | integer | true | none | Rank position (1-indexed) |
| reward | any | true | none | Reward for this rank |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
LeaderboardReward
{
"kind": "leaderboard",
"mode": "rank",
"contest_ranks": [
{
"rank": 1,
"reward": 0
}
],
"tiers": [
{
"name": "string",
"bonus": 0,
"threshold": 0,
"videos_required": 0,
"num_winners": 0
}
],
"random_winner_wheel": false,
"scoring_mode": "single",
"weighted_metrics": [
{
"metric_type": "gmv",
"weight": 100
}
],
"metric_type": "gmv",
"gmv_floor": 0,
"videos_floor": 0,
"live_gmv_floor": 0,
"sessions_floor": 0,
"payment_due_days": 30
}
LeaderboardReward
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| kind | string | true | none | none |
| mode | string | true | none | none |
| contest_ranks | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [ContestRank] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| tiers | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [LeaderboardTier] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| random_winner_wheel | boolean | false | none | none |
| scoring_mode | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| weighted_metrics | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [ContractWeightedMetric] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| metric_type | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| gmv_floor | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| videos_floor | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| live_gmv_floor | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sessions_floor | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| payment_due_days | integer | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| mode | rank |
| mode | tier |
| anonymous | single |
| anonymous | weighted |
| anonymous | gmv |
| anonymous | views |
| anonymous | videos_posted |
| anonymous | gmv_videos |
| anonymous | live_gmv |
| anonymous | gmv_and_live_gmv |
| anonymous | videos_gmv_and_live_gmv |
LeaderboardStanding
{
"rank": 0,
"creator_id": "string",
"handle": "string",
"creator_name": "string",
"avatar_url": "string",
"composite_score": 0,
"score_breakdown": [
{
"metric_type": "string",
"weight": 0,
"contribution": 0,
"raw_value": 0
}
],
"gmv": 0,
"views": 0,
"videos_posted": 0,
"units_sold": 0,
"avg_views_per_post": 0,
"live_gmv": 0,
"live_session_count": 0,
"combined_gmv": 0,
"frozen": false
}
LeaderboardStanding
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| rank | any | false | none | Compacted prize rank, 1-indexed. Null when the creator is disqualified by the campaign's minimum-activity requirement (unranked). Disqualified creators don't consume a prize place; tied creators share one (the following rank skips accordingly, e.g. 1, 1, 3), so each rank agrees with the prize it pays. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_id | any | false | none | Reacher creator-account id. Null only for a legacy mapping row with no linked account. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| handle | string | true | none | Display handle: TikTok username, else full name, else Creator. |
| creator_name | any | false | none | Creator's full name. Null when no name is on file. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| avatar_url | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| composite_score | any | false | none | 0-100 weighted composite. Null for single-metric campaigns (rank comes straight from metric_type). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| score_breakdown | any | false | none | Per-metric contribution breakdown. Null for single-metric campaigns. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [ScoreBreakdownItem] | false | none | [One metric's contribution to a creator's weighted composite score. Present only for weighted leaderboards. contribution isweight/100 × (raw_value / top_performer_raw × 100) — the pointsthis metric added to the composite; the sum of every item's contribution equals the creator's composite_score.] |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| gmv | number | true | none | Video-attributed GMV in the shop currency. Meaning is unchanged by LIVE metrics — see live_gmv/combined_gmv. |
| views | integer | false | none | none |
| videos_posted | integer | false | none | none |
| units_sold | integer | false | none | none |
| avg_views_per_post | number | false | none | views / videos_posted, 0 when no videos. |
| live_gmv | number | false | none | LIVE GMV attributed to this creator, restricted to the campaign's products. 0 for campaigns with no LIVE metric. |
| live_session_count | integer | false | none | In-window LIVE sessions that sold a campaign product. |
| combined_gmv | number | false | none | gmv + live_gmv. The ranking value for the gmv_and_live_gmv and videos_gmv_and_live_gmv metrics. |
| frozen | boolean | false | none | True when this standing is pinned by the campaign's locked board and can no longer change. False on a live board, and for a creator added after the lock (live values, listed after the locked standings). |
LeaderboardTier
{
"name": "string",
"bonus": 0,
"threshold": 0,
"videos_required": 0,
"num_winners": 0
}
LeaderboardTier
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| name | string | true | none | none |
| bonus | any | true | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| threshold | number | true | none | none |
| videos_required | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| num_winners | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
ListMembersResponse
{
"data": {
"list_id": "string",
"name": "string",
"description": "string",
"creator_count": 0,
"email_count": 0,
"state": "string",
"created_at": "string",
"updated_at": "string"
},
"creator_handles": [
"string"
],
"creator_emails": [
"string"
]
}
ListMembersResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | ListResource | true | none | A Lists row (vault_files). Used across all 4 automation types. |
| creator_handles | [string] | true | none | none |
| creator_emails | [string] | true | none | none |
ListResource
{
"list_id": "string",
"name": "string",
"description": "string",
"creator_count": 0,
"email_count": 0,
"state": "string",
"created_at": "string",
"updated_at": "string"
}
ListResource
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| list_id | string | true | none | vault_files.resource_id |
| name | string | true | none | none |
| description | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_count | integer | true | none | none |
| email_count | integer | true | none | none |
| state | string | true | none | active |
| created_at | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| updated_at | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
ListResponse
{
"data": {
"list_id": "string",
"name": "string",
"description": "string",
"creator_count": 0,
"email_count": 0,
"state": "string",
"created_at": "string",
"updated_at": "string"
}
}
ListResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | ListResource | true | none | A Lists row (vault_files). Used across all 4 automation types. |
ListSampleRequestsResponse
{
"data": [
{
"creator": {
"id": "string",
"handle": "string",
"name": "string",
"creatorImage": "string",
"followers": 0,
"creatorLevel": "string",
"fastGrowing": true,
"isRisingStar": true,
"returning": true,
"tags": [
"string"
]
},
"products": [
{
"applyId": "string",
"productId": "string",
"name": "string",
"sku": "string",
"variantName": "string",
"productImage": "string",
"status": "string",
"qty": 1,
"isRepeatedRequest": true,
"isArchived": false,
"expiresInDays": 0,
"commissionRate": 0,
"stock": 0,
"sampleAllowanceLeft": 0,
"requestedAt": "string",
"expiresAt": "string",
"isExpired": false
}
],
"aggregated": {
"unfulfilled": 0,
"postRate": 0,
"avgViews": 0,
"ppsScore": 0,
"liveGmv": 0,
"engagementRate": 0,
"shopGmv": 0,
"creatorGmv": 0,
"avgGmvPerVideo": 0,
"gmvPerSample": 0,
"videosPerSample": 0
},
"productCount": 0,
"requestDate": "string",
"expiresInDays": 0,
"source": "string"
}
],
"pagination": {
"page": 0,
"perPage": 0,
"totalItems": 0,
"totalPages": 0
},
"archivedCount": {
"creators": 0,
"products": 0,
"total": 0
},
"expiringCount": 0,
"lastUpdatedAt": "string",
"dataFreshness": {
"lastSyncedAt": "string",
"isStale": false,
"isRefreshing": false
}
}
ListSampleRequestsResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | [SampleRequestRow] | true | none | none |
| pagination | modules__sample_requests__SampleRequestsV2Schemas__Pagination | true | none | none |
| archivedCount | ArchivedCount | false | none | none |
| expiringCount | integer | false | none | none |
| lastUpdatedAt | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| dataFreshness | DataFreshness | false | none | none |
ListsPaginatedResponse
{
"data": [
{
"list_id": "string",
"name": "string",
"description": "string",
"creator_count": 0,
"email_count": 0,
"state": "string",
"created_at": "string",
"updated_at": "string"
}
],
"pagination": null
}
ListsPaginatedResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | [ListResource] | true | none | [A Lists row (vault_files). Used across all 4 automation types.] |
| pagination | any | true | none | none |
LiveGMVChallengePricing
{
"campaign_type": "live_gmv_challenge",
"payment_tiers": [
{
"threshold": 0,
"compensation": 0,
"videos_required": 0,
"sessions_required": 0
}
],
"reward_type": "cash",
"metric_type": "live_gmv",
"minimum_live_gmv_required": 0,
"minimum_sessions_required": 0,
"ranking_priority": "live_gmv"
}
LiveGMVChallengePricing
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| campaign_type | string | false | none | none |
| payment_tiers | [LivePaymentTier] | true | none | At least one tier required |
| reward_type | RewardType | true | none | Cash or custom reward |
| metric_type | string | false | none | Live performance metric to evaluate |
| minimum_live_gmv_required | any | false | none | Minimum LIVE GMV floor (sessions_and_live_gmv gate) |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| minimum_sessions_required | any | false | none | Minimum sessions floor (sessions_and_live_gmv gate) |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| ranking_priority | any | false | none | Primary ranking metric for sessions_and_live_gmv contests; the other is a per-tier requirement |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| metric_type | live_gmv |
| metric_type | sessions |
| metric_type | sessions_and_live_gmv |
| anonymous | live_gmv |
| anonymous | sessions |
LivePaymentTier
{
"threshold": 0,
"compensation": 0,
"videos_required": 0,
"sessions_required": 0
}
LivePaymentTier
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| threshold | number | true | none | Metric threshold for this tier |
| compensation | any | true | none | Payout at this tier |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| videos_required | any | false | none | Number of videos required for this tier |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sessions_required | any | false | none | Number of live sessions required for this tier (sessions_and_live_gmv metric) |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
LiveSessionProductBreakdown
{
"product_id": "string",
"product_name": "string",
"cover": "string",
"categories": null,
"live_gmv": 0,
"items_sold": 0,
"orders": 0,
"avg_order_value": 0,
"commission": 0,
"refunded_gmv": 0,
"refunded_items": 0
}
LiveSessionProductBreakdown
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_id | string | true | none | none |
| product_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| cover | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| categories | any | false | none | none |
| live_gmv | number | false | none | none |
| items_sold | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| orders | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| avg_order_value | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| commission | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| refunded_gmv | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| refunded_items | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
LiveSessionProducts
{
"live_session_id": "string",
"products": [
{
"product_id": "string",
"product_name": "string",
"cover": "string",
"categories": null,
"live_gmv": 0,
"items_sold": 0,
"orders": 0,
"avg_order_value": 0,
"commission": 0,
"refunded_gmv": 0,
"refunded_items": 0
}
]
}
LiveSessionProducts
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| live_session_id | string | true | none | none |
| products | [LiveSessionProductBreakdown] | false | none | [One product sold inside one LIVE session.] |
LiveSessionProductsRequest
{
"live_session_ids": [
"string"
]
}
LiveSessionProductsRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| live_session_ids | [string] | true | none | LIVE session IDs to break down — the key field of a POST /lives/list row. Up to 50 per request. |
LiveSessionProductsResponse
{
"shop_id": 0,
"sessions": [
{
"live_session_id": "string",
"products": [
{
"product_id": "string",
"product_name": "string",
"cover": "string",
"categories": null,
"live_gmv": 0,
"items_sold": 0,
"orders": 0,
"avg_order_value": 0,
"commission": 0,
"refunded_gmv": 0,
"refunded_items": 0
}
]
}
]
}
LiveSessionProductsResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | integer | true | none | none |
| sessions | [LiveSessionProducts] | false | none | none |
LivesFilters
{
"gmv": {
"min": 0,
"max": 0
},
"views": {
"min": 0,
"max": 0
},
"duration": {
"min": 0,
"max": 0
},
"unitsSold": {
"min": 0,
"max": 0
},
"likes": {
"min": 0,
"max": 0
},
"comments": {
"min": 0,
"max": 0
},
"ctr": {
"min": 0,
"max": 0
},
"engagementRate": {
"min": 0,
"max": 0
}
}
LivesFilters
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| gmv | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | RangeFilter | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| views | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | RangeFilter | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| duration | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | RangeFilter | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| unitsSold | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | RangeFilter | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| likes | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | RangeFilter | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| comments | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | RangeFilter | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| ctr | any | false | none | Click-through rate in percent (0-100). Converted to 0-1 in query layer. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | RangeFilter | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| engagementRate | any | false | none | Engagement rate in percent (0-100). Converted to 0-1 in query layer. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | RangeFilter | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
LivesListRequest
{
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"page": 1,
"page_size": 20,
"sort_by": "live_gmv",
"sort_dir": "asc"
}
LivesListRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| start_date | any | false | none | Inclusive window start (YYYY-MM-DD). Defaults to 29 days before end_date. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_date | any | false | none | Inclusive window end (YYYY-MM-DD). Defaults to today. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| page | integer | false | none | none |
| page_size | integer | false | none | none |
| sort_by | string | false | none | none |
| sort_dir | string | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| sort_by | live_gmv |
| sort_by | start_time |
| sort_by | units_sold |
| sort_by | views |
| sort_dir | asc |
| sort_dir | desc |
LivesListResponse
{
"shop_id": 0,
"currency_code": "string",
"start_date": "string",
"end_date": "string",
"page": 0,
"page_size": 0,
"total": 0,
"sessions": [
{
"live_session_id": "string",
"title": "string",
"creator_handle": "string",
"start_time": "string",
"end_time": "string",
"duration_seconds": 0,
"live_gmv": 0,
"units_sold": 0,
"views": 0,
"likes": 0,
"comments": 0,
"ctr": 0,
"engagement_rate": 0,
"new_followers": 0,
"avg_viewing_duration": 0
}
]
}
LivesListResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | integer | true | none | none |
| currency_code | any | false | none | ISO currency code for the window; null when empty or mixed. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| start_date | string | true | none | none |
| end_date | string | true | none | none |
| page | integer | true | none | none |
| page_size | integer | true | none | none |
| total | integer | true | none | Total number of affiliate LIVE sessions matching the window. |
| sessions | [LivesSessionItem] | true | none | One entry per affiliate LIVE session on this page. Empty when the shop has no live-session data for the window (data-presence rollout — empty is a normal, non-error state). |
LivesMetricCardsRequest
{
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"filters": {
"gmv": {
"min": 0,
"max": 0
},
"views": {
"min": 0,
"max": 0
},
"duration": {
"min": 0,
"max": 0
},
"unitsSold": {
"min": 0,
"max": 0
},
"likes": {
"min": 0,
"max": 0
},
"comments": {
"min": 0,
"max": 0
},
"ctr": {
"min": 0,
"max": 0
},
"engagementRate": {
"min": 0,
"max": 0
}
},
"search": "string"
}
LivesMetricCardsRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| start_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| filters | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | LivesFilters | false | none | Maps to the frontend filter sliders (ACU/PCU dropped — no data source). |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| search | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
LivesMetricsResponse
{
"success": true,
"metrics": [
{
"label": "string",
"value": 0,
"unit": "string",
"change": 0,
"comparison_text": "string",
"tooltip_text": "string",
"chart_data": [
0
]
}
]
}
LivesMetricsResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| success | boolean | false | none | none |
| metrics | [MetricCard] | true | none | none |
LivesSessionItem
{
"live_session_id": "string",
"title": "string",
"creator_handle": "string",
"start_time": "string",
"end_time": "string",
"duration_seconds": 0,
"live_gmv": 0,
"units_sold": 0,
"views": 0,
"likes": 0,
"comments": 0,
"ctr": 0,
"engagement_rate": 0,
"new_followers": 0,
"avg_viewing_duration": 0
}
LivesSessionItem
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| live_session_id | string | true | none | none |
| title | any | false | none | LIVE session title. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_handle | any | false | none | Creator username hosting the LIVE. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| start_time | any | false | none | ISO 8601 UTC start of the LIVE session. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_time | any | false | none | ISO 8601 UTC end of the LIVE session. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| duration_seconds | any | false | none | LIVE session duration in seconds. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| live_gmv | any | false | none | Creator LIVE-attributed GMV (affiliate_gmv) for this session. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| units_sold | any | false | none | Affiliate units sold in this session. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| views | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| likes | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| comments | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| ctr | any | false | none | Click-through rate as a decimal 0.0–1.0 (stored value, else product_clicks / product_impressions). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| engagement_rate | any | false | none | Engagement rate as a decimal 0.0–1.0+ (stored value, else (likes+comments+shares) / views). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| new_followers | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| avg_viewing_duration | any | false | none | Average viewing duration in seconds for this session. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
LivesSummaryRequest
{
"start_date": "2019-08-24",
"end_date": "2019-08-24"
}
LivesSummaryRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| start_date | any | false | none | Inclusive window start (YYYY-MM-DD). Defaults to 29 days before end_date (30-day window). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_date | any | false | none | Inclusive window end (YYYY-MM-DD). Defaults to today (live sessions can land same-day, unlike the Seller Center daily rollup). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
LivesSummaryResponse
{
"shop_id": 0,
"currency_code": "string",
"start_date": "string",
"end_date": "string",
"live_count": 0,
"live_gmv": 0,
"items_sold": 0,
"avg_engagement_rate": 0,
"avg_viewing_duration": 0
}
LivesSummaryResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | integer | true | none | none |
| currency_code | any | false | none | ISO currency code applying to the window (e.g. 'USD', 'GBP'). null when the window has no live-session data or (defensively) when rows somehow mix currencies for the same shop. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| start_date | string | true | none | none |
| end_date | string | true | none | none |
| live_count | integer | true | none | Number of affiliate LIVE sessions in the window. |
| live_gmv | number | true | none | SUM of creator LIVE-attributed GMV (affiliate_gmv) across the window — the Affiliate Center LIVE value. |
| items_sold | integer | true | none | SUM of affiliate units sold across LIVE sessions. |
| avg_engagement_rate | any | false | none | Window-level engagement rate as a decimal (0.0–1.0+): SUM(likes+comments+shares) / SUM(views). null when views are 0. Not the average of per-session rates. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| avg_viewing_duration | any | false | none | Average viewing duration in seconds across LIVE sessions; null when empty. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
MediaInsightsResponse
{
"media_id": "string",
"metrics": {}
}
MediaInsightsResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| media_id | string | true | none | none |
| metrics | object | false | none | none |
MentionTarget
{
"type": "none",
"role_id": "string"
}
MentionTarget
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| type | string | false | none | none |
| role_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| type | none |
| type | here |
| type | everyone |
| type | role |
MessageAddon
{
"type": "message",
"body": "string",
"image_url": "string",
"product_id": "string",
"submission_url_slug": "string"
}
MessageAddon
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| type | string | true | none | none |
| body | any | false | none | Message body (REQUIRED for type=message and type=text_with_image). Supports {creator_name} placeholder. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| image_url | any | false | none | Hosted HTTPS URL of the image (REQUIRED for type=image and type=text_with_image). Reacher fetches this URL server-side and re-hosts on the internal CDN — file uploads (multipart) are NOT accepted. Reject if http://, data:, blob:, or scheme-relative. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_id | any | false | none | Product ID (REQUIRED for type=product_card; OPTIONAL for type=target_invite). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| submission_url_slug | any | false | none | Spark code form slug (REQUIRED for type=spark_code_form). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| type | message |
| type | image |
| type | text_with_image |
| type | product_card |
| type | spark_code_form |
| type | target_invite |
MetaAdsCampaignDetailResponse
{
"campaign": {
"id": "string",
"short_id": "string",
"shop_id": 0,
"name": "string",
"status": "string",
"commission_base": "string",
"commission_rate": 0,
"commission_cap_cents": 0,
"attribution_window": "string",
"start_date": "string",
"end_date": "string",
"usage_grant_on": true,
"whitelist_grant_on": true,
"whitelist_path": "spark_code",
"created_at": "string",
"updated_at": "string",
"active_creators": 0,
"attributed_revenue_cents": 0,
"commission_owed_cents": 0
},
"roster": [
{
"campaign_id": "string",
"creator_id": "string",
"invite_status": "string",
"invited_at": "string",
"accepted_at": "string",
"activated_at": "string",
"partnership_ad_code": "string",
"whitelist_granted": false,
"creator_handle": "string",
"creator_name": "string",
"avatar_url": "string"
}
],
"currency": "string"
}
MetaAdsCampaignDetailResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| campaign | MetaAdsCampaignItem | true | none | A Meta Ads rev-share campaign. The rollup fields (active_creators,attributed_revenue_cents, commission_owed_cents) are populated on thelist endpoint and are null on endpoints that don't aggregate them. |
| roster | [MetaAdsRosterEntry] | false | none | [One creator's opt-in state within a campaign.] |
| currency | any | false | none | ISO 4217 currency of the shop's Meta ad account for the campaign's cents fields; null when no ad account is connected. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
MetaAdsCampaignItem
{
"id": "string",
"short_id": "string",
"shop_id": 0,
"name": "string",
"status": "string",
"commission_base": "string",
"commission_rate": 0,
"commission_cap_cents": 0,
"attribution_window": "string",
"start_date": "string",
"end_date": "string",
"usage_grant_on": true,
"whitelist_grant_on": true,
"whitelist_path": "spark_code",
"created_at": "string",
"updated_at": "string",
"active_creators": 0,
"attributed_revenue_cents": 0,
"commission_owed_cents": 0
}
MetaAdsCampaignItem
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| id | string | true | none | Campaign UUID. |
| short_id | string | true | none | 12-char slug used in the public creator join link. |
| shop_id | integer | true | none | none |
| name | string | true | none | none |
| status | string | true | none | draft |
| commission_base | string | true | none | What the commission is a percentage of: 'attributed_revenue' (purchase conversion value from Meta insights) or 'ad_spend'. |
| commission_rate | number | true | none | Percent, e.g. 3.0 = 3%. |
| commission_cap_cents | any | false | none | Per-creator commission cap in cents, if set. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| attribution_window | string | true | none | Meta attribution window, e.g. '7-day click'. |
| start_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| usage_grant_on | boolean | true | none | Campaign requests a usage-rights grant from creators. |
| whitelist_grant_on | boolean | true | none | Campaign requests a Partnership-ads whitelist grant. |
| whitelist_path | string | false | none | 'spark_code' (Path A) or 'business_access' (Path B). |
| created_at | string | true | none | none |
| updated_at | string | true | none | none |
| active_creators | any | false | none | Distinct creators on the leaderboard (accepted/active roster plus cherry-picked media-library creators). Null unless the endpoint aggregates it (list endpoint). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| attributed_revenue_cents | any | false | none | Lifetime attributed purchase-conversion value, cents. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| commission_owed_cents | any | false | none | Unpaid commission owed (ledger status pending+approved), cents. Null unless the endpoint aggregates it. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
MetaAdsCampaignRollupsResponse
{
"totals": {
"gmv_cents": 0,
"views": 0,
"gmv_per_video_cents": 0,
"ad_spend_cents": 0,
"commission_owed_cents": 0,
"ads": 0
},
"creators": [
{
"creator_id": "string",
"rank": 0,
"creator_handle": "string",
"creator_name": "string",
"avatar_url": "string",
"instagram_handle": "string",
"invite_status": "string",
"gmv_cents": 0,
"ad_spend_cents": 0,
"payout_earned_cents": 0,
"payout_outstanding_cents": 0,
"payout_payable_cents": 0,
"payout_status": "paid",
"videos": 0,
"views": 0,
"whitelist_granted": true,
"whitelist_status": "string"
}
],
"creator_total": 0,
"filtered_total": 0,
"page": 1,
"page_size": 100,
"total_pages": 1,
"currency": "string"
}
MetaAdsCampaignRollupsResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| totals | MetaAdsRollupTotals | false | none | 5 summary-card totals for the campaign Creators tab. Every metric is Meta-side (from the attribution ledger); TikTok organic stats are not mixed in. |
| creators | [MetaAdsLeaderboardRow] | false | none | One page of the ranked leaderboard. |
| creator_total | integer | false | none | Creators on the campaign across all pages, unaffected by search. |
| filtered_total | integer | false | none | Creators matching the request's search across all pages — the paging denominator. Equals creator_total when no search is set. |
| page | integer | false | none | 1-indexed page these creators came from. |
| page_size | integer | false | none | Rows requested per page. |
| total_pages | integer | false | none | Pages available at this page_size. |
| currency | any | false | none | ISO 4217 currency of the shop's connected Meta ad account (all cents amounts are in this currency). Null when no ad account is connected or the currency is unknown. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
MetaAdsCampaignsResponse
{
"campaigns": [
{
"id": "string",
"short_id": "string",
"shop_id": 0,
"name": "string",
"status": "string",
"commission_base": "string",
"commission_rate": 0,
"commission_cap_cents": 0,
"attribution_window": "string",
"start_date": "string",
"end_date": "string",
"usage_grant_on": true,
"whitelist_grant_on": true,
"whitelist_path": "spark_code",
"created_at": "string",
"updated_at": "string",
"active_creators": 0,
"attributed_revenue_cents": 0,
"commission_owed_cents": 0
}
],
"currency": "string"
}
MetaAdsCampaignsResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| campaigns | [MetaAdsCampaignItem] | false | none | [A Meta Ads rev-share campaign. The rollup fields (active_creators,attributed_revenue_cents, commission_owed_cents) are populated on thelist endpoint and are null on endpoints that don't aggregate them.] |
| currency | any | false | none | ISO 4217 currency of the shop's Meta ad account for the cents fields on each campaign; null when no ad account is connected. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
MetaAdsLeaderboardRow
{
"creator_id": "string",
"rank": 0,
"creator_handle": "string",
"creator_name": "string",
"avatar_url": "string",
"instagram_handle": "string",
"invite_status": "string",
"gmv_cents": 0,
"ad_spend_cents": 0,
"payout_earned_cents": 0,
"payout_outstanding_cents": 0,
"payout_payable_cents": 0,
"payout_status": "paid",
"videos": 0,
"views": 0,
"whitelist_granted": true,
"whitelist_status": "string"
}
MetaAdsLeaderboardRow
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_id | string | true | none | none |
| rank | integer | false | none | Position on the whole leaderboard, assigned before any search filter — a filtered page keeps true board positions. |
| creator_handle | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| avatar_url | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| instagram_handle | any | false | none | Normalized Instagram handle, when the creator stored one. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| invite_status | string | true | none | none |
| gmv_cents | integer | false | none | none |
| ad_spend_cents | integer | false | none | none |
| payout_earned_cents | integer | false | none | Lifetime commission earned across all ledger statuses, cents. |
| payout_outstanding_cents | integer | false | none | Unpaid portion only (ledger status pending+approved), cents. |
| payout_payable_cents | integer | false | none | The part of payout_outstanding_cents keyed by a TikTok account the creator is verified to own, cents — what a payout would actually transfer. Lower than outstanding when some earnings sit under a TikTok account not yet linked to this creator. |
| payout_status | string | false | none | ready (payable money and a Stripe account to receive it) |
| videos | integer | false | none | Distinct attributed Meta ads. |
| views | integer | false | none | Sum of Meta ad impressions. |
| whitelist_granted | any | false | none | Partnership-ad whitelist status for this brand: true=approved, false=not approved, null=unknowable (creator has no linked Instagram). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | boolean | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| whitelist_status | any | false | none | Finer lifecycle: no_instagram |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
MetaAdsMediaLibraryItem
{
"usage_right_id": "string",
"asset_id": "string",
"asset_name": "string",
"tracking_code": "string",
"campaign_id": "string",
"created_at": "string"
}
MetaAdsMediaLibraryItem
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| usage_right_id | string | true | none | none |
| asset_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| asset_name | any | false | none | Meta asset name. Ends with RCHR_{tracking_code}; anything before that is the shop's own naming template, so parse the code from tracking_code rather than from this string. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| tracking_code | any | false | none | Stable per-asset code. Use it to build the rc_code / utm_content attribution parameter as RCHR_{tracking_code}. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| campaign_id | any | false | none | Rev-share campaign this asset is assigned to, if any. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| created_at | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
MetaAdsMediaLibraryResponse
{
"items": [
{
"usage_right_id": "string",
"asset_id": "string",
"asset_name": "string",
"tracking_code": "string",
"campaign_id": "string",
"created_at": "string"
}
]
}
MetaAdsMediaLibraryResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| items | [MetaAdsMediaLibraryItem] | false | none | [A creator video uploaded to the brand's Meta ad library.] |
MetaAdsPayoutHistoryItem
{
"id": "string",
"creator_id": "string",
"creator_handle": "string",
"creator_name": "string",
"amount_cents": 0,
"method": "string",
"stripe_transfer_id": "string",
"created_at": "string"
}
MetaAdsPayoutHistoryItem
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| id | string | true | none | none |
| creator_id | string | true | none | none |
| creator_handle | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| amount_cents | integer | true | none | none |
| method | string | true | none | Payout method (V1: 'stripe'). |
| stripe_transfer_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| created_at | string | true | none | none |
MetaAdsPayoutHistoryResponse
{
"history": [
{
"id": "string",
"creator_id": "string",
"creator_handle": "string",
"creator_name": "string",
"amount_cents": 0,
"method": "string",
"stripe_transfer_id": "string",
"created_at": "string"
}
],
"currency": "string"
}
MetaAdsPayoutHistoryResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| history | [MetaAdsPayoutHistoryItem] | false | none | [One logged Stripe transfer to a creator.] |
| currency | any | false | none | ISO 4217 currency of the shop's connected Meta ad account. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
MetaAdsPayoutItem
{
"creator_id": "string",
"creator_handle": "string",
"creator_name": "string",
"balance_owed_cents": 0,
"status": "string",
"tax_status": "unknown",
"last_payout_at": "string"
}
MetaAdsPayoutItem
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_id | string | true | none | none |
| creator_handle | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| balance_owed_cents | integer | false | none | none |
| status | string | true | none | ready (balance owed and a Stripe account to receive it) |
| tax_status | string | false | none | 'complete' |
| last_payout_at | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
MetaAdsPayoutsResponse
{
"payouts": [
{
"creator_id": "string",
"creator_handle": "string",
"creator_name": "string",
"balance_owed_cents": 0,
"status": "string",
"tax_status": "unknown",
"last_payout_at": "string"
}
],
"total_owed_cents": 0,
"ready_cents": 0,
"paid_period_cents": 0,
"currency": "string"
}
MetaAdsPayoutsResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| payouts | [MetaAdsPayoutItem] | false | none | [A creator's running rev-share payout balance for the shop.] |
| total_owed_cents | integer | false | none | Sum of balance_owed_cents, cents. |
| ready_cents | integer | false | none | Balance ready to pay (equals total_owed in V1), cents. |
| paid_period_cents | integer | false | none | Sum of transfers in the last 30 days, cents. |
| currency | any | false | none | ISO 4217 currency of the shop's connected Meta ad account. Null when no ad account is connected or the currency is unknown. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
MetaAdsRollupTotals
{
"gmv_cents": 0,
"views": 0,
"gmv_per_video_cents": 0,
"ad_spend_cents": 0,
"commission_owed_cents": 0,
"ads": 0
}
MetaAdsRollupTotals
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| gmv_cents | integer | false | none | Attributed purchase-conversion value, cents. |
| views | integer | false | none | Sum of Meta ad impressions. |
| gmv_per_video_cents | integer | false | none | gmv_cents / distinct attributed Meta ads (0 when no ads). |
| ad_spend_cents | integer | false | none | none |
| commission_owed_cents | integer | false | none | Unpaid commission (ledger status pending+approved), cents. |
| ads | integer | false | none | Distinct attributed Meta ads across the campaign. |
MetaAdsRosterEntry
{
"campaign_id": "string",
"creator_id": "string",
"invite_status": "string",
"invited_at": "string",
"accepted_at": "string",
"activated_at": "string",
"partnership_ad_code": "string",
"whitelist_granted": false,
"creator_handle": "string",
"creator_name": "string",
"avatar_url": "string"
}
MetaAdsRosterEntry
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| campaign_id | string | true | none | none |
| creator_id | string | true | none | none |
| invite_status | string | true | none | pending |
| invited_at | string | true | none | none |
| accepted_at | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| activated_at | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| partnership_ad_code | any | false | none | Path-A Spark / Partnership Ads code the creator pasted. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| whitelist_granted | boolean | false | none | none |
| creator_handle | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| avatar_url | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
MetricCard
{
"label": "string",
"value": 0,
"unit": "string",
"change": 0,
"comparison_text": "string",
"tooltip_text": "string",
"chart_data": [
0
]
}
MetricCard
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| label | string | true | none | none |
| value | number | true | none | none |
| unit | string | true | none | none |
| change | number | true | none | none |
| comparison_text | string | true | none | none |
| tooltip_text | string | true | none | none |
| chart_data | [number] | false | none | none |
MetricsResponse
{
"pendingReview": {
"count": 0,
"expiringSoon": 0
},
"approvedInAutoProcess": {
"count": 0,
"changePct": 0,
"changeDirection": "up"
},
"completionRate": {
"rate": 0,
"changePct": 0,
"changeDirection": "up"
},
"approvalTarget": {
"monthlyLimit": 0,
"monthlyUsed": 0,
"dailyTarget": 0,
"dailyCurrent": 0,
"dailyPct": 0,
"onTrack": true
},
"dataFreshness": {
"lastSyncedAt": "string",
"isStale": false,
"isRefreshing": false
},
"notScopableBySku": [
"string"
]
}
MetricsResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| pendingReview | PendingReviewMetric | true | none | none |
| approvedInAutoProcess | ChangeMetric | true | none | none |
| completionRate | CompletionRateMetric | true | none | none |
| approvalTarget | ApprovalTargetMetric | true | none | none |
| dataFreshness | DataFreshness | false | none | none |
| notScopableBySku | [string] | false | none | none |
MetricsSummaryRequest
{
"start_date": "2019-08-24",
"end_date": "2019-08-24"
}
MetricsSummaryRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| start_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
MetricsSummaryResponse
{
"gmv": 0,
"total_gmv": 0,
"live_gmv": 0,
"sc_affiliate_live_gmv": 0,
"active_creators": 0,
"video_views": 0,
"videos_posted": 0,
"samples_approved": 0,
"gmv_per_video": 0,
"gmv_per_sample": 0,
"sample_requests": 0,
"gmv_driving_videos": 0,
"new_creators_posting": 0,
"open_collabs": 0,
"accepted_tc_count": 0,
"creators_reached": 0,
"creators_messaged": 0,
"tc_invites_sent": 0,
"emails_sent": 0,
"dm_responses": 0,
"reply_rate": 0,
"orders": 0,
"units_sold": 0,
"aov": 0,
"ctr": 0,
"conversion_rate": 0,
"errors": [
"string"
],
"start_date": "string",
"end_date": "string",
"currency": "string",
"shops_queried": [
"string"
]
}
MetricsSummaryResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| gmv | any | false | none | Affiliate-attributed GMV for the period — Reacher's view of creator-driven sales. This is NOT the shop's full GMV. For the headline number that matches the customer's TikTok Seller Center dashboard (which includes ads / Smart+ and organic), use total_gmv or the dedicated POST /shop-gmv/* endpoints. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| total_gmv | any | false | none | Full shop GMV for the period — includes ads / Smart+ and organic revenue, not just affiliate-attributed sales. Sourced from the TikTok Seller Center scrape. Coverage is rolling out per-shop; shops not yet covered return 0. For per-day breakdown by channel (video / live / product_card) and explicit per-shop currency handling, use POST /shop-gmv/* instead. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| live_gmv | any | false | none | Creator LIVE-attributed GMV for the period — the value shops see on TikTok's Affiliate Center → LIVE streams (/insights/transaction-analysis). Sourced from customers.live_sessions (affiliate_gmv), a DIFFERENT source than gmv (all affiliate revenue) and total_gmv (full shop view). Isolates the LIVE-stream slice only. Coverage is data-presence driven; shops without live-session data return 0. Currency is per-shop — for the currency-aware, single-shop, per-session view use the dedicated POST /lives/* endpoints. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sc_affiliate_live_gmv | any | false | none | Creator LIVE GMV for the period exactly as TikTok Seller Center reports it — Analytics → By order source → Creator → Lives. Use this one to reconcile against a Seller Center export. It is NOT the same figure as live_gmv, which comes from Affiliate Center and attributes revenue on transaction date rather than order date; the two will not match. Sourced from the same Seller Center daily rollup as total_gmv, so the same caveats apply: coverage is rolling out per-shop and uncovered shops return 0, and currency is per-shop (multi-shop requests sum across currencies). For the per-day channel breakdown use POST /shop-gmv/*. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| active_creators | any | false | none | Distinct creators with activity in the period (not summed daily counts) |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video_views | any | false | none | Total video views in the period |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| videos_posted | any | false | none | New videos posted in the period |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| samples_approved | any | false | none | Samples approved in the period |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| gmv_per_video | any | false | none | Avg GMV per video posted in the period. Matches dashboard 'GMV per Video' |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| gmv_per_sample | any | false | none | Avg GMV per sample. Matches dashboard 'GMV per Sample' |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sample_requests | any | false | none | Total sample requests in the period |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| gmv_driving_videos | any | false | none | Videos that generated sales in the period |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| new_creators_posting | any | false | none | First-time creators who posted in the period |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| open_collabs | any | false | none | Open collaboration affiliates added |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| accepted_tc_count | any | false | none | Accepted target collaborations |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creators_reached | any | false | none | Creators reached via outreach |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creators_messaged | any | false | none | Creators messaged |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| tc_invites_sent | any | false | none | Target collaboration invites sent |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| emails_sent | any | false | none | Emails sent |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| dm_responses | any | false | none | Sum of daily unique DM responses (not deduplicated across the period) |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| reply_rate | any | false | none | DM reply rate: (dm_responses / dm_messages_sent) * 100 |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| orders | any | false | none | Whole-shop orders for the period across all sales channels, from TikTok Seller Center. Shops not yet on the Seller Center daily sync return 0. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| units_sold | any | false | none | Whole-shop units sold for the period across all sales channels, from TikTok Seller Center. 0 for shops not yet covered. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| aov | any | false | none | Average order value for the period (total GMV / total orders over the date range, not an average of daily AOV). 0 when the shop has no orders or is not yet covered. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| ctr | any | false | none | Click-through rate as a percent for the period (total clicks / total impressions over the date range). 0 when uncovered or no impressions. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| conversion_rate | any | false | none | Conversion rate as a percent for the period (total orders / total clicks over the date range). 0 when uncovered or no clicks. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| errors | any | false | none | Metric keys that failed (null values in response) |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| start_date | string | true | none | none |
| end_date | string | true | none | none |
| currency | string | true | none | none |
| shops_queried | any | false | none | Shop names included when querying multiple shops (x-shop-id: all or comma-separated). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
MicroChallengeBoardResponse
{
"micro_campaign_id": 0,
"name": "",
"window_start_at": "string",
"window_end_at": "string",
"status": "live",
"scoring_mode": "single",
"metric_type": "gmv",
"standings": [
{
"rank": 0,
"creator_id": "string",
"handle": "string",
"creator_name": "string",
"avatar_url": "string",
"composite_score": 0,
"score_breakdown": [
{
"metric_type": "string",
"weight": 0,
"contribution": 0,
"raw_value": 0
}
],
"gmv": 0,
"views": 0,
"videos_posted": 0,
"units_sold": 0,
"avg_views_per_post": 0,
"live_gmv": 0,
"live_session_count": 0,
"combined_gmv": 0,
"frozen": false
}
]
}
MicroChallengeBoardResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| micro_campaign_id | integer | true | none | none |
| name | string | false | none | none |
| window_start_at | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| window_end_at | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| status | string | false | none | live |
| scoring_mode | string | false | none | single |
| metric_type | string | false | none | none |
| standings | [LeaderboardStanding] | false | none | [A single creator's rank + score + per-metric stats in a campaign.] |
MicroChallengeCreate
{
"name": "string",
"schedule": {
"mode": "one_off",
"start_at": "2019-08-24T14:15:22Z",
"end_at": "2019-08-24T14:15:22Z"
},
"pricing": {
"campaign_type": "leaderboard",
"leaderboard_ranks": [
{
"rank": 1,
"reward": 0
}
],
"reward_type": "cash",
"metric_type": "gmv",
"scoring_mode": "single",
"weighted_metrics": [
{
"metric_type": "gmv",
"weight": 100
}
],
"minimum_gmv_required": 0,
"minimum_views_required": 0,
"minimum_videos_required": 0,
"minimum_live_gmv_required": 0,
"minimum_sessions_required": 0
},
"excluded_creator_ids": [
0
]
}
MicroChallengeCreate
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| name | string | true | none | none |
| schedule | any | true | none | none |
oneOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | MicroScheduleOneOff | false | none | A single explicit window (shop-local datetimes). |
xor
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | MicroScheduleRecurring | false | none | A weekly recurring window. Day-of-week is 0=Mon..6=Sun; times are shop-local (the shop's timezone is resolved and stored at save time). |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| pricing | LeaderboardPricing | true | none | Pricing configuration for leaderboard campaigns. Extra keys are IGNORED (the codebase default, matching every sibling pricing class): the brand FE sends UI-only toggles like minimum_gmv_required_enabled that are not modelled here. Thesmuggling protection the materializer needs comes from re-parsing the stored template pricing through this model, which drops unknown keys so they never reach a materialized instance — not from extra="forbid",which would break the live create/edit path. |
| excluded_creator_ids | [integer] | false | none | none |
MicroChallengeTemplateUpdate
{
"name": "string",
"schedule": {
"mode": "one_off",
"start_at": "2019-08-24T14:15:22Z",
"end_at": "2019-08-24T14:15:22Z"
},
"start_dow": 6,
"start_time": "14:15:22Z",
"end_dow": 6,
"end_time": "14:15:22Z",
"pricing": {
"campaign_type": "leaderboard",
"leaderboard_ranks": [
{
"rank": 1,
"reward": 0
}
],
"reward_type": "cash",
"metric_type": "gmv",
"scoring_mode": "single",
"weighted_metrics": [
{
"metric_type": "gmv",
"weight": 100
}
],
"minimum_gmv_required": 0,
"minimum_views_required": 0,
"minimum_videos_required": 0,
"minimum_live_gmv_required": 0,
"minimum_sessions_required": 0
},
"excluded_creator_ids": [
0
],
"status": "active"
}
MicroChallengeTemplateUpdate
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| schedule | any | false | none | none |
anyOf - discriminator: mode
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | any | false | none | none |
oneOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| »» anonymous | MicroScheduleOneOff | false | none | A single explicit window (shop-local datetimes). |
xor
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| »» anonymous | MicroScheduleRecurring | false | none | A weekly recurring window. Day-of-week is 0=Mon..6=Sun; times are shop-local (the shop's timezone is resolved and stored at save time). |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| start_dow | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| start_time | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(time) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_dow | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_time | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(time) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| pricing | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | LeaderboardPricing | false | none | Pricing configuration for leaderboard campaigns. Extra keys are IGNORED (the codebase default, matching every sibling pricing class): the brand FE sends UI-only toggles like minimum_gmv_required_enabled that are not modelled here. Thesmuggling protection the materializer needs comes from re-parsing the stored template pricing through this model, which drops unknown keys so they never reach a materialized instance — not from extra="forbid",which would break the live create/edit path. |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| excluded_creator_ids | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [integer] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| status | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | active |
| anonymous | paused |
MicroScheduleOneOff
{
"mode": "one_off",
"start_at": "2019-08-24T14:15:22Z",
"end_at": "2019-08-24T14:15:22Z"
}
MicroScheduleOneOff
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| mode | string | false | none | none |
| start_at | string(date-time) | true | none | none |
| end_at | string(date-time) | true | none | none |
MicroScheduleRecurring
{
"mode": "recurring",
"start_dow": 6,
"start_time": "14:15:22Z",
"end_dow": 6,
"end_time": "14:15:22Z"
}
MicroScheduleRecurring
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| mode | string | false | none | none |
| start_dow | integer | true | none | none |
| start_time | string(time) | true | none | none |
| end_dow | integer | true | none | none |
| end_time | string(time) | true | none | none |
MySharedDashboard
{
"uuid": "string",
"share_url": "string",
"status": "string",
"created_at": "string",
"locked_start_date": "2019-08-24",
"locked_end_date": "2019-08-24",
"report_config": {
"v": 1,
"metrics": [
"string"
],
"modules": {
"property1": true,
"property2": true
}
},
"shop_id": 0
}
MySharedDashboard
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| uuid | string | true | none | none |
| share_url | string | true | none | none |
| status | string | true | none | none |
| created_at | string | true | none | none |
| locked_start_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| locked_end_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| report_config | ShareReportConfig | false | none | Which metric cards and modules a share link shows an external viewer. An omitted/empty config is meaningful: it marks a legacy link, which renders the original fixed six-card layout. That is why metrics and modulesdefault to None rather than to empty collections — "no opinion" and "the owner turned everything off" must stay distinguishable. |
| shop_id | integer | true | none | Shop this share link reports on. |
OutreachCapacityResponse
{
"shop_id": 0,
"daily_creators_used": 0,
"daily_window_resets_at": "string",
"concurrent_automations_running": 0,
"max_concurrent_automations": 0,
"daily_limit_throttled": true,
"weekly_limit_throttled": true,
"outreach_quota": {
"quota_type": "string",
"used": 0,
"limit": 0,
"remaining": 0,
"unlimited": true,
"resets_at": "string",
"gmv_tier": "string",
"gmv_level_rule": [
null
]
}
}
OutreachCapacityResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | integer | true | none | none |
| daily_creators_used | integer | true | none | Distinct (creator, automation) outreach sends counted for this shop in the current UTC day. Counts actual sends only — invites that were skipped (e.g. creator_not_found) do not count. |
| daily_window_resets_at | string | true | none | ISO-8601 UTC timestamp of the next daily-window reset (next 00:00 UTC). |
| concurrent_automations_running | integer | true | none | Outreach automations currently in a running/paused-but-live state. |
| max_concurrent_automations | integer | true | none | Plan ceiling for concurrent automations. |
| daily_limit_throttled | boolean | true | none | True when a live automation is currently paused by the daily outreach limit. |
| weekly_limit_throttled | boolean | true | none | True when a live automation is currently paused by TikTok's weekly outreach limit. When true, daily capacity is moot until the weekly window resets. |
| outreach_quota | any | false | none | TikTok's own outreach quota for the current period, or null when the shop has no quota covering now (no affiliate app authorized, never synced, or the stored period has lapsed). Null means unknown — never zero. Present as a whole object or not at all, so a partial quota can never be mistaken for an unlimited one. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | OutreachQuota | false | none | TikTok's outreach quota for a shop's current period. Read from TikTok's own /creator_outreach/quota endpoint, notreconstructed from Reacher's send tables — the two cannot agree, because used counts connections shop-wide. It therefore includes outreach NOTsent through Reacher, and excludes contact with creators the shop is already connected to. Do not read it as "what Reacher sent". |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
OutreachQuota
{
"quota_type": "string",
"used": 0,
"limit": 0,
"remaining": 0,
"unlimited": true,
"resets_at": "string",
"gmv_tier": "string",
"gmv_level_rule": [
null
]
}
OutreachQuota
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| quota_type | string | true | none | PERIOD — the weekly allowance, refreshing at resets_at. BONUS — a standing grant that does NOT roll weekly; its resets_at can be far in the future. Do not present a BONUS quota as a weekly one. |
| used | integer | true | none | Creators consumed from the quota this period, as TikTok reports it. Counts connections shop-wide. |
| limit | any | true | none | The ceiling. Null when the shop is unlimited — check unlimited rather than inferring from null. 0 is a real zero allowance. Always present (required) so an absent key can never be mistaken for an explicit null. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| remaining | any | true | none | Creators the shop can still reach this period: max(0, limit - used). Null when the shop is unlimited. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| unlimited | boolean | true | none | True when the shop has no ceiling for this quota. |
| resets_at | any | true | none | ISO-8601 UTC timestamp when the quota refreshes, as declared by TikTok. For a BONUS quota this can be far future. Always present (required), nullable only if TikTok omitted it. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| gmv_tier | any | false | none | TikTok's granted GMV tier for this shop (e.g. "4", "5"). Same scale as gmv_level in the tier table. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| gmv_level_rule | any | false | none | TikTok's live tier table for the shop's region. Each entry maps a GMV level to its weekly outreach quota ceiling and follower cap. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [any] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
OverviewMetric
{
"value": 0,
"description": "string"
}
OverviewMetric
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| value | any | true | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| description | string | true | none | none |
PageItem
{
"page_id": "string",
"name": "string",
"ig_user_id": "string",
"ig_username": "string",
"has_instagram": false,
"is_current": false
}
PageItem
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| page_id | string | true | none | none |
| name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| ig_user_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| ig_username | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| has_instagram | boolean | false | none | none |
| is_current | boolean | false | none | none |
PagesResponse
{
"pages": [
{
"page_id": "string",
"name": "string",
"ig_user_id": "string",
"ig_username": "string",
"has_instagram": false,
"is_current": false
}
],
"current_page_id": "string"
}
PagesResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| pages | [PageItem] | false | none | none |
| current_page_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
PaginatedEnvelopes
{
"data": [
{
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"batch_id": "4da22c97-b7d5-4e31-8c3a-03870ebc7b20",
"campaign_id": 0,
"campaign_name": "string",
"creator_id": 0,
"creator_name": "string",
"creator_handle": "string",
"contract_title": "string",
"template_source": "standard",
"terms": {
"campaign_type": "retainer",
"brand_name": "string",
"brand_representative_name": "string",
"deliverables": 1,
"posting_platform": "TikTok",
"posting_requirements": "",
"posting_start_date": "2019-08-24",
"effective_date": "2019-08-24",
"expiry_date": "2019-08-24",
"products": [
{
"product_id": "string",
"product_name": "string"
}
],
"all_products": false,
"require_video_link_email": false,
"video_link_email": "string",
"commission_pct": 100,
"expenses_reimbursable": false,
"revision_rounds": 0,
"include_usage_rights": true,
"usage_rights_months": 3,
"usage_rights_duration_days": 90,
"usage_rights_scope": "organic_only",
"usage_exclusivity_enabled": false,
"usage_exclusivity_months": 3,
"agreement_clause": "string",
"termination_notice_days": 30,
"governing_law_jurisdiction": "New York",
"reward": {
"kind": "retainer",
"mode": "fixed",
"payment_per_post": 0,
"tiers": [
{
"name": "string",
"retainer": 0,
"gmv_threshold": 0
}
],
"gmv_bonus_tiers": [
{
"gmv_threshold": 0,
"bonus_amount": 0
}
],
"recurring": false,
"payment_schedule": "one_time",
"payment_due_days": 30,
"minimum_gmv_floor": 0
}
},
"status": "draft",
"brand_signed_at": "2019-08-24T14:15:22Z",
"creator_signed_at": "2019-08-24T14:15:22Z",
"effective_date": "2019-08-24",
"expiry_date": "2019-08-24",
"last_error": "string"
}
],
"next_cursor": "string"
}
PaginatedEnvelopes
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | [ContractEnvelopeOut] | true | none | [Always includes terms so the FE can render the preview without a second round-trip.] |
| next_cursor | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
PaginatedTemplates
{
"data": [
{
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"name": "string",
"clause_count": 0,
"created_at": "2019-08-24T14:15:22Z",
"updated_at": "2019-08-24T14:15:22Z"
}
],
"next_cursor": "string"
}
PaginatedTemplates
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | [ContractTemplateOut] | true | none | none |
| next_cursor | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
PaginationMeta-Input
{
"page": 0,
"page_size": 0,
"total_count": 0,
"total_pages": 0
}
PaginationMeta
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| page | integer | true | none | none |
| page_size | integer | true | none | none |
| total_count | integer | true | none | none |
| total_pages | integer | true | none | none |
ParticipantSync
{
"applies_to": "string",
"fields": [
"string"
],
"updated": 0,
"unchanged": 0,
"skipped_paid": 0
}
ParticipantSync
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| applies_to | string | true | none | existing_and_future: changed campaign-wide reward terms were re-stamped onto unpaid participants. future_only: the changed payout fields are negotiated per creator and apply to future joiners only. |
| fields | [string] | true | none | Payout-affecting pricing fields this edit changed. |
| updated | integer | true | none | Unpaid participant reward snapshots re-stamped. |
| unchanged | integer | true | none | Unpaid snapshots already matching the new terms. |
| skipped_paid | integer | true | none | Paid/settled participants left untouched (frozen). |
PaymentHistoryItem
{
"creator_name": "string",
"campaign_name": "",
"paid_amount": "string",
"reward_type": "cash",
"paid_at": "string",
"note": "",
"tiktok_username": "string",
"currency": "USD"
}
PaymentHistoryItem
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_name | any | false | none | Resolved display name; falls back to the TikTok handle. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| campaign_name | string | false | none | "" for manual payouts. |
| paid_amount | string | true | none | Amount in currency, e.g. "275.0". |
| reward_type | string | false | none | cash or custom. |
| paid_at | any | false | none | ISO 8601 UTC, e.g. 2026-09-12T17:52:00+00:00. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| note | string | false | none | Operator memo; "" for campaign settlements. |
| tiktok_username | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| currency | string | false | none | ISO 4217 code of the wallet this payment moved through — the settlement currency. Use it to render paid_amount; it is NOT inferable from the shop's region (wallets are USD, GBP or EUR). |
PaymentHistoryResponse
{
"overview": {
"property1": {
"value": 0,
"description": "string"
},
"property2": {
"value": 0,
"description": "string"
}
},
"data": [
{
"creator_name": "string",
"campaign_name": "",
"paid_amount": "string",
"reward_type": "cash",
"paid_at": "string",
"note": "",
"tiktok_username": "string",
"currency": "USD"
}
],
"pagination": {
"page": 0,
"page_size": 0,
"total_count": 0,
"total_pages": 0
},
"currency": "USD"
}
PaymentHistoryResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| overview | object | true | none | available_balance — a bare number in currency. |
| » additionalProperties | OverviewMetric | false | none | A single metric displayed in a list endpoint's overview section. |
| data | [PaymentHistoryItem] | true | none | [One settled payment in GET /campaigns/payments/history.] |
| pagination | PaginationMeta-Input | true | none | Pagination metadata returned in list responses. |
| currency | string | false | none | ISO 4217 code every amount in this response is denominated in. |
PaymentTier
{
"threshold": 0,
"compensation": 0,
"videos_required": 0
}
PaymentTier
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| threshold | number | true | none | Metric threshold for this tier |
| compensation | any | true | none | Payout at this tier |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| videos_required | any | false | none | Number of videos required for this tier |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
PendingReviewMetric
{
"count": 0,
"expiringSoon": 0
}
PendingReviewMetric
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| count | integer | true | none | none |
| expiringSoon | integer | true | none | none |
PersonalizationCreatorSentMessage
{
"automation_id": 0,
"message": "string",
"is_fallback": true,
"tone": "string",
"sent_at": "string"
}
PersonalizationCreatorSentMessage
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| automation_id | any | false | none | The automation that sent this message (null for legacy/pre-save rows). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| message | string | true | none | The exact personalized copy sent to this creator. |
| is_fallback | boolean | true | none | none |
| tone | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sent_at | any | false | none | ISO 8601 UTC send time. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
PersonalizationCreatorSentMessagesResponse
{
"creator_id": "string",
"count": 0,
"messages": [
{
"automation_id": 0,
"message": "string",
"is_fallback": true,
"tone": "string",
"sent_at": "string"
}
]
}
PersonalizationCreatorSentMessagesResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_id | string | true | none | none |
| count | integer | true | none | Number of messages returned (after the limit cap). |
| messages | [PersonalizationCreatorSentMessage] | false | none | none |
PersonalizationFallbackStatsResponse
{
"automation_id": 0,
"messages_sent": 0,
"fallback_used": 0,
"fallback_rate": 0
}
PersonalizationFallbackStatsResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| automation_id | integer | true | none | none |
| messages_sent | integer | true | none | Personalized outreach messages this automation has sent (lifetime, all runs). |
| fallback_used | integer | true | none | How many of those used the brand fallback (creator had too little signal). |
| fallback_rate | number | true | none | fallback_used / messages_sent (0.0 when nothing has been sent). |
PersonalizationPreviewCreator
{
"creator_id": "string",
"creator_handle": "string",
"creator_first_name": ""
}
PersonalizationPreviewCreator
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_id | string | true | none | TikTok creator id (as returned by GET /automations/{id}/creators). |
| creator_handle | string | true | none | TikTok handle without the @. |
| creator_first_name | string | false | none | Optional known first name; the engine resolves the real one when omitted. |
PersonalizationPreviewRequest
{
"creator": {
"creator_id": "string",
"creator_handle": "string",
"creator_first_name": ""
},
"message_body": "string",
"tone": "engaging",
"fallback_message": "string",
"brand_name": "",
"product_description": "",
"product_selling_points": "",
"offer_discussion": "",
"word_counts": {
"property1": 0,
"property2": 0
},
"name_source": "first_name"
}
PersonalizationPreviewRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator | PersonalizationPreviewCreator | true | none | The single creator to generate a preview for. |
| message_body | string | true | none | The DM template with [Block] tokens (mirrors the automation's CREATOR_MESSAGE). |
| tone | string | false | none | none |
| fallback_message | string | true | none | Sent (name/product blocks filled) when the creator has too little signal to personalize. Required — matches the DM config contract: personalization must always have a safe fallback, so a low-signal preview never returns an empty message. |
| brand_name | string | false | none | Brand display name used in the copy. Defaults to the shop name when omitted. |
| product_description | string | false | none | Pre-resolved [Product Description]. Get it from POST /personalization/product-blocks. |
| product_selling_points | string | false | none | Pre-resolved [Product Selling Points]. Get it from POST /personalization/product-blocks. |
| offer_discussion | string | false | none | [Offer Discussion] block value — the brand's offer text. |
| word_counts | any | false | none | Optional approximate word-count target per AI block, e.g. {"content_discussion": 25, "product_discussion": 20}. Only content_discussion and product_discussion are honored; clamped server-side. Null uses the brevity default. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | object | false | none | none |
| »» additionalProperties | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| name_source | string | false | none | Which name fills the creator-name token (CORE-7779). Pass the same value the automation's personalization config carries so the preview matches the send. |
Enumerated Values
| Property | Value |
|---|---|
| tone | engaging |
| tone | bold |
| tone | inspirational |
| name_source | first_name |
| name_source | display_name |
PersonalizationPreviewResponse
{
"creator_id": "string",
"message": "string",
"is_fallback": true,
"blocks_used": [
"string"
]
}
PersonalizationPreviewResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_id | string | true | none | none |
| message | string | true | none | The fully assembled message this creator would receive. |
| is_fallback | boolean | true | none | True when the creator had too little signal to personalize, so the brand fallback message was used instead of AI-generated blocks. |
| blocks_used | [string] | false | none | Which [Block] tokens were filled (e.g. content_discussion, product_discussion, product_description, offer_discussion). |
PersonalizationProductBlocksRequest
{
"product_id": "string"
}
PersonalizationProductBlocksRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_id | string | true | none | A product id in this shop's catalog. Blocks resolve empty if it isn't. |
PersonalizationProductBlocksResponse
{
"product_description": "",
"product_selling_points": ""
}
PersonalizationProductBlocksResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_description | string | false | none | [Product Description] resolved from this shop's product catalog. Empty when the product isn't in this shop or has no description. |
| product_selling_points | string | false | none | [Product Selling Points] derived from the product's real title/description/attributes. Empty when there's too little grounded product info to derive them. |
PersonalizationRetoneRequest
{
"message_body": "string",
"tone": "engaging"
}
PersonalizationRetoneRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| message_body | string | true | none | The message body to rewrite. Every [Block] token is preserved. |
| tone | string | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| tone | engaging |
| tone | bold |
| tone | inspirational |
PersonalizationRetoneResponse
{
"message": "string"
}
PersonalizationRetoneResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| message | string | true | none | The rewritten message body, with every [Block] token preserved. |
PipelineCounts
{
"toReview": 0,
"readyToShip": 0,
"shipped": 0,
"pendingContent": 0,
"completed": 0,
"cancelled": 0,
"all": 0,
"inShipment": 0,
"posted": 0,
"allApproved": 0,
"overdue": 0,
"rejected": 0,
"expired": 0,
"ignored": 0
}
PipelineCounts
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| toReview | integer | false | none | none |
| readyToShip | integer | false | none | none |
| shipped | integer | false | none | none |
| pendingContent | integer | false | none | none |
| completed | integer | false | none | none |
| cancelled | integer | false | none | none |
| all | integer | false | none | none |
| inShipment | integer | false | none | none |
| posted | integer | false | none | none |
| allApproved | integer | false | none | none |
| overdue | integer | false | none | none |
| rejected | integer | false | none | none |
| expired | integer | false | none | none |
| ignored | integer | false | none | none |
PipelineCountsResponse
{
"counts": {
"toReview": 0,
"readyToShip": 0,
"shipped": 0,
"pendingContent": 0,
"completed": 0,
"cancelled": 0,
"all": 0,
"inShipment": 0,
"posted": 0,
"allApproved": 0,
"overdue": 0,
"rejected": 0,
"expired": 0,
"ignored": 0
},
"archivedCounts": {
"toReview": 0,
"readyToShip": 0,
"shipped": 0,
"pendingContent": 0,
"completed": 0,
"cancelled": 0,
"all": 0,
"inShipment": 0,
"posted": 0,
"allApproved": 0,
"overdue": 0,
"rejected": 0,
"expired": 0,
"ignored": 0
},
"completionRate": 0,
"approvalTarget": {
"limit": 0,
"used": 0
},
"archivedCount": {
"creators": 0,
"products": 0,
"total": 0
},
"expiringCount": 0,
"dataFreshness": {
"lastSyncedAt": "string",
"isStale": false,
"isRefreshing": false
}
}
PipelineCountsResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| counts | PipelineCounts | true | none | none |
| archivedCounts | PipelineCounts | false | none | none |
| completionRate | number | true | none | none |
| approvalTarget | ApprovalTargetSummary | true | none | none |
| archivedCount | ArchivedCount | false | none | none |
| expiringCount | integer | false | none | none |
| dataFreshness | DataFreshness | false | none | none |
PnlAdjustmentOut
{
"adjustment_id": "string",
"adjustment_type": "string",
"reason": "string",
"amount": 0,
"created_date": "string",
"settled_date": "string",
"linked_statement_id": "string",
"linked_payout_id": "string",
"currency": "string"
}
PnlAdjustmentOut
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| adjustment_id | string | true | none | none |
| adjustment_type | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| reason | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| amount | any | false | none | Signed as TikTok posts it: negative is a charge. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| created_date | any | false | none | When TikTok raised it. The window filters on this. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| settled_date | any | false | none | When it hit a payout. Null until settled. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| linked_statement_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| linked_payout_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| currency | string | true | none | none |
PnlAdjustmentsRequest
{
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"limit": 100,
"offset": 0
}
PnlAdjustmentsRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| start_date | any | false | none | Inclusive window start (YYYY-MM-DD). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_date | any | false | none | Inclusive window end (YYYY-MM-DD). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| limit | integer | false | none | Page size. |
| offset | integer | false | none | Page offset. |
PnlAdjustmentsResponse
{
"shop_id": 0,
"seller_id": "string",
"total": 0,
"limit": 0,
"offset": 0,
"net_amount": 0,
"adjustments": [
{
"adjustment_id": "string",
"adjustment_type": "string",
"reason": "string",
"amount": 0,
"created_date": "string",
"settled_date": "string",
"linked_statement_id": "string",
"linked_payout_id": "string",
"currency": "string"
}
],
"data_status": {
"state": "string",
"last_synced_at": "string",
"last_window": {
"start_date": "string",
"end_date": "string"
}
}
}
PnlAdjustmentsResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | integer | true | none | none |
| seller_id | string | true | none | none |
| total | integer | true | none | none |
| limit | integer | true | none | none |
| offset | integer | true | none | none |
| net_amount | number | true | none | Sum of every adjustment matching the window, before paging — the number to carry into a P&L, since these never appear on order rows. |
| adjustments | [PnlAdjustmentOut] | true | none | [One settlement adjustment — a credit, clawback or manual correction.] |
| data_status | PnlDataStatus | true | none | Freshness and reachability of this shop's P&L data.state distinguishes "no sales" from "we cannot read the financeexport": no_permission means the shop's Seller Center account lacksfinance-tab access and the fix is customer-side, not a retry. |
PnlCogsCoverage
{
"units": 0,
"units_costed": 0,
"coverage_pct": 0,
"missing_count": 0,
"missing": [
{
"product_id": "string",
"sku_id": "string",
"product_name": "string",
"sku_name": "string",
"units": 0
}
],
"truncated": true
}
PnlCogsCoverage
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| units | integer | true | none | none |
| units_costed | integer | true | none | none |
| coverage_pct | number | true | none | none |
| missing_count | integer | true | none | none |
| missing | [PnlMissingSkuCost] | true | none | none |
| truncated | boolean | true | none | True when missing was capped and more rows exist. |
PnlCostCoverageRequest
{
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"sample_basis": "shipped"
}
PnlCostCoverageRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| start_date | any | false | none | Inclusive window start (YYYY-MM-DD). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_date | any | false | none | Inclusive window end (YYYY-MM-DD). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sample_basis | string | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| sample_basis | shipped |
| sample_basis | approved |
| sample_basis | requested |
PnlCostCoverageResponse
{
"shop_id": 0,
"seller_id": "string",
"currency": "string",
"start_date": "string",
"end_date": "string",
"sample_basis": "string",
"cogs": {
"units": 0,
"units_costed": 0,
"coverage_pct": 0,
"missing_count": 0,
"missing": [
{
"product_id": "string",
"sku_id": "string",
"product_name": "string",
"sku_name": "string",
"units": 0
}
],
"truncated": true
},
"samples": {
"sample_units": 0,
"sample_units_costed": 0,
"coverage_pct": 0,
"missing_count": 0,
"missing": [
{
"product_id": "string",
"sample_units": 0
}
],
"truncated": true
}
}
PnlCostCoverageResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | integer | true | none | none |
| seller_id | string | true | none | none |
| currency | string | true | none | none |
| start_date | string | true | none | none |
| end_date | string | true | none | none |
| sample_basis | string | true | none | none |
| cogs | PnlCogsCoverage | true | none | none |
| samples | PnlSampleCoverage | true | none | none |
PnlCostEntry
{
"product_id": "string",
"sku_id": "string",
"cost_type": "cogs",
"amount": 0,
"currency": "USD",
"effective_from": "2019-08-24",
"notes": "string"
}
PnlCostEntry
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_id | string | true | none | none |
| sku_id | any | false | none | The SKU this cost applies to. Omit (or null) to set the product-level default, which applies to every SKU without a row of its own. sample_unit_cost is always product-level — sample records do not carry a SKU. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| cost_type | string | true | none | cogs — what one unit costs you, applied to units sold. sample_unit_cost — the all-in cost of putting one sample in a creator's hands, applied to sample sends. |
| amount | number | true | none | Cost per unit, as a positive number in currency. |
| currency | string | false | none | ISO code. Must match the shop's Seller Center currency — costs in another currency are skipped rather than converted at a rate we would have to invent. |
| effective_from | any | false | none | First day this amount applies. Omit for 'always'. Resolution picks the latest effective_from on or before an order's paid date, so adding a new dated cost never moves already-reported periods. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| notes | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| cost_type | cogs |
| cost_type | sample_unit_cost |
PnlCostItem
{
"id": 0,
"product_id": "string",
"sku_id": "string",
"cost_type": "string",
"amount": 0,
"currency": "string",
"effective_from": "string",
"notes": "string",
"source": "string",
"updated_at": "string"
}
PnlCostItem
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| id | integer | true | none | none |
| product_id | string | true | none | none |
| sku_id | any | false | none | Null means the product-level default. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| cost_type | string | true | none | none |
| amount | number | true | none | Cost per unit, positive. |
| currency | string | true | none | none |
| effective_from | string | true | none | none |
| notes | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| source | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| updated_at | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
PnlCostsResponse
{
"shop_id": 0,
"costs": [
{
"id": 0,
"product_id": "string",
"sku_id": "string",
"cost_type": "string",
"amount": 0,
"currency": "string",
"effective_from": "string",
"notes": "string",
"source": "string",
"updated_at": "string"
}
]
}
PnlCostsResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | integer | true | none | none |
| costs | [PnlCostItem] | true | none | [One stored cost input.] |
PnlCostsUpsertRequest
{
"costs": [
{
"product_id": "string",
"sku_id": "string",
"cost_type": "cogs",
"amount": 0,
"currency": "USD",
"effective_from": "2019-08-24",
"notes": "string"
}
]
}
PnlCostsUpsertRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| costs | [PnlCostEntry] | true | none | Rows to insert or update, keyed on (product_id, sku_id, cost_type, effective_from). Re-sending a key overwrites its amount rather than stacking a second cost onto the same units. If the same key appears twice in one request, the last one wins. |
PnlCustomerPaymentOut
{
"order_id": "string",
"sku_id": "string",
"currency": "string",
"amounts": {
"property1": 0,
"property2": 0
}
}
PnlCustomerPaymentOut
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| order_id | string | true | none | none |
| sku_id | string | true | none | none |
| currency | string | true | none | none |
| amounts | object | false | none | Buyer-side breakdown: subtotal before and after discount, who funded each discount, shipping, retail delivery fee and tax. |
| » additionalProperties | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| »» anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| »» anonymous | null | false | none | none |
PnlCustomerPaymentsRequest
{
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"product_id": "string",
"sku_id": "string",
"limit": 100,
"offset": 0
}
PnlCustomerPaymentsRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| start_date | any | false | none | Inclusive paid-date window start. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_date | any | false | none | Inclusive paid-date window end. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_id | any | false | none | Filter to one product. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sku_id | any | false | none | Filter to one SKU. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| limit | integer | false | none | Page size. |
| offset | integer | false | none | Page offset. |
PnlCustomerPaymentsResponse
{
"shop_id": 0,
"seller_id": "string",
"total": 0,
"limit": 0,
"offset": 0,
"payments": [
{
"order_id": "string",
"sku_id": "string",
"currency": "string",
"amounts": {
"property1": 0,
"property2": 0
}
}
],
"data_status": {
"state": "string",
"last_synced_at": "string",
"last_window": {
"start_date": "string",
"end_date": "string"
}
}
}
PnlCustomerPaymentsResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | integer | true | none | none |
| seller_id | string | true | none | none |
| total | integer | true | none | none |
| limit | integer | true | none | none |
| offset | integer | true | none | none |
| payments | [PnlCustomerPaymentOut] | true | none | [What the buyer paid for one order x SKU.] |
| data_status | PnlDataStatus | true | none | Freshness and reachability of this shop's P&L data.state distinguishes "no sales" from "we cannot read the financeexport": no_permission means the shop's Seller Center account lacksfinance-tab access and the fix is customer-side, not a retry. |
PnlDataStatus
{
"state": "string",
"last_synced_at": "string",
"last_window": {
"start_date": "string",
"end_date": "string"
}
}
PnlDataStatus
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| state | string | true | none | Latest export-run status: never_run |
| last_synced_at | any | false | none | ISO timestamp of the newest successfully parsed run. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| last_window | any | false | none | Date window the latest run requested. Typed so MCP clients can discover its fields rather than receiving an opaque object. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | PnlDateWindow | false | none | The date window an export run requested. |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
PnlDateWindow
{
"start_date": "string",
"end_date": "string"
}
PnlDateWindow
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| start_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
PnlMissingSampleCost
{
"product_id": "string",
"sample_units": 0
}
PnlMissingSampleCost
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_id | string | true | none | none |
| sample_units | integer | true | none | none |
PnlMissingSkuCost
{
"product_id": "string",
"sku_id": "string",
"product_name": "string",
"sku_name": "string",
"units": 0
}
PnlMissingSkuCost
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_id | string | true | none | none |
| sku_id | string | true | none | none |
| product_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sku_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| units | integer | true | none | none |
PnlOrderAmounts
{}
PnlOrderAmounts
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| additionalProperties | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
PnlOrderLineOut
{
"order_id": "string",
"sku_id": "string",
"product_id": "string",
"product_name": "string",
"sku_name": "string",
"quantity": 0,
"order_paid_date": "string",
"order_settled_date": "string",
"order_status": "string",
"order_source": [
"string"
],
"is_settled": true,
"unsettled_reason": "string",
"estimated_settle_time": "string",
"sample_order_type": "string",
"linked_statement_id": "string",
"currency": "string",
"amounts": {}
}
PnlOrderLineOut
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| order_id | string | true | none | none |
| sku_id | string | true | none | none |
| product_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sku_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| quantity | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| order_paid_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| order_settled_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| order_status | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| order_source | [string] | false | none | TikTok models this as a list, e.g. ["Video"]. |
| is_settled | boolean | true | none | none |
| unsettled_reason | any | false | none | Why TikTok has not settled this line yet. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| estimated_settle_time | any | false | none | Free text from TikTok, e.g. "Delivery + 1 days" — not a timestamp. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sample_order_type | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| linked_statement_id | any | false | none | Settlement statement this line was paid on; null until settled. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| currency | string | true | none | none |
| amounts | PnlOrderAmounts | true | none | The fee columns this row carries, keyed by TikTok's own column names. An open map rather than a fixed field set, because the caller picks the projection: a fixed model would advertise fields a given response deliberately omits. The keys present are exactly selected_fields on thepage. null means TikTok sent no value for that column — it is NOT zero,and a key that is absent entirely means you did not ask for it. Signs are TikTok's own: gross_sales positive, cost lines negative. |
PnlOrdersRequest
{
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"order_source": "Video",
"settled": true,
"product_id": "string",
"sku_id": "string",
"limit": 100,
"offset": 0,
"amounts_fields": "standard"
}
PnlOrdersRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| start_date | any | false | none | Inclusive paid-date window start. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_date | any | false | none | Inclusive paid-date window end. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| order_source | any | false | none | Filter by TikTok's own order-source value. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| settled | any | false | none | True = only settled orders, False = only unsettled. Unsettled amounts still move as TikTok settles them. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | boolean | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_id | any | false | none | Filter to one product. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sku_id | any | false | none | Filter to one SKU. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| limit | integer | false | none | Page size. |
| offset | integer | false | none | Page offset. |
| amounts_fields | any | false | none | Which fee columns each row carries. standard (default) is the 12 lines a P&L waterfall needs. full is all 61 TikTok ships — coupons, co-funded creator bonuses, campaign and FBT fees, shipping detail and taxes. Or pass an explicit list of field names to take only what you need. Unknown names are rejected rather than ignored, so a typo cannot read as a zero fee. The resolved list comes back as selected_fields. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | Video |
| anonymous | Product card |
| anonymous | Live |
| anonymous | standard |
| anonymous | full |
PnlOrdersResponse
{
"shop_id": 0,
"seller_id": "string",
"total": 0,
"limit": 0,
"offset": 0,
"selected_fields": [
"string"
],
"orders": [
{
"order_id": "string",
"sku_id": "string",
"product_id": "string",
"product_name": "string",
"sku_name": "string",
"quantity": 0,
"order_paid_date": "string",
"order_settled_date": "string",
"order_status": "string",
"order_source": [
"string"
],
"is_settled": true,
"unsettled_reason": "string",
"estimated_settle_time": "string",
"sample_order_type": "string",
"linked_statement_id": "string",
"currency": "string",
"amounts": {}
}
],
"data_status": {
"state": "string",
"last_synced_at": "string",
"last_window": {
"start_date": "string",
"end_date": "string"
}
}
}
PnlOrdersResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | integer | true | none | none |
| seller_id | string | true | none | none |
| total | integer | true | none | none |
| limit | integer | true | none | none |
| offset | integer | true | none | none |
| selected_fields | [string] | false | none | The fee columns every row in this page carries, in canonical order. Echoed once per page, not per row: it is provenance for the projection you asked for, so an absent key can be read as 'not requested' rather than 'no data'. |
| orders | [PnlOrderLineOut] | true | none | [One order x SKU row of the P&L export.] |
| data_status | PnlDataStatus | true | none | Freshness and reachability of this shop's P&L data.state distinguishes "no sales" from "we cannot read the financeexport": no_permission means the shop's Seller Center account lacksfinance-tab access and the fix is customer-side, not a retry. |
PnlProductsResponse
{
"products": [
{
"product_id": "string",
"title": "string",
"primary_image_url": "string",
"category_chain": [],
"brand_name": "string",
"currency": "USD",
"skus": [],
"commission": {
"commission_rate": 0,
"shop_ads_commission_rate": 0
},
"discount_pct": 0
}
],
"shop_id": 0,
"tiktok_fee_pct": 6,
"gmv_max": {
"active": false,
"avg_roas": 0,
"tooltip": "Based on average ROAS across all active campaigns in your shop."
}
}
PnlProductsResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| products | [ProductPnlData] | true | none | none |
| shop_id | integer | true | none | none |
| tiktok_fee_pct | number | false | none | none |
| gmv_max | GmvMaxInfo | false | none | none |
PnlProfitLines
{
"net_earnings": 0,
"cogs": 0,
"sample_cost": 0,
"contribution_profit": 0,
"units": 0,
"units_costed": 0,
"units_uncosted": 0,
"units_on_refunded_lines": 0,
"sample_units": 0,
"sample_units_costed": 0,
"sample_units_uncosted": 0
}
PnlProfitLines
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| net_earnings | number | true | none | TikTok's own bottom line for the window, from the daily series — the only source that includes GMV Max ad spend. |
| cogs | number | true | none | Cost of goods on units sold. Negative, or 0.0 when unknown. |
| sample_cost | number | true | none | Cost of samples sent. Negative, or 0.0 when unknown. |
| contribution_profit | number | true | none | net_earnings + cogs + sample_cost. An UPPER BOUND whenever units_uncosted or sample_units_uncosted is non-zero — those units are counted as free, not guessed at. |
| units | integer | true | none | Units on order lines in the window. |
| units_costed | integer | true | none | none |
| units_uncosted | integer | true | none | Units with no COGS on file. Fill these in via PUT /pnl/costs. |
| units_on_refunded_lines | integer | true | none | Units sitting on a line that carries a refund. A PARTIAL refund flags the whole line, so this is an upper bound on units returned — it is reported, never netted out, because whether a refunded unit still costs you is your accounting policy, not ours. |
| sample_units | integer | true | none | Sample sends in the window, from Reacher's own sample funnel. The Seller Center P&L export cannot supply this: free samples are not orders and never appear in it. |
| sample_units_costed | integer | true | none | none |
| sample_units_uncosted | integer | true | none | none |
PnlProfitPoint
{
"net_earnings": 0,
"cogs": 0,
"sample_cost": 0,
"contribution_profit": 0,
"units": 0,
"units_costed": 0,
"units_uncosted": 0,
"units_on_refunded_lines": 0,
"sample_units": 0,
"sample_units_costed": 0,
"sample_units_uncosted": 0,
"period_start": "string"
}
PnlProfitPoint
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| net_earnings | number | true | none | TikTok's own bottom line for the window, from the daily series — the only source that includes GMV Max ad spend. |
| cogs | number | true | none | Cost of goods on units sold. Negative, or 0.0 when unknown. |
| sample_cost | number | true | none | Cost of samples sent. Negative, or 0.0 when unknown. |
| contribution_profit | number | true | none | net_earnings + cogs + sample_cost. An UPPER BOUND whenever units_uncosted or sample_units_uncosted is non-zero — those units are counted as free, not guessed at. |
| units | integer | true | none | Units on order lines in the window. |
| units_costed | integer | true | none | none |
| units_uncosted | integer | true | none | Units with no COGS on file. Fill these in via PUT /pnl/costs. |
| units_on_refunded_lines | integer | true | none | Units sitting on a line that carries a refund. A PARTIAL refund flags the whole line, so this is an upper bound on units returned — it is reported, never netted out, because whether a refunded unit still costs you is your accounting policy, not ours. |
| sample_units | integer | true | none | Sample sends in the window, from Reacher's own sample funnel. The Seller Center P&L export cannot supply this: free samples are not orders and never appear in it. |
| sample_units_costed | integer | true | none | none |
| sample_units_uncosted | integer | true | none | none |
| period_start | string | true | none | none |
PnlProfitRequest
{
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"cadence": "total",
"sample_basis": "shipped"
}
PnlProfitRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| start_date | any | false | none | Inclusive window start (YYYY-MM-DD). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_date | any | false | none | Inclusive window end (YYYY-MM-DD). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| cadence | string | false | none | total returns window totals only. Anything else also returns a bucketed series — the running P&L with costs applied. |
| sample_basis | string | false | none | Which sample milestone the cost is charged against. shipped is when the unit physically leaves; use approved or requested if you accrue earlier. |
Enumerated Values
| Property | Value |
|---|---|
| cadence | total |
| cadence | day |
| cadence | week |
| cadence | biweekly |
| cadence | month |
| sample_basis | shipped |
| sample_basis | approved |
| sample_basis | requested |
PnlProfitResponse
{
"shop_id": 0,
"seller_id": "string",
"currency": "string",
"start_date": "string",
"end_date": "string",
"cadence": "string",
"sample_basis": "string",
"days_with_data": 0,
"totals": {
"net_earnings": 0,
"cogs": 0,
"sample_cost": 0,
"contribution_profit": 0,
"units": 0,
"units_costed": 0,
"units_uncosted": 0,
"units_on_refunded_lines": 0,
"sample_units": 0,
"sample_units_costed": 0,
"sample_units_uncosted": 0
},
"series": [
{
"net_earnings": 0,
"cogs": 0,
"sample_cost": 0,
"contribution_profit": 0,
"units": 0,
"units_costed": 0,
"units_uncosted": 0,
"units_on_refunded_lines": 0,
"sample_units": 0,
"sample_units_costed": 0,
"sample_units_uncosted": 0,
"period_start": "string"
}
],
"currency_mismatched_costs": 0,
"data_status": {
"state": "string",
"last_synced_at": "string",
"last_window": {
"start_date": "string",
"end_date": "string"
}
}
}
PnlProfitResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | integer | true | none | none |
| seller_id | string | true | none | none |
| currency | string | true | none | none |
| start_date | string | true | none | none |
| end_date | string | true | none | none |
| cadence | string | true | none | none |
| sample_basis | string | true | none | none |
| days_with_data | integer | true | none | none |
| totals | PnlProfitLines | true | none | TikTok's bottom line carried down to a contribution profit. Cost lines are negative like the rest of the P&L waterfall, so the three lines above contribution_profit sum to it. |
| series | [PnlProfitPoint] | false | none | Empty when cadence is total. |
| currency_mismatched_costs | integer | true | none | Cost rows skipped because they are priced in a different currency than the shop. Non-zero means some costs are silently absent. |
| data_status | PnlDataStatus | true | none | Freshness and reachability of this shop's P&L data.state distinguishes "no sales" from "we cannot read the financeexport": no_permission means the shop's Seller Center account lacksfinance-tab access and the fix is customer-side, not a retry. |
PnlSampleCoverage
{
"sample_units": 0,
"sample_units_costed": 0,
"coverage_pct": 0,
"missing_count": 0,
"missing": [
{
"product_id": "string",
"sample_units": 0
}
],
"truncated": true
}
PnlSampleCoverage
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sample_units | integer | true | none | none |
| sample_units_costed | integer | true | none | none |
| coverage_pct | number | true | none | none |
| missing_count | integer | true | none | none |
| missing | [PnlMissingSampleCost] | true | none | none |
| truncated | boolean | true | none | none |
PnlSkuRollup
{
"product_id": "string",
"sku_id": "string",
"sku_name": "string",
"product_name": "string",
"units": 0,
"amounts": {
"property1": 0,
"property2": 0
},
"cogs": 0,
"gross_profit": 0,
"gross_margin_pct": 0,
"units_costed": 0,
"units_uncosted": 0,
"currency": "string"
}
PnlSkuRollup
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sku_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sku_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| units | integer | true | none | Units sold on this SKU's order lines in the window. |
| amounts | object | false | none | Window SUMS of the requested fee columns for this SKU, keyed by TikTok's own column names — the same projection as selected_fields. Signs are TikTok's: gross sales positive, cost lines negative. null means TikTok sent no value for that column; an absent key means you did not request it. The net_earnings and total_expense columns, when requested, are the ORDER-LINE totals and therefore EXCLUDE ad spend — they are not this SKU's true net. |
| » additionalProperties | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| »» anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| »» anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| cogs | number | true | none | Cost of goods on units sold this window. Negative, or 0.0 when no cost is on file. |
| gross_profit | number | true | none | Contribution profit: the net earnings TikTok booked on this SKU's order lines, less COGS. EXCLUDES ad spend, so it is a gross / contribution figure, not the true bottom line. An UPPER BOUND while units_uncosted is non-zero, since uncosted units are counted as free rather than guessed at. |
| gross_margin_pct | any | false | none | gross_profit as a percentage of gross sales. Null when gross sales is 0. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| units_costed | integer | true | none | none |
| units_uncosted | integer | true | none | Units with no COGS on file. Fill these in via PUT /pnl/costs; gross_profit is an upper bound while this is non-zero. |
| currency | string | true | none | none |
PnlSkusRequest
{
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"product_id": "string",
"sku_id": "string",
"limit": 100,
"offset": 0,
"amounts_fields": "standard",
"sort": "gross_sales"
}
PnlSkusRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| start_date | any | false | none | Inclusive paid-date window start (YYYY-MM-DD). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_date | any | false | none | Inclusive paid-date window end (YYYY-MM-DD). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_id | any | false | none | Filter to one product. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sku_id | any | false | none | Filter to one SKU. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| limit | integer | false | none | Page size (SKUs per page). |
| offset | integer | false | none | Page offset. |
| amounts_fields | any | false | none | Which fee columns each SKU's amounts carries, as window SUMS. standard (default) is the 12 lines a P&L waterfall needs; full is every column TikTok ships; or pass an explicit list of field names. Unknown names are rejected rather than ignored, so a typo cannot read as a zero fee. The resolved list comes back as selected_fields. Note: gross_profit is computed from a fixed internal set, so this selection changes only what is echoed, never the profit math. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sort | string | false | none | Sort key, always descending, tie-broken by product_id then sku_id so paging is stable. gross_sales (default) surfaces top sellers, gross_profit top contributors, units highest volume. |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | standard |
| anonymous | full |
| sort | gross_sales |
| sort | gross_profit |
| sort | units |
PnlSkusResponse
{
"shop_id": 0,
"seller_id": "string",
"currency": "string",
"start_date": "string",
"end_date": "string",
"total": 0,
"limit": 0,
"offset": 0,
"selected_fields": [
"string"
],
"currency_mismatched_costs": 0,
"skus": [
{
"product_id": "string",
"sku_id": "string",
"sku_name": "string",
"product_name": "string",
"units": 0,
"amounts": {
"property1": 0,
"property2": 0
},
"cogs": 0,
"gross_profit": 0,
"gross_margin_pct": 0,
"units_costed": 0,
"units_uncosted": 0,
"currency": "string"
}
],
"data_status": {
"state": "string",
"last_synced_at": "string",
"last_window": {
"start_date": "string",
"end_date": "string"
}
}
}
PnlSkusResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | integer | true | none | none |
| seller_id | string | true | none | none |
| currency | string | true | none | none |
| start_date | string | true | none | none |
| end_date | string | true | none | none |
| total | integer | true | none | Distinct SKUs matching the window and filters, before paging. |
| limit | integer | true | none | none |
| offset | integer | true | none | none |
| selected_fields | [string] | false | none | The fee columns every SKU's amounts carries, in canonical order — provenance for the projection you asked for, so an absent key reads as 'not requested' rather than 'no data'. |
| currency_mismatched_costs | integer | true | none | COGS rows skipped because they are priced in a different currency than the shop. Non-zero means some SKUs' COGS is silently absent, so their gross_profit is overstated and units_uncosted under-counts. |
| skus | [PnlSkuRollup] | true | none | [One SKU's P&L for the window: revenue and fees summed, less its COGS. This is a GROSS / CONTRIBUTION view, not a net bottom line. The fee lines are the ones TikTok books against the order itself (referral, affiliate commission, refunds, discounts, and so on); ad spend is NOT among them because TikTok does not attribute it to a single SKU. So gross_profitstops one step short of net earnings — for the true shop-level bottom line that includes ad spend, use POST /pnl/summary and POST /pnl/profit.] |
| data_status | PnlDataStatus | true | none | Freshness and reachability of this shop's P&L data.state distinguishes "no sales" from "we cannot read the financeexport": no_permission means the shop's Seller Center account lacksfinance-tab access and the fix is customer-side, not a retry. |
PnlSummaryRequest
{
"start_date": "2019-08-24",
"end_date": "2019-08-24"
}
PnlSummaryRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| start_date | any | false | none | Inclusive window start (YYYY-MM-DD). Defaults to 29 days before end_date. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_date | any | false | none | Inclusive window end (YYYY-MM-DD). Defaults to yesterday — the current day is still accumulating. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
PnlSummaryResponse
{
"shop_id": 0,
"seller_id": "string",
"currency": "string",
"start_date": "string",
"end_date": "string",
"days_with_data": 0,
"totals": {
"gross_sales": 0,
"refunds": 0,
"referral_fee": 0,
"affiliate": 0,
"gmv_max": 0,
"campaigns": 0,
"managed_services": 0,
"shipping_and_warehousing_cost": 0,
"others": 0,
"net_earnings": 0
},
"rollups": {
"property1": 0,
"property2": 0
},
"data_status": {
"state": "string",
"last_synced_at": "string",
"last_window": {
"start_date": "string",
"end_date": "string"
}
}
}
PnlSummaryResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | integer | true | none | none |
| seller_id | string | true | none | none |
| currency | string | true | none | none |
| start_date | string | true | none | none |
| end_date | string | true | none | none |
| days_with_data | integer | true | none | Daily rows that contributed to these totals. |
| totals | PnlWaterfall | true | none | P&L lines for a window, straight from TikTok's own daily series. Signs are TikTok's: gross_sales is positive, cost lines are negative.Costs the platform cannot know (COGS, sample cost, creator bonuses, agency fees) are NOT represented here — those arrive with the cost-input layer. |
| rollups | object | false | none | TikTok's own rollup columns, reported BESIDE the waterfall and deliberately not inside it. total_marketing_cost is exactly gmv_max + affiliate + campaigns + managed_services, so adding it as a waterfall line would double-count all four. |
| » additionalProperties | number | false | none | none |
| data_status | PnlDataStatus | true | none | Freshness and reachability of this shop's P&L data.state distinguishes "no sales" from "we cannot read the financeexport": no_permission means the shop's Seller Center account lacksfinance-tab access and the fix is customer-side, not a retry. |
PnlTimeseriesPoint
{
"gross_sales": 0,
"refunds": 0,
"referral_fee": 0,
"affiliate": 0,
"gmv_max": 0,
"campaigns": 0,
"managed_services": 0,
"shipping_and_warehousing_cost": 0,
"others": 0,
"net_earnings": 0,
"period_start": "string"
}
PnlTimeseriesPoint
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| gross_sales | number | true | none | none |
| refunds | number | true | none | none |
| referral_fee | number | true | none | none |
| affiliate | number | true | none | Affiliate commission, incl. shop-ads commission. |
| gmv_max | number | true | none | GMV Max ad cost. Reliable at shop x day only — TikTok ships the per-order column empty, so per-SKU allocation needs GMV Max campaign data instead. |
| campaigns | number | true | none | none |
| managed_services | number | true | none | none |
| shipping_and_warehousing_cost | number | true | none | none |
| others | number | true | none | none |
| net_earnings | number | true | none | TikTok's own bottom line for the window. |
| period_start | string | true | none | none |
PnlTimeseriesRequest
{
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"cadence": "day"
}
PnlTimeseriesRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| start_date | any | false | none | Inclusive window start (YYYY-MM-DD). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_date | any | false | none | Inclusive window end (YYYY-MM-DD). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| cadence | string | false | none | Bucket size. Buckets are summed from TikTok's own daily rows, so they reconcile to Seller Center exactly. Week and bi-weekly anchor on Monday. |
Enumerated Values
| Property | Value |
|---|---|
| cadence | day |
| cadence | week |
| cadence | biweekly |
| cadence | month |
PnlTimeseriesResponse
{
"shop_id": 0,
"seller_id": "string",
"currency": "string",
"cadence": "string",
"series": [
{
"gross_sales": 0,
"refunds": 0,
"referral_fee": 0,
"affiliate": 0,
"gmv_max": 0,
"campaigns": 0,
"managed_services": 0,
"shipping_and_warehousing_cost": 0,
"others": 0,
"net_earnings": 0,
"period_start": "string"
}
],
"data_status": {
"state": "string",
"last_synced_at": "string",
"last_window": {
"start_date": "string",
"end_date": "string"
}
}
}
PnlTimeseriesResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | integer | true | none | none |
| seller_id | string | true | none | none |
| currency | string | true | none | none |
| cadence | string | true | none | none |
| series | [PnlTimeseriesPoint] | true | none | [One bucket of the running P&L series.] |
| data_status | PnlDataStatus | true | none | Freshness and reachability of this shop's P&L data.state distinguishes "no sales" from "we cannot read the financeexport": no_permission means the shop's Seller Center account lacksfinance-tab access and the fix is customer-side, not a retry. |
PnlWaterfall
{
"gross_sales": 0,
"refunds": 0,
"referral_fee": 0,
"affiliate": 0,
"gmv_max": 0,
"campaigns": 0,
"managed_services": 0,
"shipping_and_warehousing_cost": 0,
"others": 0,
"net_earnings": 0
}
PnlWaterfall
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| gross_sales | number | true | none | none |
| refunds | number | true | none | none |
| referral_fee | number | true | none | none |
| affiliate | number | true | none | Affiliate commission, incl. shop-ads commission. |
| gmv_max | number | true | none | GMV Max ad cost. Reliable at shop x day only — TikTok ships the per-order column empty, so per-SKU allocation needs GMV Max campaign data instead. |
| campaigns | number | true | none | none |
| managed_services | number | true | none | none |
| shipping_and_warehousing_cost | number | true | none | none |
| others | number | true | none | none |
| net_earnings | number | true | none | TikTok's own bottom line for the window. |
PreviewWindowRequest
{
"shop_id": 0,
"start_dow": 6,
"start_time": "14:15:22Z",
"end_dow": 6,
"end_time": "14:15:22Z"
}
PreviewWindowRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| start_dow | integer | true | none | none |
| start_time | string(time) | true | none | none |
| end_dow | integer | true | none | none |
| end_time | string(time) | true | none | none |
ProblemsRequest
{
"metric_code": "NRR",
"snapshot_date": "2019-08-24",
"page": 1,
"page_size": 20,
"version": 1
}
ProblemsRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| metric_code | string | true | none | none |
| snapshot_date | any | false | none | Snapshot day; defaults to the latest stored snapshot for this metric. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| page | integer | false | none | none |
| page_size | integer | false | none | none |
| version | any | false | none | Collector run to page through, as returned in version by the first page. Pass it back on later pages, together with the snapshot_date the first page resolved, so a rerun between requests cannot duplicate, skip or silently empty the list; omitted = newest run. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| metric_code | NRR |
| metric_code | NBFR |
| metric_code | SFCR |
| metric_code | OTDR |
| metric_code | AHT |
| metric_code | IM_DSAT |
ProductAffiliateChannel
{
"gmv": 0,
"video_gmv": 0,
"live_gmv": 0
}
ProductAffiliateChannel
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| gmv | number | true | none | none |
| video_gmv | number | true | none | none |
| live_gmv | number | true | none | none |
ProductCardChannel
{
"gmv": 0
}
ProductCardChannel
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| gmv | number | true | none | none |
ProductCardContent
{
"product_id": "string",
"product_name": "string",
"image_url": "string"
}
ProductCardContent
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_id | string | true | none | none |
| product_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| image_url | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
ProductCardGmvSplit
{
"gmv": 0,
"shop_tab": 0,
"search": 0,
"orders": 0,
"customers": 0
}
ProductCardGmvSplit
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| gmv | number | true | none | none |
| shop_tab | number | true | none | none |
| search | number | true | none | none |
| orders | integer | true | none | none |
| customers | integer | true | none | none |
ProductCatalogPaginatedResponse
{
"data": [
{
"shop_id": 0,
"product_id": "string",
"title": "string",
"description": "string",
"brand_name": "string",
"category_chain": [
null
],
"primary_image_url": "string",
"image_urls": [
null
],
"currency": "string",
"price_min_cents": 0,
"price_max_cents": 0,
"total_inventory": 0,
"sku_count": 0,
"out_of_stock_sku_count": 0,
"product_status": "string",
"affiliate_status": 0,
"is_cod_allowed": true,
"tiktok_created_at": "string",
"tiktok_updated_at": "string",
"updated_at": "string",
"skus": [
{
"sku_id": "string",
"seller_sku": "string",
"inventory": 0,
"variants": [
{
"name": "string",
"value_name": "string",
"value_id": "string",
"image_url": "string"
}
],
"updated_at": "string"
}
]
}
],
"pagination": null,
"shops_queried": [
"string"
]
}
ProductCatalogPaginatedResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | [CatalogProductItem] | true | none | none |
| pagination | any | true | none | none |
| shops_queried | any | false | none | Shop names included when querying multiple shops (x-shop-id: all or comma-separated). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
ProductCatalogRequest
{
"page": 1,
"page_size": 50,
"sort_by": "title",
"sort_dir": "asc",
"product_name": "string",
"product_status": "string",
"in_stock_only": false,
"updated_since": "2019-08-24T14:15:22Z",
"include_skus": true
}
ProductCatalogRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| page | integer | false | none | none |
| page_size | integer | false | none | none |
| sort_by | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sort_dir | string | false | none | none |
| product_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_status | any | false | none | Exact match on product_status, e.g. 'ACTIVATE'. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| in_stock_only | boolean | false | none | When true, only products with total_inventory > 0. |
| updated_since | any | false | none | Return only products Reacher synced on/after this instant. Accepts a plain date (YYYY-MM-DD, treated as midnight UTC) or a full ISO 8601 timestamp — pass the updated_at from a previous response verbatim to key an incremental catalog sync. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date-time) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| include_skus | boolean | false | none | Embed the per-SKU inventory array on each product. |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | title |
| anonymous | total_inventory |
| anonymous | price_min |
| anonymous | updated_at |
| sort_dir | asc |
| sort_dir | desc |
ProductChannels
{
"seller": {
"video_gmv": 0,
"live_gmv": 0
},
"affiliate": {
"gmv": 0,
"video_gmv": 0,
"live_gmv": 0
},
"product_card": {
"gmv": 0
},
"shop_tab": {
"gmv": 0,
"listing_impressions": 0,
"page_views": 0,
"unique_visitors": 0,
"customers": 0,
"items_sold": 0,
"ctr": 0
}
}
ProductChannels
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| seller | ProductSellerChannel | true | none | The seller's own video / live content. |
| affiliate | ProductAffiliateChannel | true | none | Creator-driven video / live content. |
| product_card | ProductCardChannel | true | none | none |
| shop_tab | ProductShopTabChannel | true | none | none |
ProductConfigItem
{
"id": 0,
"productId": "string",
"productName": "string",
"sku": "string",
"productImage": "string",
"monthlySampleLimit": 0,
"dailyApprovalTarget": 0,
"usedThisMonth": 0,
"idealCreatorProfiles": [
{
"id": 0,
"name": "string"
}
],
"config": {
"minGmv": 0,
"minPostRate": 0
},
"createdAt": "string",
"updatedAt": "string"
}
ProductConfigItem
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| id | integer | true | none | none |
| productId | string | true | none | none |
| productName | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sku | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| productImage | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| monthlySampleLimit | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| dailyApprovalTarget | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| usedThisMonth | integer | false | none | none |
| idealCreatorProfiles | [IdealProfileRef] | false | none | none |
| config | ProductConfigMinCriteria | false | none | none |
| createdAt | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| updatedAt | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
ProductConfigListResponse
{
"data": [
{
"id": 0,
"productId": "string",
"productName": "string",
"sku": "string",
"productImage": "string",
"monthlySampleLimit": 0,
"dailyApprovalTarget": 0,
"usedThisMonth": 0,
"idealCreatorProfiles": [
{
"id": 0,
"name": "string"
}
],
"config": {
"minGmv": 0,
"minPostRate": 0
},
"createdAt": "string",
"updatedAt": "string"
}
]
}
ProductConfigListResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | [ProductConfigItem] | true | none | none |
ProductConfigMinCriteria
{
"minGmv": 0,
"minPostRate": 0
}
ProductConfigMinCriteria
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| minGmv | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| minPostRate | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
ProductConfigResponse
{
"success": true,
"data": {
"id": 0,
"productId": "string",
"productName": "string",
"sku": "string",
"productImage": "string",
"monthlySampleLimit": 0,
"dailyApprovalTarget": 0,
"usedThisMonth": 0,
"idealCreatorProfiles": [
{
"id": 0,
"name": "string"
}
],
"config": {
"minGmv": 0,
"minPostRate": 0
},
"createdAt": "string",
"updatedAt": "string"
}
}
ProductConfigResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| success | boolean | false | none | none |
| data | ProductConfigItem | true | none | none |
ProductConfigUpsertRequest
{
"monthlySampleLimit": 0,
"dailyApprovalTarget": 0,
"idealCreatorProfileIds": [
0
],
"config": {
"minGmv": 0,
"minPostRate": 0
}
}
ProductConfigUpsertRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| monthlySampleLimit | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| dailyApprovalTarget | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| idealCreatorProfileIds | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [integer] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| config | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | ProductConfigMinCriteria | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
ProductContextResponse
{
"products": [
{
"id": "string",
"name": "string",
"brand": "",
"brandHandle": "",
"price": "",
"unit": "",
"image": "",
"description": "",
"badges": [
"string"
],
"topHooks": [
"string"
],
"brandVoice": ""
}
]
}
ProductContextResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| products | [ProductRef] | false | none | [One product the brief is generated for. Index 0 is the hero.] |
ProductCreatorItem
{
"creator_handle": "string",
"follower_count": 0,
"commission_rate": 0,
"gmv": 0
}
ProductCreatorItem
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_handle | any | false | none | DB: crm_creators.creator_name |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| follower_count | any | false | none | DB: follower_num |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| commission_rate | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| gmv | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
ProductCreatorsRequest
{
"page": 1,
"page_size": 50
}
ProductCreatorsRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| page | integer | false | none | none |
| page_size | integer | false | none | none |
ProductCreatorsResponse
{
"data": [
{
"creator_handle": "string",
"follower_count": 0,
"commission_rate": 0,
"gmv": 0
}
],
"currency": "string",
"pagination": null,
"shops_queried": [
"string"
]
}
ProductCreatorsResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | [ProductCreatorItem] | true | none | none |
| currency | string | true | none | ISO 4217 currency code for monetary values |
| pagination | any | true | none | none |
| shops_queried | any | false | none | Shop names included when querying multiple shops (x-shop-id: all or comma-separated). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
ProductFunnel
{
"impressions": 0,
"unique_viewers": 0,
"clicks": 0,
"unique_clickers": 0,
"ctr": 0,
"add_to_cart": 0,
"add_to_cart_rate": 0,
"orders": 0,
"click_to_order_rate": 0
}
ProductFunnel
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| impressions | integer | true | none | Product-detail impressions (page views). |
| unique_viewers | integer | true | none | none |
| clicks | integer | true | none | none |
| unique_clickers | integer | true | none | none |
| ctr | any | false | none | clicks / impressions. Null when there were no impressions. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| add_to_cart | integer | true | none | none |
| add_to_cart_rate | any | false | none | add_to_cart / clicks. Null when there were no clicks. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| orders | integer | true | none | SKU orders — the funnel's terminal step. |
| click_to_order_rate | any | false | none | orders / clicks. Null when there were no clicks. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
ProductItem-Input
{
"product_id": "string",
"tap_link": "string",
"product_name": "string"
}
ProductItem
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_id | string | true | none | none |
| tap_link | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
ProductItem-Output
{
"applyId": "string",
"productId": "string",
"name": "string",
"sku": "string",
"variantName": "string",
"productImage": "string",
"status": "string",
"qty": 1,
"isRepeatedRequest": true,
"isArchived": false,
"expiresInDays": 0,
"commissionRate": 0,
"stock": 0,
"sampleAllowanceLeft": 0,
"requestedAt": "string",
"expiresAt": "string",
"isExpired": false
}
ProductItem
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| applyId | string | true | none | none |
| productId | string | true | none | none |
| name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sku | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| variantName | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| productImage | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| status | string | true | none | none |
| qty | integer | false | none | none |
| isRepeatedRequest | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | boolean | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| isArchived | boolean | false | none | none |
| expiresInDays | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| commissionRate | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| stock | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sampleAllowanceLeft | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| requestedAt | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| expiresAt | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| isExpired | boolean | false | none | none |
ProductListItem
{
"product_id": "string",
"product_name": "string",
"gmv": 0,
"units_sold": 0,
"refund_units": 0,
"video_count": 0,
"sample_count": 0,
"live_count": 0,
"est_commission": 0,
"product_status": "string",
"sc_total_gmv": 0,
"sc_orders": 0,
"sc_units_sold": 0,
"sc_customers": 0,
"sc_aov": 0,
"sc_impressions": 0,
"sc_clicks": 0,
"sc_ctr": 0,
"sc_conversion": 0,
"sc_gmv_per_1k_impr": 0,
"sc_add_to_cart": 0,
"sc_affiliate_gmv": 0,
"sc_seller_video_gmv": 0,
"sc_seller_live_gmv": 0,
"sc_product_card_gmv": 0,
"sc_shop_tab_gmv": 0,
"sc_refunds": 0
}
ProductListItem
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_id | string | true | none | none |
| product_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| gmv | any | false | none | SUM of product_info.gmv_amount, normalized to float |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| units_sold | any | false | none | SUM of item_sold_cnt |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| refund_units | any | false | none | SUM of refund_item_cnt |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video_count | any | false | none | SUM of video_cnt |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sample_count | any | false | none | SUM of sample_cnt |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| live_count | any | false | none | SUM of live_cnt |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| est_commission | any | false | none | SUM of est_commission_amount, normalized |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_status | any | false | none | From product_catalog. NULL for unofficial shops. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sc_total_gmv | any | false | none | Total product GMV across all sales channels, from TikTok Seller Center. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sc_orders | any | false | none | Number of orders for this product, from TikTok Seller Center. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sc_units_sold | any | false | none | Units sold for this product, from TikTok Seller Center. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sc_customers | any | false | none | Distinct buyers for this product, from TikTok Seller Center. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sc_aov | any | false | none | Average order value (total GMV / total orders over the date range); null if no orders. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sc_impressions | any | false | none | Product impressions, from TikTok Seller Center. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sc_clicks | any | false | none | Product clicks, from TikTok Seller Center. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sc_ctr | any | false | none | Click-through rate as a percent (total clicks / total impressions over the date range); null if no impressions. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sc_conversion | any | false | none | Conversion rate as a percent (total orders / total clicks over the date range); null if no clicks. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sc_gmv_per_1k_impr | any | false | none | GMV per 1,000 impressions (total GMV / total impressions x 1,000 over the date range); null if no impressions. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sc_add_to_cart | any | false | none | Add-to-cart count for this product, from TikTok Seller Center. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sc_affiliate_gmv | any | false | none | GMV from the affiliate channel. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sc_seller_video_gmv | any | false | none | GMV from the seller's own videos. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sc_seller_live_gmv | any | false | none | GMV from the seller's own live streams. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sc_product_card_gmv | any | false | none | GMV from product cards. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sc_shop_tab_gmv | any | false | none | GMV from the shop tab. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sc_refunds | any | false | none | Refund amount for this product, from TikTok Seller Center. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
ProductPnlData
{
"product_id": "string",
"title": "string",
"primary_image_url": "string",
"category_chain": [],
"brand_name": "string",
"currency": "USD",
"skus": [],
"commission": {
"commission_rate": 0,
"shop_ads_commission_rate": 0
},
"discount_pct": 0
}
ProductPnlData
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_id | string | true | none | none |
| title | string | true | none | none |
| primary_image_url | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| category_chain | [object] | false | none | none |
| brand_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| currency | string | false | none | none |
| skus | [SkuPricing] | false | none | none |
| commission | CommissionInfo | false | none | none |
| discount_pct | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
ProductRef
{
"id": "string",
"name": "string",
"brand": "",
"brandHandle": "",
"price": "",
"unit": "",
"image": "",
"description": "",
"badges": [
"string"
],
"topHooks": [
"string"
],
"brandVoice": ""
}
ProductRef
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| id | string | true | none | none |
| name | string | true | none | none |
| brand | string | false | none | none |
| brandHandle | string | false | none | none |
| price | string | false | none | none |
| unit | string | false | none | none |
| image | string | false | none | none |
| description | string | false | none | none |
| badges | [string] | false | none | none |
| topHooks | [string] | false | none | none |
| brandVoice | string | false | none | none |
ProductSales
{
"gmv": 0,
"orders": 0,
"sku_orders": 0,
"items_sold": 0,
"customers": 0,
"aov": 0,
"refunds": 0,
"items_canceled_and_returned": 0
}
ProductSales
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| gmv | number | true | none | none |
| orders | integer | true | none | none |
| sku_orders | integer | true | none | SKU-level orders (a multi-SKU order counts once per SKU). |
| items_sold | integer | true | none | none |
| customers | integer | true | none | SUM of daily unique buyers; repeat-day buyers are counted twice. |
| aov | any | false | none | Window GMV / window orders. Null when there were no orders. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| refunds | number | true | none | none |
| items_canceled_and_returned | integer | true | none | none |
ProductSellerChannel
{
"video_gmv": 0,
"live_gmv": 0
}
ProductSellerChannel
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video_gmv | number | true | none | none |
| live_gmv | number | true | none | none |
ProductShopTabChannel
{
"gmv": 0,
"listing_impressions": 0,
"page_views": 0,
"unique_visitors": 0,
"customers": 0,
"items_sold": 0,
"ctr": 0
}
ProductShopTabChannel
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| gmv | number | true | none | none |
| listing_impressions | integer | true | none | none |
| page_views | integer | true | none | none |
| unique_visitors | integer | true | none | none |
| customers | integer | true | none | none |
| items_sold | integer | true | none | none |
| ctr | any | false | none | page_views / listing_impressions on the shop tab. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
ProductUsageItem
{
"productId": "string",
"usedThisMonth": 0
}
ProductUsageItem
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| productId | string | true | none | none |
| usedThisMonth | integer | true | none | none |
ProductUsageResponse
{
"data": [
{
"productId": "string",
"usedThisMonth": 0
}
]
}
ProductUsageResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | [ProductUsageItem] | true | none | none |
ProductVideosRequest
{
"page": 1,
"page_size": 50,
"sort_by": "video_gmv",
"sort_dir": "asc",
"start_date": "2019-08-24",
"end_date": "2019-08-24"
}
ProductVideosRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| page | integer | false | none | none |
| page_size | integer | false | none | none |
| sort_by | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sort_dir | string | false | none | none |
| start_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | video_gmv |
| anonymous | views |
| anonymous | units_sold |
| anonymous | posted_date |
| anonymous | like_count |
| sort_dir | asc |
| sort_dir | desc |
ProductsListPaginatedResponse
{
"data": [
{
"product_id": "string",
"product_name": "string",
"gmv": 0,
"units_sold": 0,
"refund_units": 0,
"video_count": 0,
"sample_count": 0,
"live_count": 0,
"est_commission": 0,
"product_status": "string",
"sc_total_gmv": 0,
"sc_orders": 0,
"sc_units_sold": 0,
"sc_customers": 0,
"sc_aov": 0,
"sc_impressions": 0,
"sc_clicks": 0,
"sc_ctr": 0,
"sc_conversion": 0,
"sc_gmv_per_1k_impr": 0,
"sc_add_to_cart": 0,
"sc_affiliate_gmv": 0,
"sc_seller_video_gmv": 0,
"sc_seller_live_gmv": 0,
"sc_product_card_gmv": 0,
"sc_shop_tab_gmv": 0,
"sc_refunds": 0
}
],
"currency": "string",
"pagination": null,
"date_range": {
"start_date": "string",
"end_date": "string"
},
"shops_queried": [
"string"
]
}
ProductsListPaginatedResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | [ProductListItem] | true | none | none |
| currency | string | true | none | none |
| pagination | any | true | none | none |
| date_range | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | DateRange | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shops_queried | any | false | none | Shop names included when querying multiple shops (x-shop-id: all or comma-separated). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
ProductsListRequest
{
"page": 1,
"page_size": 50,
"sort_by": "gmv",
"sort_dir": "asc",
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"product_name": "string"
}
ProductsListRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| page | integer | false | none | none |
| page_size | integer | false | none | none |
| sort_by | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sort_dir | string | false | none | none |
| start_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | gmv |
| anonymous | units_sold |
| anonymous | video_count |
| anonymous | sample_count |
| anonymous | est_commission |
| sort_dir | asc |
| sort_dir | desc |
ProductsRequest
{
"preset": "string",
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"limit": 20,
"page": 1,
"sort": "gmv",
"include_inactive": false
}
ProductsRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| preset | any | false | none | Relative window ending at the shop's newest settled day: <n>d (1-999), <n>m (1-99) or all, always capped at 365 days. Mutually exclusive with explicit dates; defaults to 30d when neither is given. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| start_date | any | false | none | Inclusive window start (YYYY-MM-DD). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_date | any | false | none | Inclusive window end (YYYY-MM-DD). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| limit | integer | false | none | Products per page. |
| page | integer | false | none | 1-based page over the ranked list. |
| sort | string | false | none | Rank by this window total, descending. |
| include_inactive | boolean | false | none | Also list products the catalogue knows are deactivated or rejected. Off by default; out-of-stock products are always listed. |
Enumerated Values
| Property | Value |
|---|---|
| sort | gmv |
| sort | orders |
| sort | product_clicks |
| sort | add_cart_count |
ProfileCreateRequest
{
"name": "string",
"criteria": {
"minPostRate": 0,
"gmvRange": {
"min": 0,
"max": 0
},
"minViews": 0,
"minFollowers": 0
}
}
ProfileCreateRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| name | string | true | none | none |
| criteria | ProfileCriteria | true | none | none |
ProfileCriteria
{
"minPostRate": 0,
"gmvRange": {
"min": 0,
"max": 0
},
"minViews": 0,
"minFollowers": 0
}
ProfileCriteria
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| minPostRate | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| gmvRange | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | GmvRange | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| minViews | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| minFollowers | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
ProfileData
{
"id": 0,
"title": "string",
"description": "string",
"search_query": "string",
"filters": {},
"source": "string",
"is_active": true,
"vault_file_resource_id": 0,
"is_hidden": true,
"is_deleted": true,
"hide_unsafe": true,
"creator_count": 0,
"last_search_at": "2019-08-24T14:15:22Z",
"created_at": "2019-08-24T14:15:22Z",
"updated_at": "2019-08-24T14:15:22Z",
"deleted_at": "2019-08-24T14:15:22Z"
}
ProfileData
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| id | integer | true | none | none |
| title | string | true | none | none |
| description | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| search_query | string | true | none | none |
| filters | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | object | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| source | string | true | none | none |
| is_active | boolean | true | none | none |
| vault_file_resource_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| is_hidden | boolean | true | none | none |
| is_deleted | boolean | true | none | none |
| hide_unsafe | boolean | false | none | none |
| creator_count | integer | true | none | none |
| last_search_at | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date-time) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| created_at | string(date-time) | true | none | none |
| updated_at | string(date-time) | true | none | none |
| deleted_at | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date-time) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
ProfileItem
{
"id": 0,
"name": "string",
"criteria": {
"minPostRate": 0,
"gmvRange": {
"min": 0,
"max": 0
},
"minViews": 0,
"minFollowers": 0
},
"linkedProducts": 0,
"createdAt": "string",
"updatedAt": "string"
}
ProfileItem
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| id | integer | true | none | none |
| name | string | true | none | none |
| criteria | ProfileCriteria | false | none | none |
| linkedProducts | integer | false | none | none |
| createdAt | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| updatedAt | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
ProfileResponse
{
"success": true,
"data": {
"id": 0,
"name": "string",
"criteria": {
"minPostRate": 0,
"gmvRange": {
"min": 0,
"max": 0
},
"minViews": 0,
"minFollowers": 0
},
"linkedProducts": 0,
"createdAt": "string",
"updatedAt": "string"
}
}
ProfileResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| success | boolean | false | none | none |
| data | ProfileItem | true | none | none |
PublicProductConfigCreateRequest
{
"monthlySampleLimit": 0,
"dailyApprovalTarget": 0,
"idealCreatorProfileIds": [
0
],
"config": {
"minGmv": 0,
"minPostRate": 0
},
"productId": "string"
}
PublicProductConfigCreateRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| monthlySampleLimit | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| dailyApprovalTarget | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| idealCreatorProfileIds | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [integer] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| config | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | ProductConfigMinCriteria | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| productId | string | true | none | none |
PublicQuotaUpdateRequest
{
"monthlyLimit": 0
}
PublicQuotaUpdateRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| monthlyLimit | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
PublishedUrlResponse
{
"url": "string"
}
PublishedUrlResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| url | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
QuotaSettingsItem
{
"shopId": 0,
"monthlyLimit": 0,
"createdAt": "string",
"updatedAt": "string"
}
QuotaSettingsItem
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shopId | integer | true | none | none |
| monthlyLimit | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| createdAt | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| updatedAt | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
QuotaSettingsResponse
{
"success": true,
"data": {
"shopId": 0,
"monthlyLimit": 0,
"createdAt": "string",
"updatedAt": "string"
}
}
QuotaSettingsResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| success | boolean | false | none | none |
| data | QuotaSettingsItem | true | none | none |
RaceMetric
"video"
RaceMetric
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| RaceMetric | string | false | none | The unit a Race funds. Each maps to a distinct candidate query. |
Enumerated Values
| Property | Value |
|---|---|
| RaceMetric | video |
| RaceMetric | views |
| RaceMetric | live |
RacePricing
{
"campaign_type": "race",
"reward_type": "cash",
"metric_type": "gmv",
"race_metric": "video",
"race_prize_pool": 0,
"race_amount_per_unit": 0,
"race_max_per_creator": 0,
"race_hide_budget": false,
"race_clock": "tiktok"
}
RacePricing
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| campaign_type | string | false | none | none |
| reward_type | string | false | none | none |
| metric_type | string | false | none | none |
| race_metric | RaceMetric | false | none | The unit a Race funds. Each maps to a distinct candidate query. |
| race_prize_pool | any | true | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| race_amount_per_unit | any | true | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| race_max_per_creator | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| race_hide_budget | boolean | false | none | none |
| race_clock | string | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| race_clock | tiktok |
| race_clock | submission |
RangeFilter
{
"min": 0,
"max": 0
}
RangeFilter
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| min | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| max | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
RecommendedAction
{
"type": "string",
"title": "string",
"description": "string",
"items": []
}
RecommendedAction
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| type | string | true | none | none |
| title | string | true | none | none |
| description | string | true | none | none |
| items | [RecommendedActionItem] | false | none | [Single entity referenced by a recommended action (creator / video / product).] |
RecommendedActionItem
{
"id": "string",
"label": "string",
"image_url": "string",
"metric_label": "string",
"deep_link": "string"
}
RecommendedActionItem
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| id | string | true | none | none |
| label | string | true | none | none |
| image_url | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| metric_label | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| deep_link | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
RecommendedActionsResponse
{
"shop_id": 0,
"actions": []
}
RecommendedActionsResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | integer | true | none | none |
| actions | [RecommendedAction] | false | none | [One recommended action shown in the Affiliate Report ("Affiliate Summary"). Generation is currently rule-based — items are pulled from the same top-N realtime queries the report itself uses, then templated into actionable copy ("Send more samples to these top creators", "Replicate these hooks in your next brief", "Prioritize sample budget for these products"). The Pydantic shape is deliberately generic so a future Gemini-backed implementation can swap in without FE / report-section changes — see the docstring on get_recommended_actions for the swap-point and how to wire the model call.] |
Recurrence
{
"frequency": "daily",
"end_type": "never",
"until": "2019-08-24",
"occurrences": 0
}
Recurrence
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| frequency | string | true | none | none |
| end_type | string | false | none | none |
| until | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| occurrences | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| frequency | daily |
| frequency | weekdays |
| frequency | weekly |
| frequency | biweekly |
| frequency | monthly |
| end_type | never |
| end_type | on |
| end_type | after |
Region
"US"
Region
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| Region | string | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| Region | US |
| Region | UK |
| Region | IT |
| Region | ES |
| Region | DE |
| Region | FR |
| Region | IE |
| Region | MX |
| Region | BR |
| Region | JP |
| Region | NL |
| Region | AT |
| Region | BE |
| Region | CZ |
| Region | GR |
| Region | HU |
| Region | PL |
| Region | PT |
ReimbursementReward
{
"kind": "reimbursement",
"reimbursement_amount": 0,
"reimbursement_bonus": 0,
"minimum_star_rating": 1,
"steps": [
{
"id": "string",
"label": "string",
"description": "string"
}
],
"payment_due_days": 30
}
ReimbursementReward
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| kind | string | true | none | none |
| reimbursement_amount | number | true | none | none |
| reimbursement_bonus | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| minimum_star_rating | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| steps | [ReimbursementStep] | true | none | none |
| payment_due_days | integer | false | none | none |
ReimbursementStep
{
"id": "string",
"label": "string",
"description": "string"
}
ReimbursementStep
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| id | string | true | none | none |
| label | string | true | none | none |
| description | string | true | none | none |
RejectCreatorRequest
{
"message": "string"
}
RejectCreatorRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| message | any | false | none | Optional custom message included in the creator's rejection email/SMS. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
RemoveCreatorRequest
{
"campaign_id": 0,
"message": "string"
}
RemoveCreatorRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| campaign_id | integer | true | none | Campaign (in the x-shop-id shop) to remove the creator from. |
| message | any | false | none | Optional SMS sent to the creator on removal. Removal is otherwise silent (no email, no default SMS). Length capped at 320 to match the service's SMS limit. SKIPPED on X-Dry-Run. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
RemoveCreatorResponse
{
"success": true,
"code": "ok",
"data": {}
}
RemoveCreatorResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| success | boolean | false | none | none |
| code | string | false | none | ok on a real removal; already_removed on an idempotent no-op replay of an already-removed mapping. |
| data | object | false | none | {campaign_creator_mapping_id, status='removed'}. |
RepostBehaviorResponse
{
"window_days": 0,
"lookback_days": 120,
"population": 0,
"reengageable": 0,
"buckets": [
{
"bucket": "string",
"creators": 0,
"posts": 0
}
]
}
RepostBehaviorResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| window_days | integer | true | none | Recency window separating active from lapsed. |
| lookback_days | integer | false | none | Population window: creators with ≥1 post in this many days. |
| population | integer | false | none | Creators in the population. |
| reengageable | integer | false | none | posted_once + lapsed_reposter — the actionable segment. |
| buckets | [RepostBucket] | false | none | [One repost-behaviour bucket and its size.] |
RepostBucket
{
"bucket": "string",
"creators": 0,
"posts": 0
}
RepostBucket
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| bucket | string | true | none | 'actively_reposting' |
| creators | integer | false | none | none |
| posts | integer | false | none | none |
RequestMoreContentRequest
{
"creator_id": 0,
"campaign_creator_mapping_id": 0,
"campaign_id": 0,
"additional_posts": 1,
"new_total_payout": 0,
"minimum_gmv_target": 0,
"tiktok_username": "string",
"creator_status": "pending"
}
RequestMoreContentRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_id | integer | true | none | none |
| campaign_creator_mapping_id | integer | true | none | none |
| campaign_id | integer | true | none | none |
| additional_posts | integer | true | none | none |
| new_total_payout | any | true | none | New total payout — number for cash campaigns, string label (e.g. 'free product') for custom-reward campaigns. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| minimum_gmv_target | number | true | none | none |
| tiktok_username | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_status | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | CreatorStatus | false | none | Lifecycle status of a creator within a campaign. |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
RequestMoreContentResponse
{
"status": "success"
}
RequestMoreContentResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| status | string | false | none | none |
ResolvedDateRange
{
"start_date": "string",
"end_date": "string"
}
ResolvedDateRange
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| start_date | string | true | none | none |
| end_date | string | true | none | none |
RestoreVideosData
{
"restored_video_ids": [
"string"
],
"not_excluded_video_ids": [
"string"
]
}
RestoreVideosData
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| restored_video_ids | [string] | true | none | none |
| not_excluded_video_ids | [string] | true | none | none |
RestoreVideosDryRunData
{
"action": "restore",
"campaign_id": 0,
"video_ids": [
"string"
]
}
RestoreVideosDryRunData
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| action | string | true | none | none |
| campaign_id | integer | true | none | none |
| video_ids | [string] | true | none | none |
RestoreVideosDryRunResponse
{
"dry_run": true,
"would": {
"action": "restore",
"campaign_id": 0,
"video_ids": [
"string"
]
}
}
RestoreVideosDryRunResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| dry_run | boolean | true | none | none |
| would | RestoreVideosDryRunData | true | none | none |
RestoreVideosRequest
{
"video_ids": [
"string"
]
}
RestoreVideosRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video_ids | [string] | true | none | none |
RestoreVideosResponse
{
"success": true,
"code": "string",
"data": {
"restored_video_ids": [
"string"
],
"not_excluded_video_ids": [
"string"
]
}
}
RestoreVideosResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| success | boolean | true | none | none |
| code | string | true | none | none |
| data | RestoreVideosData | true | none | none |
RetainerPricing
{
"campaign_type": "retainer",
"posts": 1,
"payment_per_creator": 0,
"reward_type": "cash",
"metric_type": "gmv",
"minimum_gmv_required": 0,
"minimum_gmv_required_enabled": false,
"minimum_views_required": 0,
"minimum_views_required_enabled": false,
"minimum_videos_required": 0
}
RetainerPricing
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| campaign_type | string | false | none | none |
| posts | integer | true | none | Required posts per creator |
| payment_per_creator | any | true | none | Payment amount (float for cash, str for custom) |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| reward_type | RewardType | true | none | Cash or custom reward |
| metric_type | string | false | none | Performance metric to evaluate |
| minimum_gmv_required | any | false | none | Minimum GMV threshold |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| minimum_gmv_required_enabled | boolean | false | none | Whether minimum GMV requirement is active |
| minimum_views_required | any | false | none | Minimum views threshold |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| minimum_views_required_enabled | boolean | false | none | Whether minimum views requirement is active |
| minimum_videos_required | any | false | none | Minimum videos threshold (for videos_posted/gmv_videos metric) |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| metric_type | gmv |
| metric_type | views |
| metric_type | videos_posted |
| metric_type | gmv_videos |
RetainerReward
{
"kind": "retainer",
"mode": "fixed",
"payment_per_post": 0,
"tiers": [
{
"name": "string",
"retainer": 0,
"gmv_threshold": 0
}
],
"gmv_bonus_tiers": [
{
"gmv_threshold": 0,
"bonus_amount": 0
}
],
"recurring": false,
"payment_schedule": "one_time",
"payment_due_days": 30,
"minimum_gmv_floor": 0
}
RetainerReward
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| kind | string | true | none | none |
| mode | string | true | none | none |
| payment_per_post | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| tiers | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [RetainerTier] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| gmv_bonus_tiers | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [GmvBonusTier] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| recurring | boolean | false | none | none |
| payment_schedule | string | false | none | none |
| payment_due_days | integer | false | none | none |
| minimum_gmv_floor | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| mode | fixed |
| mode | tiered |
| payment_schedule | one_time |
| payment_schedule | monthly |
RetainerTier
{
"name": "string",
"retainer": 0,
"gmv_threshold": 0
}
RetainerTier
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| name | string | true | none | none |
| retainer | any | true | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| gmv_threshold | number | true | none | none |
RewardType
"cash"
RewardType
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| RewardType | string | false | none | Reward payout mechanism. |
Enumerated Values
| Property | Value |
|---|---|
| RewardType | cash |
| RewardType | custom |
SIVideoTranscriptResponse
{
"video_id": "string",
"seller_id": "string",
"available": true,
"transcript": "string",
"transcript_language": "string",
"transcript_status": "string"
}
SIVideoTranscriptResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video_id | string | true | none | none |
| seller_id | any | false | none | The TikTok seller (brand) the video belongs to. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| available | boolean | true | none | True when a completed transcript is available for this video. |
| transcript | any | false | none | Spoken-audio transcript text of the competitor video. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| transcript_language | any | false | none | BCP-47 language code the transcript was produced in. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| transcript_status | any | false | none | Transcription status: completed, failed, no_speech (nothing spoken to transcribe), or processing. Null when we hold no row for the video at all. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
SampleByProductItem
{
"product_id": "string",
"product_name": "string",
"total_requests": 0,
"approved": 0,
"sample_gmv": 0,
"videos_from_samples": 0
}
SampleByProductItem
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_id | string | true | none | none |
| product_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| total_requests | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| approved | any | false | none | DB: shipped_sample_cnt |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sample_gmv | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| videos_from_samples | any | false | none | DB: received_sample_and_posted_video_cnt |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
SampleListItem
{
"creator_handle": "string",
"product_id": "string",
"product_title": "string",
"status": "string",
"gmv": 0,
"units_sold": 0,
"sample_received": 0,
"updated_at": "string",
"bio": "string",
"categories": [
"string"
],
"email": "string"
}
SampleListItem
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_handle | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_title | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| status | any | false | none | Display status from rev_status_mapping() |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| gmv | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| units_sold | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sample_received | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| updated_at | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| bio | any | false | none | Creator bio text. Sourced from the per-region creators table — the same field exposed by the AI Creator Search API. Null when the creator has no regional row. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| categories | any | false | none | Creator categories / niches. Parsed via the same helper the AI Creator Search API uses (handles JSON-array and comma-separated stored values). Null when the creator has no regional row. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| any | false | none | Creator contact email when known on the regional creators table. Null when the creator has no regional row or no email captured. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
SampleRequestAutoApprovalSettings
{
"enabled": false,
"total_weekly_approved_sample_limit": 1,
"always_approve_status": "string",
"always_approve_from_lists_ids": [
0
]
}
SampleRequestAutoApprovalSettings
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| enabled | boolean | false | none | none |
| total_weekly_approved_sample_limit | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| always_approve_status | any | false | none | Auto-approve creators whose top-level automation_status matches this value (e.g. APPROVED, LIVE_CREATOR). Null = no status-based bypass. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| always_approve_from_lists_ids | [integer] | false | none | Vault list IDs whose members bypass criteria gates and are always approved. |
SampleRequestPatchPayload
{
"action": "approve",
"rejection_reason": "NOT_MATCH",
"approval_message": "string",
"rejection_message": "string",
"message_images": [
"string"
],
"products": {
"include_all_products": false,
"selected_products": [
{
"product_id": "string",
"max_approvals_per_week": 10000
}
],
"weekly_auto_approval_per_product": 1
},
"minimum_performance_criteria": {
"followers": 0,
"avg_views": 0,
"engagement_rate": 1,
"post_rate": 1,
"creator_gmv_30_days": 0,
"gmv_per_sample": 0
},
"maximum_performance_criteria": {
"followers": 0,
"avg_views": 0,
"engagement_rate": 1,
"post_rate": 1,
"creator_gmv_30_days": 0,
"gmv_per_sample": 0
},
"auto_approval_settings": {
"enabled": false,
"total_weekly_approved_sample_limit": 1,
"always_approve_status": "string",
"always_approve_from_lists_ids": [
0
]
},
"target_list": [
0
]
}
SampleRequestPatchPayload
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| action | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| rejection_reason | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| approval_message | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| rejection_message | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| message_images | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| products | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | SampleRequestProducts | false | none | Sample-request product targeting. Two modes: * include_all_products=True → all shop products eligible; supplyweekly_auto_approval_per_product for the global per-product cap.* include_all_products=False → enumerate selected_products withper-product max_approvals_per_week caps.Mirrors the legacy sample_request_config.products shape exactly soFE-built and API-built automations are interchangeable to the worker. |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| minimum_performance_criteria | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | SampleRequestPerformanceCriteria | false | none | Min/max performance gate for sample-request approval. All fields are optional — omit a field to skip that side of the bound. API contract uses unprefixed field names + decimal 0-1 scale for rates ( engagement_rate=0.05 for 5%). The translator emits the V2 backend'sasymmetric prefix names + 0-100 percent scale at persistence. See modules/automations/SampleRequestConfigModels.py for the V2 shape: - min side → min_followers, min_avg_views, min_engagement_rate,min_post_rate, min_creator_gmv_30_days, min_gmv_per_sample- max side → maximum_followers, maximum_avg_views,maximum_engagement_rate, maximum_post_rate,maximum_creator_gmv, maximum_gmv_per_sample |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| maximum_performance_criteria | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | SampleRequestPerformanceCriteria | false | none | Min/max performance gate for sample-request approval. All fields are optional — omit a field to skip that side of the bound. API contract uses unprefixed field names + decimal 0-1 scale for rates ( engagement_rate=0.05 for 5%). The translator emits the V2 backend'sasymmetric prefix names + 0-100 percent scale at persistence. See modules/automations/SampleRequestConfigModels.py for the V2 shape: - min side → min_followers, min_avg_views, min_engagement_rate,min_post_rate, min_creator_gmv_30_days, min_gmv_per_sample- max side → maximum_followers, maximum_avg_views,maximum_engagement_rate, maximum_post_rate,maximum_creator_gmv, maximum_gmv_per_sample |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| auto_approval_settings | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | SampleRequestAutoApprovalSettings | false | none | Optional auto-approval gating beyond the min/max criteria. * enabled=False → manual review for every request that passes theperformance gate. Other fields ignored. * enabled=True + always_approve_status set → auto-approve anycreator whose automation_status matches; bypass criteria.* total_weekly_approved_sample_limit → hard ceiling on weeklyauto-approvals across all creators (not per-product). * always_approve_from_lists_ids → approve members of these vaultlists regardless of criteria. Mirrors sample_request_config.auto_approval_settings. |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| target_list | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [integer] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | approve |
| anonymous | reject |
| anonymous | NOT_MATCH |
| anonymous | OFFLINE |
| anonymous | OUT_OF_STOCK |
| anonymous | OTHER |
SampleRequestPayload
{
"action": "approve",
"rejection_reason": "NOT_MATCH",
"approval_message": "string",
"rejection_message": "string",
"message_images": [
"string"
],
"products": {
"include_all_products": false,
"selected_products": [
{
"product_id": "string",
"max_approvals_per_week": 10000
}
],
"weekly_auto_approval_per_product": 1
},
"minimum_performance_criteria": {
"followers": 0,
"avg_views": 0,
"engagement_rate": 1,
"post_rate": 1,
"creator_gmv_30_days": 0,
"gmv_per_sample": 0
},
"maximum_performance_criteria": {
"followers": 0,
"avg_views": 0,
"engagement_rate": 1,
"post_rate": 1,
"creator_gmv_30_days": 0,
"gmv_per_sample": 0
},
"auto_approval_settings": {
"enabled": false,
"total_weekly_approved_sample_limit": 1,
"always_approve_status": "string",
"always_approve_from_lists_ids": [
0
]
},
"target_list": [
0
]
}
SampleRequestPayload
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| action | string | true | none | none |
| rejection_reason | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| approval_message | any | false | none | DM body sent to the creator on approval. Only meaningful when action='approve' — rejected with reject. Persists as sample_request_config.approval_message. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| rejection_message | any | false | none | DM body sent to the creator on rejection. Only meaningful when action='reject'. Persists as sample_request_config.rejection_message. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| message_images | [string] | false | none | Optional HTTPS image URLs to attach to the approval / rejection DM. Same URL contract as MessageAddon.image_url — server fetches + re-hosts. |
| products | SampleRequestProducts | true | none | Sample-request product targeting. Two modes: * include_all_products=True → all shop products eligible; supplyweekly_auto_approval_per_product for the global per-product cap.* include_all_products=False → enumerate selected_products withper-product max_approvals_per_week caps.Mirrors the legacy sample_request_config.products shape exactly soFE-built and API-built automations are interchangeable to the worker. |
| minimum_performance_criteria | SampleRequestPerformanceCriteria | false | none | Min/max performance gate for sample-request approval. All fields are optional — omit a field to skip that side of the bound. API contract uses unprefixed field names + decimal 0-1 scale for rates ( engagement_rate=0.05 for 5%). The translator emits the V2 backend'sasymmetric prefix names + 0-100 percent scale at persistence. See modules/automations/SampleRequestConfigModels.py for the V2 shape: - min side → min_followers, min_avg_views, min_engagement_rate,min_post_rate, min_creator_gmv_30_days, min_gmv_per_sample- max side → maximum_followers, maximum_avg_views,maximum_engagement_rate, maximum_post_rate,maximum_creator_gmv, maximum_gmv_per_sample |
| maximum_performance_criteria | SampleRequestPerformanceCriteria | false | none | Min/max performance gate for sample-request approval. All fields are optional — omit a field to skip that side of the bound. API contract uses unprefixed field names + decimal 0-1 scale for rates ( engagement_rate=0.05 for 5%). The translator emits the V2 backend'sasymmetric prefix names + 0-100 percent scale at persistence. See modules/automations/SampleRequestConfigModels.py for the V2 shape: - min side → min_followers, min_avg_views, min_engagement_rate,min_post_rate, min_creator_gmv_30_days, min_gmv_per_sample- max side → maximum_followers, maximum_avg_views,maximum_engagement_rate, maximum_post_rate,maximum_creator_gmv, maximum_gmv_per_sample |
| auto_approval_settings | SampleRequestAutoApprovalSettings | false | none | Optional auto-approval gating beyond the min/max criteria. * enabled=False → manual review for every request that passes theperformance gate. Other fields ignored. * enabled=True + always_approve_status set → auto-approve anycreator whose automation_status matches; bypass criteria.* total_weekly_approved_sample_limit → hard ceiling on weeklyauto-approvals across all creators (not per-product). * always_approve_from_lists_ids → approve members of these vaultlists regardless of criteria. Mirrors sample_request_config.auto_approval_settings. |
| target_list | [integer] | true | none | List IDs (vault_files.resource_id, integer form). Required (≥1) — sample_request type uses target_list for creator selection, NOT creators_to_include. |
Enumerated Values
| Property | Value |
|---|---|
| action | approve |
| action | reject |
| anonymous | NOT_MATCH |
| anonymous | OFFLINE |
| anonymous | OUT_OF_STOCK |
| anonymous | OTHER |
SampleRequestPerformanceCriteria
{
"followers": 0,
"avg_views": 0,
"engagement_rate": 1,
"post_rate": 1,
"creator_gmv_30_days": 0,
"gmv_per_sample": 0
}
SampleRequestPerformanceCriteria
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| followers | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| avg_views | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| engagement_rate | any | false | none | Decimal 0-1 (e.g. 0.05 = 5%). Translator scales to 0-100 percent at persistence. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| post_rate | any | false | none | Decimal 0-1 (e.g. 0.5 = 50%). Translator scales to 0-100 percent at persistence. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_gmv_30_days | any | false | none | Creator GMV over the trailing 30 days. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| gmv_per_sample | any | false | none | GMV per sample sent — gates whether the creator's prior samples drove enough revenue. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
SampleRequestProductCap
{
"product_id": "string",
"max_approvals_per_week": 10000
}
SampleRequestProductCap
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_id | string | true | none | TikTok Shop product ID (numeric string). |
| max_approvals_per_week | integer | true | none | Per-product weekly auto-approval cap. Matches the V2 backend field name (SampleRequestConfigModels.SelectedProduct.max_approvals_per_week); 0 = no auto-approvals for this product. |
SampleRequestProducts
{
"include_all_products": false,
"selected_products": [
{
"product_id": "string",
"max_approvals_per_week": 10000
}
],
"weekly_auto_approval_per_product": 1
}
SampleRequestProducts
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| include_all_products | boolean | false | none | none |
| selected_products | [SampleRequestProductCap] | false | none | none |
| weekly_auto_approval_per_product | any | false | none | Per-product weekly cap that applies to ALL shop products (only meaningful when include_all_products=True). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
SampleRequestRow
{
"creator": {
"id": "string",
"handle": "string",
"name": "string",
"creatorImage": "string",
"followers": 0,
"creatorLevel": "string",
"fastGrowing": true,
"isRisingStar": true,
"returning": true,
"tags": [
"string"
]
},
"products": [
{
"applyId": "string",
"productId": "string",
"name": "string",
"sku": "string",
"variantName": "string",
"productImage": "string",
"status": "string",
"qty": 1,
"isRepeatedRequest": true,
"isArchived": false,
"expiresInDays": 0,
"commissionRate": 0,
"stock": 0,
"sampleAllowanceLeft": 0,
"requestedAt": "string",
"expiresAt": "string",
"isExpired": false
}
],
"aggregated": {
"unfulfilled": 0,
"postRate": 0,
"avgViews": 0,
"ppsScore": 0,
"liveGmv": 0,
"engagementRate": 0,
"shopGmv": 0,
"creatorGmv": 0,
"avgGmvPerVideo": 0,
"gmvPerSample": 0,
"videosPerSample": 0
},
"productCount": 0,
"requestDate": "string",
"expiresInDays": 0,
"source": "string"
}
SampleRequestRow
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator | CreatorInfo | true | none | none |
| products | [ProductItem-Output] | true | none | none |
| aggregated | AggregatedMetrics | true | none | none |
| productCount | integer | true | none | none |
| requestDate | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| expiresInDays | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| source | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
SamplesByProductPaginatedResponse
{
"data": [
{
"product_id": "string",
"product_name": "string",
"total_requests": 0,
"approved": 0,
"sample_gmv": 0,
"videos_from_samples": 0
}
],
"currency": "string",
"pagination": null,
"date_range": {
"start_date": "string",
"end_date": "string"
},
"shops_queried": [
"string"
]
}
SamplesByProductPaginatedResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | [SampleByProductItem] | true | none | none |
| currency | string | true | none | none |
| pagination | any | true | none | none |
| date_range | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | DateRange | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shops_queried | any | false | none | Shop names included when querying multiple shops (x-shop-id: all or comma-separated). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
SamplesByProductRequest
{
"page": 1,
"page_size": 50,
"sort_by": "total_requests",
"sort_dir": "asc",
"start_date": "2019-08-24",
"end_date": "2019-08-24"
}
SamplesByProductRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| page | integer | false | none | none |
| page_size | integer | false | none | none |
| sort_by | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sort_dir | string | false | none | none |
| start_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | total_requests |
| anonymous | approved |
| anonymous | sample_gmv |
| sort_dir | asc |
| sort_dir | desc |
SamplesListPaginatedResponse
{
"data": [
{
"creator_handle": "string",
"product_id": "string",
"product_title": "string",
"status": "string",
"gmv": 0,
"units_sold": 0,
"sample_received": 0,
"updated_at": "string",
"bio": "string",
"categories": [
"string"
],
"email": "string"
}
],
"currency": "string",
"pagination": null,
"date_range": {
"start_date": "string",
"end_date": "string"
},
"shops_queried": [
"string"
]
}
SamplesListPaginatedResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | [SampleListItem] | true | none | none |
| currency | string | true | none | none |
| pagination | any | true | none | none |
| date_range | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | DateRange | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shops_queried | any | false | none | Shop names included when querying multiple shops (x-shop-id: all or comma-separated). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
SamplesListRequest
{
"page": 1,
"page_size": 50,
"sort_by": "updated_at",
"sort_dir": "asc",
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"status": "string",
"creator_handle": "string",
"product_id": "string"
}
SamplesListRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| page | integer | false | none | none |
| page_size | integer | false | none | none |
| sort_by | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sort_dir | string | false | none | none |
| start_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| status | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_handle | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | updated_at |
| anonymous | created_at |
| anonymous | gmv |
| sort_dir | asc |
| sort_dir | desc |
SaveListResponse
{
"success": true,
"message": "string",
"list_name": "string",
"creators_saved": 0,
"email_list_saved": true
}
SaveListResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| success | boolean | true | none | none |
| message | string | true | none | none |
| list_name | string | true | none | none |
| creators_saved | integer | true | none | none |
| email_list_saved | boolean | true | none | none |
ScoreBreakdownItem
{
"metric_type": "string",
"weight": 0,
"contribution": 0,
"raw_value": 0
}
ScoreBreakdownItem
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| metric_type | string | true | none | gmv |
| weight | integer | true | none | This metric's weight (0-100). Weights across the campaign sum to 100. |
| contribution | number | true | none | Weighted points this metric added to the composite (0-weight). Zero for everyone until a leader emerges on the metric. |
| raw_value | number | true | none | The creator's raw metric value before normalization (e.g. GMV in the shop currency, view count). |
SegmentHandlesResponse
{
"handles": [
"string"
],
"total": 0,
"resolved": 0,
"unresolved": 0,
"capped": false,
"cap": 10000
}
SegmentHandlesResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| handles | [string] | false | none | none |
| total | integer | false | none | Creators matched by the segment. |
| resolved | integer | false | none | Of those, how many resolved to a handle. |
| unresolved | integer | false | none | Matched creators with no resolvable handle — they cannot go into a creator list. Surfaced so the UI states the real audience size instead of quietly shipping a shorter one. |
| capped | boolean | false | none | True when the segment hit the handle cap. |
| cap | integer | false | none | Max handles returned. |
SellerCenterChannel
{
"channel": "string",
"day_count": 0,
"gmv": 0,
"impressions": 0,
"units_sold": 0,
"customers": 0,
"units_per_impression": 0,
"baseline": {
"gmv": 0,
"impressions": 0,
"units_sold": 0,
"customers": 0
},
"industry_median": {
"as_of": "string",
"gmv": 0,
"impressions": 0,
"units_sold": 0,
"customers": 0
}
}
SellerCenterChannel
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| channel | string | true | none | shop_tab, search or other. |
| day_count | integer | true | none | none |
| gmv | number | true | none | none |
| impressions | integer | true | none | none |
| units_sold | integer | true | none | none |
| customers | integer | true | none | none |
| units_per_impression | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| baseline | ChannelBaseline | true | none | TikTok's previous-period values, summed across the window. |
| industry_median | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | ChannelIndustryMedian | false | none | The typical seller in this shop's industry, as of one day. |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
SellerCenterChannelsResponse
{
"shop_id": 0,
"currency_code": "string",
"start_date": "string",
"end_date": "string",
"data": [
{
"channel": "string",
"day_count": 0,
"gmv": 0,
"impressions": 0,
"units_sold": 0,
"customers": 0,
"units_per_impression": 0,
"baseline": {
"gmv": 0,
"impressions": 0,
"units_sold": 0,
"customers": 0
},
"industry_median": {
"as_of": "string",
"gmv": 0,
"impressions": 0,
"units_sold": 0,
"customers": 0
}
}
]
}
SellerCenterChannelsResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | integer | true | none | none |
| currency_code | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| start_date | string | true | none | none |
| end_date | string | true | none | none |
| data | [SellerCenterChannel] | true | none | none |
SellerCenterProduct
{
"product_id": "string",
"product_name": "string",
"product_status": 0,
"cover_image_url": "string",
"days_with_data": 0,
"sales": {
"gmv": 0,
"orders": 0,
"sku_orders": 0,
"items_sold": 0,
"customers": 0,
"aov": 0,
"refunds": 0,
"items_canceled_and_returned": 0
},
"funnel": {
"impressions": 0,
"unique_viewers": 0,
"clicks": 0,
"unique_clickers": 0,
"ctr": 0,
"add_to_cart": 0,
"add_to_cart_rate": 0,
"orders": 0,
"click_to_order_rate": 0
},
"channels": {
"seller": {
"video_gmv": 0,
"live_gmv": 0
},
"affiliate": {
"gmv": 0,
"video_gmv": 0,
"live_gmv": 0
},
"product_card": {
"gmv": 0
},
"shop_tab": {
"gmv": 0,
"listing_impressions": 0,
"page_views": 0,
"unique_visitors": 0,
"customers": 0,
"items_sold": 0,
"ctr": 0
}
}
}
SellerCenterProduct
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_id | string | true | none | none |
| product_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_status | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| cover_image_url | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| days_with_data | integer | true | none | Days in the window that had a Seller Center row for this product. |
| sales | ProductSales | true | none | none |
| funnel | ProductFunnel | true | none | Impression → click → cart → order, SUMmed over the window. |
| channels | ProductChannels | true | none | GMV attribution by the channel the sale came through. |
SellerCenterProductsRequest
{
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"product_id": "string",
"sort_by": "gmv",
"sort_dir": "asc",
"page": 1,
"page_size": 50
}
SellerCenterProductsRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| start_date | any | false | none | First day of the window (inclusive). Defaults to 30 days back. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_date | any | false | none | Last day of the window (inclusive). Defaults to yesterday. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_id | any | false | none | Restrict to a single product. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sort_by | string | false | none | Sort column. One of: ['gmv', 'orders', 'items_sold', 'customers', 'impressions', 'clicks', 'add_to_cart', 'affiliate_gmv', 'shop_tab_gmv', 'refunds']. |
| sort_dir | string | false | none | Sort direction. |
| page | integer | false | none | 1-based page number. |
| page_size | integer | false | none | Products per page (max 200). |
Enumerated Values
| Property | Value |
|---|---|
| sort_dir | asc |
| sort_dir | desc |
SellerCenterProductsResponse
{
"shop_id": 0,
"currency_code": "string",
"start_date": "string",
"end_date": "string",
"data": [
{
"product_id": "string",
"product_name": "string",
"product_status": 0,
"cover_image_url": "string",
"days_with_data": 0,
"sales": {
"gmv": 0,
"orders": 0,
"sku_orders": 0,
"items_sold": 0,
"customers": 0,
"aov": 0,
"refunds": 0,
"items_canceled_and_returned": 0
},
"funnel": {
"impressions": 0,
"unique_viewers": 0,
"clicks": 0,
"unique_clickers": 0,
"ctr": 0,
"add_to_cart": 0,
"add_to_cart_rate": 0,
"orders": 0,
"click_to_order_rate": 0
},
"channels": {
"seller": {
"video_gmv": 0,
"live_gmv": 0
},
"affiliate": {
"gmv": 0,
"video_gmv": 0,
"live_gmv": 0
},
"product_card": {
"gmv": 0
},
"shop_tab": {
"gmv": 0,
"listing_impressions": 0,
"page_views": 0,
"unique_visitors": 0,
"customers": 0,
"items_sold": 0,
"ctr": 0
}
}
}
],
"pagination": {
"total_count": 0,
"page": 0,
"page_size": 0,
"total_pages": 0
}
}
SellerCenterProductsResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | integer | true | none | none |
| currency_code | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| start_date | string | true | none | none |
| end_date | string | true | none | none |
| data | [SellerCenterProduct] | true | none | none |
| pagination | public_api__core__pagination__PaginationMeta | true | none | Pagination metadata returned in responses. |
SellerCenterShopOverviewResponse
{
"shop_id": 0,
"currency_code": "string",
"start_date": "string",
"end_date": "string",
"day_count": 0,
"gmv": 0,
"orders": 0,
"items_sold": 0,
"customers": 0,
"aov": 0,
"channels": {
"video": {
"gmv": 0,
"affiliate": 0,
"seller": 0
},
"live": {
"gmv": 0,
"affiliate": 0,
"seller": 0
},
"product_card": {
"gmv": 0,
"shop_tab": 0,
"search": 0,
"orders": 0,
"customers": 0
}
},
"traffic": {
"product_impressions": 0,
"product_clicks": 0,
"product_ctr": 0,
"shop_tab_listing_impressions": 0
},
"comparison": {
"gmv": 0,
"orders": 0,
"items_sold": 0,
"customers": 0,
"gmv_change_pct": 0
}
}
SellerCenterShopOverviewResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | integer | true | none | none |
| currency_code | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| start_date | string | true | none | none |
| end_date | string | true | none | none |
| day_count | integer | true | none | none |
| gmv | number | true | none | none |
| orders | integer | true | none | none |
| items_sold | integer | true | none | none |
| customers | integer | true | none | none |
| aov | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| channels | ShopOverviewChannels | true | none | none |
| traffic | ShopOverviewTraffic | true | none | none |
| comparison | ShopOverviewComparison | true | none | TikTok's own comparison-period totals, summed across the window. |
SellerCenterWindowRequest
{
"start_date": "2019-08-24",
"end_date": "2019-08-24"
}
SellerCenterWindowRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| start_date | any | false | none | First day of the window (inclusive). Defaults to 30 days back. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_date | any | false | none | Last day of the window (inclusive). Defaults to yesterday. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
SendDraftDryRunResponse
{
"dry_run": true,
"would_send_draft_id": 0,
"conversation_id": 0,
"content_type": "string",
"text": "string",
"image_url": "string",
"product_id": "string"
}
SendDraftDryRunResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| dry_run | boolean | false | none | none |
| would_send_draft_id | integer | true | none | none |
| conversation_id | integer | true | none | none |
| content_type | string | true | none | none |
| text | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| image_url | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
SendDraftResponse
{
"draft_id": 0,
"conversation_id": 0,
"message_id": 0,
"message_index": 0,
"content_type": "string",
"text": "string",
"image_url": "string",
"product_id": "string",
"sent_at": "string",
"dry_run": false
}
SendDraftResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| draft_id | integer | true | none | none |
| conversation_id | integer | true | none | none |
| message_id | integer | true | none | none |
| message_index | integer | true | none | none |
| content_type | string | true | none | 'text' |
| text | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| image_url | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sent_at | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| dry_run | boolean | false | none | none |
SenderIdentity
{
"type": "brand",
"user_id": "string",
"display_name": "string",
"avatar_url": "string"
}
SenderIdentity
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| type | string | false | none | none |
| user_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| display_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| avatar_url | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| type | brand |
| type | member |
SentDmGroup
{
"creator_name": "string",
"creator_id": "string",
"last_sent_at": "string",
"messages": [
{
"content": "string",
"sent_at": "string",
"status": "string"
}
]
}
SentDmGroup
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| last_sent_at | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| messages | [SentDmMessage] | false | none | none |
SentDmMessage
{
"content": "string",
"sent_at": "string",
"status": "string"
}
SentDmMessage
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| content | string | true | none | Exact rendered text as sent (placeholders substituted) |
| sent_at | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| status | any | false | none | Send-log role, e.g. BOT_INITIAL_MESSAGE / follow-up statuses |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
SentDmSection
{
"exact_copy": true,
"groups": [
{
"creator_name": "string",
"creator_id": "string",
"last_sent_at": "string",
"messages": [
{
"content": "string",
"sent_at": "string",
"status": "string"
}
]
}
],
"creators_returned": 0,
"total_creators": 0,
"total_messages": 0,
"message": "string"
}
SentDmSection
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| exact_copy | boolean | false | none | True — DM copy is the rendered per-creator sent text |
| groups | [SentDmGroup] | false | none | none |
| creators_returned | integer | true | none | none |
| total_creators | integer | true | none | none |
| total_messages | integer | true | none | none |
| message | any | false | none | Explicit empty state when nothing was sent |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
SentTcSection
{
"exact_copy": false,
"coverage_note": "string",
"template_text": "string",
"placeholders_present": false,
"invitations": [
{
"sent_at": "string",
"status": "string",
"creator_count": 0,
"creators": [
"string"
],
"creators_truncated": false,
"expiration_date": "string"
}
],
"invitations_returned": 0,
"total_invitations": 0,
"total_creators_invited": 0,
"status_breakdown": {
"property1": 0,
"property2": 0
},
"campaign": {
"campaign_id": 0,
"campaign_name": "string"
},
"message": "string"
}
SentTcSection
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| exact_copy | boolean | false | none | False — TC per-creator rendered copy is not stored; template is the sent copy |
| coverage_note | string | true | none | none |
| template_text | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| placeholders_present | boolean | false | none | none |
| invitations | [TcInvitationBatch] | false | none | none |
| invitations_returned | integer | true | none | none |
| total_invitations | integer | true | none | Batches with a sent status (NEW_INVITATION / EDITED_INVITATION); excludes skipped/failed. |
| total_creators_invited | integer | true | none | Creators across sent-status batches only. See status_breakdown for skipped/failed. |
| status_breakdown | object | false | none | Batch count per target_collabs status across ALL rows (sent, skipped=PREVIOUS_INVITATION, INVALID_CREATORS, etc.). |
| » additionalProperties | integer | false | none | none |
| campaign | any | false | none | Campaign linked via campaigns.tc_automation_id, when one exists |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | TcCampaignLink | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| message | any | false | none | Explicit empty state when nothing was sent |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
SeriesRequest
{
"preset": "string",
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"granularity": "day"
}
SeriesRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| preset | any | false | none | Relative window ending at the shop's newest settled day: <n>d (1-999), <n>m (1-99) or all, always capped at 365 days. Mutually exclusive with explicit dates; defaults to 30d when neither is given. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| start_date | any | false | none | Inclusive window start (YYYY-MM-DD). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_date | any | false | none | Inclusive window end (YYYY-MM-DD). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| granularity | string | false | none | day returns one point per day; week sums Sunday-start weeks. |
Enumerated Values
| Property | Value |
|---|---|
| granularity | day |
| granularity | week |
SettlePaymentRequest
{
"creator_id": 0,
"campaign_id": 0,
"amount": 100000,
"currency": "str",
"reward_type": "string",
"campaign_creator_mapping_id": 0,
"metadata": {}
}
SettlePaymentRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_id | integer | true | none | none |
| campaign_id | integer | true | none | none |
| amount | number | true | none | Settlement amount in the campaign's currency. Capped at $100,000 per call as a sanity guard. |
| currency | string | true | none | ISO 4217 currency code (e.g. 'USD'). Informational — the shop's persisted wallet currency takes precedence at settlement time. If the wallet currency differs from this value, the transfer executes in the wallet currency without rejection. The response's currency field confirms the currency actually used for the transfer. |
| reward_type | string | true | none | 'cash' triggers a Stripe transfer + wallet debit; 'custom' records the settlement only (no money moves). |
| campaign_creator_mapping_id | integer | true | none | REQUIRED. The campaign-creator mapping id that the settlement is being recorded against. The portal surfaces this id on every creator row in GET /campaigns/{id}/detail and in the response to the accept endpoint, so callers always have it. Required because the underlying PaymentService.settle only runs its double-payment guard (claim_for_settlement_sync) when a mapping id is present — omitting it would leave the money-moving path with idempotency-only protection (a different Idempotency-Key per call could debit the wallet repeatedly with no DB-level guard). |
| metadata | any | false | none | Free-form metadata stored alongside the settlement (e.g. agent annotation, internal reference). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | object | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
SettlementResponse
{
"success": true,
"transfer_id": "string",
"amount": 0,
"currency": "string",
"paid_at": "string",
"wallet_balance": 0
}
SettlementResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| success | boolean | true | none | none |
| transfer_id | any | false | none | Stripe transfer id for cash settlements. Null for custom-reward settlements (no Stripe call). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| amount | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| currency | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| paid_at | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| wallet_balance | any | false | none | Remaining wallet balance after the settlement. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
ShareReportConfig
{
"v": 1,
"metrics": [
"string"
],
"modules": {
"property1": true,
"property2": true
}
}
ShareReportConfig
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| v | integer | false | none | Config schema version |
| metrics | any | false | none | Metric keys to show, in display order |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| modules | any | false | none | Per-module visibility, keyed by SHARE_MODULE_KEYS |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | object | false | none | none |
| »» additionalProperties | boolean | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
SharedDashboardCreateBody
{
"password": "string",
"locked_start_date": "2019-08-24",
"locked_end_date": "2019-08-24",
"report_config": {
"v": 1,
"metrics": [
"string"
],
"modules": {
"property1": true,
"property2": true
}
}
}
SharedDashboardCreateBody
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| password | string | true | none | Password the viewer must enter. At least 8 characters with an uppercase letter, a lowercase letter and a digit — or 12+ characters as a passphrase. |
| locked_start_date | any | false | none | Start of a fixed reporting window (with locked_end_date). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| locked_end_date | any | false | none | End of a fixed reporting window (with locked_start_date). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| report_config | any | false | none | Which metric cards and modules the viewer sees. Omit for the legacy fixed layout. Outreach-volume metrics are rejected — a share link may not disclose automation scale. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | ShareReportConfig | false | none | Which metric cards and modules a share link shows an external viewer. An omitted/empty config is meaningful: it marks a legacy link, which renders the original fixed six-card layout. That is why metrics and modulesdefault to None rather than to empty collections — "no opinion" and "the owner turned everything off" must stay distinguishable. |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
SharedDashboardDeleteResponse
{
"success": true,
"uuid": "string",
"message": "string"
}
SharedDashboardDeleteResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| success | boolean | true | none | none |
| uuid | string | true | none | none |
| message | string | true | none | none |
SharedDashboardListResponse
{
"data": [
{
"uuid": "string",
"share_url": "string",
"status": "string",
"created_at": "string",
"locked_start_date": "2019-08-24",
"locked_end_date": "2019-08-24",
"report_config": {
"v": 1,
"metrics": [
"string"
],
"modules": {
"property1": true,
"property2": true
}
},
"shop_id": 0
}
]
}
SharedDashboardListResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | [MySharedDashboard] | true | none | One entry per shop that has a share link. May be empty. |
SharedDashboardUpdateBody
{
"password": "string",
"status": "string",
"locked_start_date": "2019-08-24",
"locked_end_date": "2019-08-24",
"clear_lock": false,
"report_config": {
"v": 1,
"metrics": [
"string"
],
"modules": {
"property1": true,
"property2": true
}
}
}
SharedDashboardUpdateBody
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| password | any | false | none | Rotate the viewer password. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| status | any | false | none | active or inactive. Use DELETE to archive. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| locked_start_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| locked_end_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| clear_lock | boolean | false | none | Remove the locked window entirely. Cannot be combined with a locked date range — omitted dates mean 'leave it alone', so this flag is how you say 'unlock'. |
| report_config | any | false | none | Replaces the visible metrics/modules. Omit to keep the current selection — a password-only change never wipes it. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | ShareReportConfig | false | none | Which metric cards and modules a share link shows an external viewer. An omitted/empty config is meaningful: it marks a legacy link, which renders the original fixed six-card layout. That is why metrics and modulesdefault to None rather than to empty collections — "no opinion" and "the owner turned everything off" must stay distinguishable. |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
ShopChannelSplitPoint
{
"date": "string",
"date_end": "string",
"days_expected": 0,
"days_observed": 0,
"is_complete": true,
"currency_code": "string",
"gmv": 0,
"refunds": 0,
"other_gmv": 0,
"orders": 0,
"items_sold": 0,
"product_impressions": 0,
"product_clicks": 0,
"add_cart_count": 0,
"product_count": 0,
"affiliate_gmv": 0,
"affiliate_orders": 0,
"affiliate_clicks": 0,
"affiliate_impressions": 0,
"affiliate_video_gmv": 0,
"affiliate_video_clicks": 0,
"affiliate_video_impressions": 0,
"affiliate_live_gmv": 0,
"affiliate_live_clicks": 0,
"affiliate_live_impressions": 0,
"seller_video_gmv": 0,
"seller_video_orders": 0,
"seller_video_clicks": 0,
"seller_video_impressions": 0,
"seller_live_gmv": 0,
"seller_live_orders": 0,
"seller_live_clicks": 0,
"seller_live_impressions": 0,
"product_card_gmv": 0,
"product_card_orders": 0,
"product_card_clicks": 0,
"product_card_impressions": 0,
"shop_tab_gmv": 0,
"shop_tab_sold_items": 0,
"shop_tab_clicks": 0,
"shop_tab_impressions": 0,
"pages_fetched": 0,
"is_walk_complete": true
}
ShopChannelSplitPoint
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| date | string | true | none | Bucket start (YYYY-MM-DD). |
| date_end | string | true | none | Bucket end, inclusive (YYYY-MM-DD). |
| days_expected | integer | true | none | Days of this bucket inside the window and on or before the settled day. |
| days_observed | integer | true | none | Days with a stored row. |
| is_complete | boolean | true | none | True only when the whole bucket is settled, every expected day has a row, and no core metric is missing on any of them. |
| currency_code | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| gmv | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| refunds | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| other_gmv | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| orders | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| items_sold | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_impressions | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_clicks | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| add_cart_count | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_count | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| affiliate_gmv | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| affiliate_orders | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| affiliate_clicks | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| affiliate_impressions | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| affiliate_video_gmv | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| affiliate_video_clicks | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| affiliate_video_impressions | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| affiliate_live_gmv | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| affiliate_live_clicks | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| affiliate_live_impressions | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| seller_video_gmv | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| seller_video_orders | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| seller_video_clicks | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| seller_video_impressions | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| seller_live_gmv | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| seller_live_orders | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| seller_live_clicks | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| seller_live_impressions | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_card_gmv | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_card_orders | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_card_clicks | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_card_impressions | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_tab_gmv | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_tab_sold_items | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_tab_clicks | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_tab_impressions | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| pages_fetched | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| is_walk_complete | any | false | none | Whether the collector's product walk covered every page. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | boolean | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
ShopChannelSplitSeriesResponse
{
"shop_id": 0,
"currency_code": "string",
"start_date": "string",
"end_date": "string",
"granularity": "day",
"week_start": "sunday",
"latest_available_date": "string",
"earliest_available_date": "string",
"is_complete": true,
"points": [
{
"date": "string",
"date_end": "string",
"days_expected": 0,
"days_observed": 0,
"is_complete": true,
"currency_code": "string",
"gmv": 0,
"refunds": 0,
"other_gmv": 0,
"orders": 0,
"items_sold": 0,
"product_impressions": 0,
"product_clicks": 0,
"add_cart_count": 0,
"product_count": 0,
"affiliate_gmv": 0,
"affiliate_orders": 0,
"affiliate_clicks": 0,
"affiliate_impressions": 0,
"affiliate_video_gmv": 0,
"affiliate_video_clicks": 0,
"affiliate_video_impressions": 0,
"affiliate_live_gmv": 0,
"affiliate_live_clicks": 0,
"affiliate_live_impressions": 0,
"seller_video_gmv": 0,
"seller_video_orders": 0,
"seller_video_clicks": 0,
"seller_video_impressions": 0,
"seller_live_gmv": 0,
"seller_live_orders": 0,
"seller_live_clicks": 0,
"seller_live_impressions": 0,
"product_card_gmv": 0,
"product_card_orders": 0,
"product_card_clicks": 0,
"product_card_impressions": 0,
"shop_tab_gmv": 0,
"shop_tab_sold_items": 0,
"shop_tab_clicks": 0,
"shop_tab_impressions": 0,
"pages_fetched": 0,
"is_walk_complete": true
}
]
}
ShopChannelSplitSeriesResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | integer | true | none | none |
| currency_code | any | false | none | Null when the window mixes currencies; points carry their own. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| start_date | string | true | none | none |
| end_date | string | true | none | none |
| granularity | string | true | none | none |
| week_start | string | false | none | none |
| latest_available_date | any | false | none | Newest stored day for this shop, or null when nothing is stored. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| earliest_available_date | any | false | none | Oldest stored day for this shop, or null when nothing is stored. A prior-period comparison is only meaningful when the prior window starts on or after this day. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| is_complete | boolean | true | none | none |
| points | [ShopChannelSplitPoint] | true | none | none |
Enumerated Values
| Property | Value |
|---|---|
| granularity | day |
| granularity | week |
ShopConnectionHealthResponse
{
"shop_id": 0,
"shop_name": "string",
"status": "string",
"is_collecting": true,
"is_logged_in": true,
"is_banned": true,
"failure_reason": "string",
"onboarding_status": "string",
"region": "string",
"detected_region": "string",
"region_supported": true,
"last_login_time": "2019-08-24T14:15:22Z"
}
ShopConnectionHealthResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | integer | true | none | none |
| shop_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| status | any | false | none | The shop's plan tier (active, pro, inactive, ...). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| is_collecting | boolean | true | none | True when the shop is logged in and no failure is recorded — i.e. empty results from other endpoints mean 'no activity', not 'collection stopped'. |
| is_logged_in | boolean | true | none | Whether Reacher's TikTok session for this shop is live. |
| is_banned | boolean | true | none | True when TikTok has banned the shop's account. |
| failure_reason | any | false | none | Why the connection failed, or null when healthy. One of: banned, account_dead, shop_punished, permission_denied, affiliate_access_missing, login_issue. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| onboarding_status | any | false | none | Onboarding stage: onboard_pending, alias_created, added_to_affiliate_portal, onboard_complete, onboarding_failed. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| region | any | false | none | The shop's stored region. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| detected_region | any | false | none | Region inferred from the shop's activation link. May be a region Reacher does not operate in — that is the point of the field. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| region_supported | any | false | none | True when the shop's region is one Reacher operates in, false when it is not, null when there is no region signal yet. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | boolean | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| last_login_time | any | false | none | When Reacher last established a session for this shop. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date-time) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
ShopGmvChannels
{
"video": {
"gmv": 0,
"affiliate": 0,
"seller": 0
},
"live": {
"gmv": 0,
"affiliate": 0,
"seller": 0
},
"product_card": {
"gmv": 0,
"shop_tab": 0,
"search": 0
}
}
ShopGmvChannels
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video | ShopGmvVideoChannel | true | none | Video-attributed GMV breakdown for a single time point. |
| live | ShopGmvLiveChannel | true | none | Live-attributed GMV breakdown for a single time point. |
| product_card | ShopGmvProductCardChannel | true | none | Product-card (organic) GMV breakdown for a single time point. |
ShopGmvLiveChannel
{
"gmv": 0,
"affiliate": 0,
"seller": 0
}
ShopGmvLiveChannel
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| gmv | any | false | none | Total live-attributed GMV for the day. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| affiliate | any | false | none | Live GMV from creator/affiliate lives. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| seller | any | false | none | Live GMV from the seller's own lives. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
ShopGmvProductCardChannel
{
"gmv": 0,
"shop_tab": 0,
"search": 0
}
ShopGmvProductCardChannel
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| gmv | any | false | none | Total product-card GMV (organic surfaces). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_tab | any | false | none | GMV from customers browsing the shop tab/storefront. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| search | any | false | none | GMV from TikTok search results. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
ShopGmvSeriesPoint
{
"date": "string",
"gmv": 0,
"orders": 0,
"items_sold": 0,
"customers": 0,
"aov": 0,
"channels": {
"video": {
"gmv": 0,
"affiliate": 0,
"seller": 0
},
"live": {
"gmv": 0,
"affiliate": 0,
"seller": 0
},
"product_card": {
"gmv": 0,
"shop_tab": 0,
"search": 0
}
},
"traffic": {
"product_impressions": 0,
"product_clicks": 0
}
}
ShopGmvSeriesPoint
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| date | string | true | none | Day (YYYY-MM-DD). |
| gmv | any | false | none | Total GMV for the day (before tax, excl. platform co-funding). Sum of channels ≈ gmv (small residuals possible). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| orders | any | false | none | Paid orders that day. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| items_sold | any | false | none | Units sold that day. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| customers | any | false | none | Unique paying customers that day. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| aov | any | false | none | Average order value for the day. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| channels | ShopGmvChannels | true | none | GMV breakdown by attribution channel. |
| traffic | ShopGmvTraffic | true | none | none |
ShopGmvSummaryRequest
{
"start_date": "2019-08-24",
"end_date": "2019-08-24"
}
ShopGmvSummaryRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| start_date | any | false | none | Inclusive window start (YYYY-MM-DD). Defaults to 29 days before end_date. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_date | any | false | none | Inclusive window end (YYYY-MM-DD). Defaults to yesterday. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
ShopGmvSummaryResponse
{
"shop_id": 0,
"currency_code": "string",
"start_date": "string",
"end_date": "string",
"day_count": 0,
"gmv": 0,
"orders": 0,
"items_sold": 0,
"customers": 0,
"aov": 0,
"channels": {
"video": {
"gmv": 0,
"affiliate": 0,
"seller": 0
},
"live": {
"gmv": 0,
"affiliate": 0,
"seller": 0
},
"product_card": {
"gmv": 0,
"shop_tab": 0,
"search": 0
}
},
"traffic": {
"product_impressions": 0,
"product_clicks": 0
}
}
ShopGmvSummaryResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | integer | true | none | none |
| currency_code | any | false | none | ISO currency code; null when window has no data. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| start_date | string | true | none | none |
| end_date | string | true | none | none |
| day_count | integer | true | none | Number of daily rows that contributed to these totals. |
| gmv | number | true | none | SUM of daily GMV across the window. |
| orders | integer | true | none | SUM of daily orders. |
| items_sold | integer | true | none | SUM of daily units sold. |
| customers | integer | true | none | SUM of daily unique-customer counts. NOTE: this double-counts buyers who purchased on multiple days; the source rollup is unique-per-day. A true window-distinct count is not derivable from this table. |
| aov | any | false | none | Window-level AOV computed as total GMV / total orders over the window. null when there are no orders. Note: this is NOT the average of daily AOV values (which would be meaningless since daily AOVs have different denominators). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| channels | ShopGmvChannels | true | none | SUMmed channel breakdown across the window. |
| traffic | ShopGmvTraffic | true | none | none |
ShopGmvTimeseriesRequest
{
"start_date": "2019-08-24",
"end_date": "2019-08-24"
}
ShopGmvTimeseriesRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| start_date | any | false | none | Inclusive window start (YYYY-MM-DD). Defaults to 29 days before end_date (30-day window). The Seller Center data is back-filled ~90 days per shop, so older ranges will return an empty series. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_date | any | false | none | Inclusive window end (YYYY-MM-DD). Defaults to yesterday (today is excluded because the daily row is still incomplete). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
ShopGmvTimeseriesResponse
{
"shop_id": 0,
"currency_code": "string",
"granularity": "daily",
"start_date": "string",
"end_date": "string",
"series": [
{
"date": "string",
"gmv": 0,
"orders": 0,
"items_sold": 0,
"customers": 0,
"aov": 0,
"channels": {
"video": {
"gmv": 0,
"affiliate": 0,
"seller": 0
},
"live": {
"gmv": 0,
"affiliate": 0,
"seller": 0
},
"product_card": {
"gmv": 0,
"shop_tab": 0,
"search": 0
}
},
"traffic": {
"product_impressions": 0,
"product_clicks": 0
}
}
]
}
ShopGmvTimeseriesResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | integer | true | none | none |
| currency_code | any | false | none | ISO currency code applying to every point in the series (e.g. 'GBP', 'USD'). null when the series is empty or (defensively) when the source rows somehow mix currencies for the same shop — in that case GMV values should not be summed in the client. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| granularity | string | false | none | Always 'daily' in v1. |
| start_date | string | true | none | none |
| end_date | string | true | none | none |
| series | [ShopGmvSeriesPoint] | true | none | One entry per day with data in the window. Empty when the shop has no Seller Center data for this range (collection is rolling out — empty is a normal, non-error state). |
ShopGmvTraffic
{
"product_impressions": 0,
"product_clicks": 0
}
ShopGmvTraffic
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_impressions | any | false | none | Product impressions across surfaces. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_clicks | any | false | none | Product clicks across surfaces. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
ShopGmvVideoChannel
{
"gmv": 0,
"affiliate": 0,
"seller": 0
}
ShopGmvVideoChannel
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| gmv | any | false | none | Total video-attributed GMV for the day. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| affiliate | any | false | none | Video GMV from creator/affiliate videos. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| seller | any | false | none | Video GMV from the seller's own videos. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
ShopHealthDimension
{
"name": "string",
"score": 0,
"status": "string",
"status_text": "string",
"weight": 0
}
ShopHealthDimension
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| name | any | false | none | Dimension name. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| score | any | false | none | Dimension score, 0-5. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| status | any | false | none | EXCELLENT / GOOD / POOR / CRITICAL / NIL. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| status_text | any | false | none | Localized status label (e.g. 'Excellent'). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| weight | any | false | none | Percentage weight of this dimension in the overall SPS. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
ShopHealthLatestRequest
{}
ShopHealthLatestRequest
Properties
None
ShopHealthLatestResponse
{
"shop_id": 0,
"snapshot": {
"date": "string",
"sps_score": 0,
"sps_tier": "string",
"peer_percentile": 0,
"dimensions": [
{
"name": "string",
"score": 0,
"status": "string",
"status_text": "string",
"weight": 0
}
]
}
}
ShopHealthLatestResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | integer | true | none | none |
| snapshot | any | false | none | Most recent SPS snapshot, or null if the shop has no SPS data yet. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | ShopHealthPoint | false | none | A single daily Shop Performance Score snapshot. |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
ShopHealthMetricPoint
{
"date": "string",
"metric_code": "NRR",
"metric_name": "string",
"dimension": "string",
"score": 0,
"value": 0,
"value_unit": "string",
"status": "EXCELLENT",
"status_text": "string",
"excellent_threshold": 0,
"poor_threshold": 0,
"evaluation_window_start": "string",
"evaluation_window_end": "string",
"is_top_reason": false,
"top_reason_text": "string",
"problems_upstream_total": 0,
"problems_stored": 0,
"problems_complete": true,
"problems_truncated": true
}
ShopHealthMetricPoint
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| date | string | true | none | Snapshot day (YYYY-MM-DD). |
| metric_code | string | true | none | none |
| metric_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| dimension | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| score | any | false | none | 0-5; null for NIL. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| value | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| value_unit | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| status | string | true | none | none |
| status_text | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| excellent_threshold | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| poor_threshold | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| evaluation_window_start | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| evaluation_window_end | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| is_top_reason | boolean | false | none | none |
| top_reason_text | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| problems_upstream_total | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| problems_stored | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| problems_complete | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | boolean | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| problems_truncated | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | boolean | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| metric_code | NRR |
| metric_code | NBFR |
| metric_code | SFCR |
| metric_code | OTDR |
| metric_code | AHT |
| metric_code | IM_DSAT |
| status | EXCELLENT |
| status | GOOD |
| status | POOR |
| status | CRITICAL |
| status | NIL |
ShopHealthMetricsResponse
{
"shop_id": 0,
"start_date": "string",
"end_date": "string",
"latest_snapshot_date": "string",
"snapshot_count": 0,
"points": [
{
"date": "string",
"metric_code": "NRR",
"metric_name": "string",
"dimension": "string",
"score": 0,
"value": 0,
"value_unit": "string",
"status": "EXCELLENT",
"status_text": "string",
"excellent_threshold": 0,
"poor_threshold": 0,
"evaluation_window_start": "string",
"evaluation_window_end": "string",
"is_top_reason": false,
"top_reason_text": "string",
"problems_upstream_total": 0,
"problems_stored": 0,
"problems_complete": true,
"problems_truncated": true
}
]
}
ShopHealthMetricsResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | integer | true | none | none |
| start_date | string | true | none | none |
| end_date | string | true | none | none |
| latest_snapshot_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| snapshot_count | integer | true | none | Distinct snapshot days in the window. |
| points | [ShopHealthMetricPoint] | true | none | none |
ShopHealthPoint
{
"date": "string",
"sps_score": 0,
"sps_tier": "string",
"peer_percentile": 0,
"dimensions": [
{
"name": "string",
"score": 0,
"status": "string",
"status_text": "string",
"weight": 0
}
]
}
ShopHealthPoint
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| date | any | false | none | Snapshot day (YYYY-MM-DD). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sps_score | any | false | none | Overall Shop Performance Score, 0-5. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sps_tier | any | false | none | EXCELLENT / GOOD / POOR / CRITICAL / NIL. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| peer_percentile | any | false | none | Percentile ranking among peer shops. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| dimensions | [ShopHealthDimension] | false | none | Per-sub-metric breakdown of the score. |
ShopHealthProblemItem
{
"item_key": "string",
"order_id": "string",
"return_order_id": "string",
"chat_record_id": "string",
"product_id": "string",
"sku_id": "string",
"product_name": "string",
"reason": "string",
"rating": 0,
"review_count": 0,
"event_time": "string",
"deliver_time": "string",
"expect_deliver_time": "string",
"actual_deliver_time": "string",
"duration_hours": 0,
"page": 0
}
ShopHealthProblemItem
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| item_key | string | true | none | none |
| order_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| return_order_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| chat_record_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sku_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| reason | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| rating | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| review_count | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| event_time | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| deliver_time | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| expect_deliver_time | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| actual_deliver_time | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| duration_hours | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| page | integer | true | none | none |
ShopHealthProblemsResponse
{
"shop_id": 0,
"metric_code": "NRR",
"snapshot_date": "string",
"pagination": {
"page": 0,
"page_size": 0,
"stored_total": 0
},
"upstream_total": 0,
"upstream_truncated": true,
"version": 0,
"items": [
{
"item_key": "string",
"order_id": "string",
"return_order_id": "string",
"chat_record_id": "string",
"product_id": "string",
"sku_id": "string",
"product_name": "string",
"reason": "string",
"rating": 0,
"review_count": 0,
"event_time": "string",
"deliver_time": "string",
"expect_deliver_time": "string",
"actual_deliver_time": "string",
"duration_hours": 0,
"page": 0
}
]
}
ShopHealthProblemsResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | integer | true | none | none |
| metric_code | string | true | none | none |
| snapshot_date | any | false | none | Resolved snapshot day; null when none is stored. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| pagination | public_api__models__sc_official__Pagination | true | none | none |
| upstream_total | any | false | none | TikTok's own count of problem items for this metric. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| upstream_truncated | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | boolean | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| version | any | false | none | Collector run the items come from; pass back as version for later pages. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| items | [ShopHealthProblemItem] | true | none | none |
Enumerated Values
| Property | Value |
|---|---|
| metric_code | NRR |
| metric_code | NBFR |
| metric_code | SFCR |
| metric_code | OTDR |
| metric_code | AHT |
| metric_code | IM_DSAT |
ShopHealthTimeseriesRequest
{
"start_date": "2019-08-24",
"end_date": "2019-08-24"
}
ShopHealthTimeseriesRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| start_date | any | false | none | Inclusive window start (YYYY-MM-DD). Defaults to 29 days before end_date (30-day window). Max window 90 days. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_date | any | false | none | Inclusive window end (YYYY-MM-DD). Defaults to yesterday (today's snapshot is not recorded until the daily pull runs). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
ShopHealthTimeseriesResponse
{
"shop_id": 0,
"start_date": "string",
"end_date": "string",
"series": [
{
"date": "string",
"sps_score": 0,
"sps_tier": "string",
"peer_percentile": 0,
"dimensions": [
{
"name": "string",
"score": 0,
"status": "string",
"status_text": "string",
"weight": 0
}
]
}
]
}
ShopHealthTimeseriesResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | integer | true | none | none |
| start_date | string | true | none | none |
| end_date | string | true | none | none |
| series | [ShopHealthPoint] | true | none | One entry per day with a recorded snapshot. Empty when the shop has no SPS history for this range (only official-API shops are covered, and history builds from the first daily pull — empty is a normal, non-error state). |
ShopOverviewChannels
{
"video": {
"gmv": 0,
"affiliate": 0,
"seller": 0
},
"live": {
"gmv": 0,
"affiliate": 0,
"seller": 0
},
"product_card": {
"gmv": 0,
"shop_tab": 0,
"search": 0,
"orders": 0,
"customers": 0
}
}
ShopOverviewChannels
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video | ChannelGmvSplit | true | none | none |
| live | ChannelGmvSplit | true | none | none |
| product_card | ProductCardGmvSplit | true | none | none |
ShopOverviewComparison
{
"gmv": 0,
"orders": 0,
"items_sold": 0,
"customers": 0,
"gmv_change_pct": 0
}
ShopOverviewComparison
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| gmv | number | true | none | none |
| orders | integer | true | none | none |
| items_sold | integer | true | none | none |
| customers | integer | true | none | none |
| gmv_change_pct | any | false | none | (gmv - comparison.gmv) / comparison.gmv, as a percentage. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
ShopOverviewTraffic
{
"product_impressions": 0,
"product_clicks": 0,
"product_ctr": 0,
"shop_tab_listing_impressions": 0
}
ShopOverviewTraffic
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_impressions | integer | true | none | none |
| product_clicks | integer | true | none | none |
| product_ctr | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_tab_listing_impressions | integer | true | none | none |
ShopPerformancePoint
{
"date": "string",
"date_end": "string",
"days_expected": 0,
"days_observed": 0,
"is_complete": true,
"currency_code": "string",
"gmv": 0,
"video_attributed_gmv": 0,
"live_attributed_gmv": 0,
"product_card_gmv": 0,
"gross_revenue": 0,
"refunds": 0,
"orders": 0,
"sku_orders": 0,
"items_sold": 0,
"customers": 0,
"page_views": 0,
"visitors": 0,
"conversion_rate": 0
}
ShopPerformancePoint
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| date | string | true | none | Bucket start (YYYY-MM-DD). |
| date_end | string | true | none | Bucket end, inclusive (YYYY-MM-DD). |
| days_expected | integer | true | none | Days of this bucket inside the window and on or before the settled day. |
| days_observed | integer | true | none | Days with a stored row. |
| is_complete | boolean | true | none | True only when the whole bucket is settled, every expected day has a row, and no core metric is missing on any of them. |
| currency_code | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| gmv | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video_attributed_gmv | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| live_attributed_gmv | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_card_gmv | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| gross_revenue | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| refunds | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| orders | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sku_orders | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| items_sold | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| customers | any | false | none | Buyers per day as TikTok reports them; weekly buckets sum the days, so a repeat buyer counts each day. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| page_views | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| visitors | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| conversion_rate | any | false | none | Ratio, e.g. 0.0389. Weekly = orders / visitors. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
ShopPerformanceSeriesResponse
{
"shop_id": 0,
"currency_code": "string",
"start_date": "string",
"end_date": "string",
"granularity": "day",
"week_start": "sunday",
"latest_available_date": "string",
"earliest_available_date": "string",
"is_complete": true,
"points": [
{
"date": "string",
"date_end": "string",
"days_expected": 0,
"days_observed": 0,
"is_complete": true,
"currency_code": "string",
"gmv": 0,
"video_attributed_gmv": 0,
"live_attributed_gmv": 0,
"product_card_gmv": 0,
"gross_revenue": 0,
"refunds": 0,
"orders": 0,
"sku_orders": 0,
"items_sold": 0,
"customers": 0,
"page_views": 0,
"visitors": 0,
"conversion_rate": 0
}
]
}
ShopPerformanceSeriesResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | integer | true | none | none |
| currency_code | any | false | none | Null when the window mixes currencies; points carry their own. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| start_date | string | true | none | none |
| end_date | string | true | none | none |
| granularity | string | true | none | none |
| week_start | string | false | none | none |
| latest_available_date | any | false | none | Newest stored day for this shop, or null when nothing is stored. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| earliest_available_date | any | false | none | Oldest stored day for this shop, or null when nothing is stored. A prior-period comparison is only meaningful when the prior window starts on or after this day. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| is_complete | boolean | true | none | none |
| points | [ShopPerformancePoint] | true | none | none |
Enumerated Values
| Property | Value |
|---|---|
| granularity | day |
| granularity | week |
ShopProductChannelRow
{
"product_id": "string",
"product_name": "string",
"image_url": "string",
"days_observed": 0,
"listing_status": "live",
"price_min": 0,
"price_max": 0,
"price_currency": "string",
"currency_code": "string",
"gmv": 0,
"refunds": 0,
"orders": 0,
"items_sold": 0,
"product_impressions": 0,
"product_clicks": 0,
"add_cart_count": 0,
"affiliate_gmv": 0,
"affiliate_orders": 0,
"seller_video_gmv": 0,
"seller_video_orders": 0,
"seller_live_gmv": 0,
"seller_live_orders": 0,
"product_card_gmv": 0,
"product_card_orders": 0,
"shop_tab_gmv": 0,
"other_gmv": 0
}
ShopProductChannelRow
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_id | string | true | none | none |
| product_name | any | false | none | Null when the product catalogue has no name for it. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| image_url | any | false | none | First cover image from the product catalogue, if any. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| days_observed | integer | true | none | Days in the window on which TikTok listed the product. |
| listing_status | any | false | none | From the product catalogue: live, out_of_stock, seller_deactivated, platform_deactivated or rejected; null when the catalogue does not know the product or its status code, or when listing_data_available is false. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| price_min | any | false | none | Lowest listed SKU price, in price_currency. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| price_max | any | false | none | Highest listed SKU price. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| price_currency | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| currency_code | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| gmv | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| refunds | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| orders | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| items_sold | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_impressions | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_clicks | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| add_cart_count | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| affiliate_gmv | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| affiliate_orders | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| seller_video_gmv | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| seller_video_orders | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| seller_live_gmv | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| seller_live_orders | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_card_gmv | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_card_orders | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_tab_gmv | any | false | none | Overlaps the four channels; not part of the sum. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| other_gmv | any | false | none | gmv minus the four exclusive channels. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | live |
| anonymous | out_of_stock |
| anonymous | seller_deactivated |
| anonymous | platform_deactivated |
| anonymous | rejected |
ShopProductsByChannelResponse
{
"shop_id": 0,
"currency_code": "string",
"start_date": "string",
"end_date": "string",
"latest_available_date": "string",
"earliest_available_date": "string",
"sort": "gmv",
"page": 1,
"product_total": 0,
"listing_data_available": true,
"products": [
{
"product_id": "string",
"product_name": "string",
"image_url": "string",
"days_observed": 0,
"listing_status": "live",
"price_min": 0,
"price_max": 0,
"price_currency": "string",
"currency_code": "string",
"gmv": 0,
"refunds": 0,
"orders": 0,
"items_sold": 0,
"product_impressions": 0,
"product_clicks": 0,
"add_cart_count": 0,
"affiliate_gmv": 0,
"affiliate_orders": 0,
"seller_video_gmv": 0,
"seller_video_orders": 0,
"seller_live_gmv": 0,
"seller_live_orders": 0,
"product_card_gmv": 0,
"product_card_orders": 0,
"shop_tab_gmv": 0,
"other_gmv": 0
}
]
}
ShopProductsByChannelResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | integer | true | none | none |
| currency_code | any | false | none | Null when the products mix currencies. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| start_date | string | true | none | none |
| end_date | string | true | none | none |
| latest_available_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| earliest_available_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sort | string | true | none | none |
| page | integer | false | none | The page these products are on; limit per page. |
| product_total | integer | true | none | Distinct products TikTok listed in the window, across all pages. |
| listing_data_available | boolean | false | none | False when the product catalogue could not be read for this response: nothing was excluded and every listing_status and price is null. |
| products | [ShopProductChannelRow] | true | none | [One product summed over the window, from TikTok's daily product list, with its GMV and orders by channel.] |
Enumerated Values
| Property | Value |
|---|---|
| sort | gmv |
| sort | orders |
| sort | product_clicks |
| sort | add_cart_count |
ShopResponse
{
"shop_id": 0,
"shop_name": "string",
"region": "string",
"affiliate_market_region": "string",
"business_region": "string",
"currency": "string",
"status": "string",
"customer_id": 0,
"primary_category": "string"
}
ShopResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | integer | true | none | none |
| shop_name | string | true | none | none |
| region | string | true | none | none |
| affiliate_market_region | any | false | none | Marketplace a cross-border (region GLOBAL) shop sells in, as a TikTok region code (e.g. GB, DE, IT). Null for region-scoped shops, whose region is the marketplace, and for cross-border shops created before the marketplace was recorded. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| business_region | any | false | none | Where a cross-border (region GLOBAL) shop's business is registered: CN, HK, US or EU. Decides which TikTok cross-border seller center the shop signs in on. Null for region-scoped shops and for cross-border shops created before it was asked. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| currency | string | true | none | none |
| status | string | true | none | none |
| customer_id | any | false | none | The customer (brand account) that owns this shop. Most useful on the internal master-key cross-customer shop listing, where results span multiple brands. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| primary_category | any | false | none | Shop's primary L1 product category from TikTok Shop. Matches one of the canonical L1 names returned by GET /api/social-intelligence-v2/sellers/categories. Null when the shop has no Social Intelligence data yet. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
ShopSupportContactDefaultRequest
{
"email": "string",
"phone": "string"
}
ShopSupportContactDefaultRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| string | true | none | Default contact email shown to the creator on the TC card. | |
| phone | any | false | none | Optional default contact phone. E.164 format recommended. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
ShopSupportContactDefaultResponse
{
"shop_id": 0,
"configured": true,
"email": "string",
"phone": "string",
"updated_at": "string"
}
ShopSupportContactDefaultResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | integer | true | none | Shop the default applies to. |
| configured | boolean | true | none | True when a default is stored for this shop. When False, TC create requests must supply support_contact per request. |
| any | false | none | Default contact email, or null when not configured. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| phone | any | false | none | Default contact phone, or null when unset/not configured. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| updated_at | any | false | none | ISO-8601 timestamp of the last update, or null when not configured. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
ShopsListResponse
{
"data": [
{
"shop_id": 0,
"shop_name": "string",
"region": "string",
"affiliate_market_region": "string",
"business_region": "string",
"currency": "string",
"status": "string",
"customer_id": 0,
"primary_category": "string"
}
]
}
ShopsListResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | [ShopResponse] | true | none | none |
SiExportResponse
{
"data": [
null
],
"row_count": 0,
"row_limit": 0,
"truncated": true,
"columns": [
"string"
]
}
SiExportResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | [any] | true | none | Export rows, one object per record. |
| row_count | integer | true | none | none |
| row_limit | any | true | none | Per-request row cap applied. Null when the customer is uncapped. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| truncated | boolean | true | none | True when the row cap clipped the result — there is more data than was returned. Narrow the filters and export again rather than treating the rows as the complete set. |
| columns | [string] | true | none | Column order used by the CSV form. |
SkuPricing
{
"sku_id": "string",
"seller_sku": "string",
"sale_price": 0,
"original_price": 0,
"inventory": 0,
"price_source": "string"
}
SkuPricing
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sku_id | string | true | none | none |
| seller_sku | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sale_price | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| original_price | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| inventory | integer | false | none | none |
| price_source | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
SliderFilterConfig
{
"min": 0,
"max": 0,
"step": 0
}
SliderFilterConfig
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| min | number | true | none | none |
| max | number | true | none | none |
| step | number | true | none | none |
SnapshotRequest
{
"preset": "string",
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"metric_codes": [
"NRR"
]
}
SnapshotRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| preset | any | false | none | Relative window ending at the shop's newest settled day: <n>d (1-999), <n>m (1-99) or all, always capped at 365 days. Mutually exclusive with explicit dates; defaults to 30d when neither is given. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| start_date | any | false | none | Inclusive window start (YYYY-MM-DD). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_date | any | false | none | Inclusive window end (YYYY-MM-DD). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| metric_codes | any | false | none | Restrict to these metric codes; all six when omitted. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
SparkCodeRow
{
"spark_code": "string",
"creator_id": "string",
"creator_handle": "string",
"video_id": "string",
"video_url": "string",
"product_name": "string",
"automation_id": 0,
"form_uuid": "string",
"permission": true,
"source": "string",
"collected_at": "string",
"expires_at": "string"
}
SparkCodeRow
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| spark_code | string | true | none | none |
| creator_id | any | false | none | TikTok creator ID. Null on a bulk-uploaded retainer code, which carries only the handle its uploader typed. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_handle | any | false | none | TikTok handle from the CRM roster, or the handle supplied in a bulk upload. Null for a creator with no CRM row yet. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video_url | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| automation_id | any | false | none | The automation whose form collected it. Null for scraped and bulk-uploaded codes. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| form_uuid | any | false | none | The form the creator submitted — the UUID in the /spark-code-form/{form_uuid} link they were DMed. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| permission | any | false | none | The creator ticked the permission box on the form. NOT a usage-rights grant — usage rights are a separate flow with their own lifecycle. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | boolean | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| source | string | true | none | form, scraped, or bulk_upload — where the code came from. |
| collected_at | any | false | none | When the code was submitted, scraped, or uploaded (ISO 8601). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| expires_at | any | false | none | Authorisation expiry (ISO 8601). Null when the source does not carry one. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
SparkCodeSyncAllRequestPublic
{}
SparkCodeSyncAllRequestPublic
Properties
None
SparkCodeSyncRequestPublic
{
"spark_codes": [
"string"
]
}
SparkCodeSyncRequestPublic
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| spark_codes | [string] | true | none | Up to 100 spark codes to sync in one request. Each code fires one TikTok /tt_video/authorize/ call; rate-limited codes are left as pending so the offline CRJ picks them up. Whitespace is stripped; blank or duplicate entries are rejected with 422. |
SparkCodesListResponse
{
"data": [
{
"spark_code": "string",
"creator_id": "string",
"creator_handle": "string",
"video_id": "string",
"video_url": "string",
"product_name": "string",
"automation_id": 0,
"form_uuid": "string",
"permission": true,
"source": "string",
"collected_at": "string",
"expires_at": "string"
}
],
"pagination": {
"total_count": 0,
"page": 0,
"page_size": 0,
"total_pages": 0
}
}
SparkCodesListResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | [SparkCodeRow] | true | none | [One collected spark code.] |
| pagination | public_api__core__pagination__PaginationMeta | true | none | Pagination metadata returned in responses. |
StageProductRow
{
"product_id": "string",
"product_name": "string",
"image_url": "string",
"metrics": {
"property1": 0,
"property2": 0
}
}
StageProductRow
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_id | string | true | none | none |
| product_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| image_url | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| metrics | object | false | none | none |
| » additionalProperties | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| »» anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| »» anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| »» anonymous | null | false | none | none |
StageProductsResponse
{
"stage_id": "string",
"products": [
{
"product_id": "string",
"product_name": "string",
"image_url": "string",
"metrics": {
"property1": 0,
"property2": 0
}
}
],
"total": 0,
"page": 0,
"page_size": 0
}
StageProductsResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| stage_id | string | true | none | none |
| products | [StageProductRow] | true | none | [One row in the per-stage product aggregates response.] |
| total | integer | true | none | none |
| page | integer | true | none | none |
| page_size | integer | true | none | none |
StatusResponse
{
"connected": true,
"needs_reauth": false,
"page": {
"id": "string",
"name": "string"
},
"ig": {
"id": "string",
"username": "string"
},
"ad_account": {
"id": "string",
"name": "string"
},
"business": {
"id": "string",
"name": "string"
}
}
StatusResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| connected | boolean | true | none | none |
| needs_reauth | boolean | false | none | none |
| page | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | ConnectedEntity | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| ig | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | ConnectedIGEntity | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| ad_account | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | ConnectedEntity | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| business | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | ConnectedEntity | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
SuccessResponse
{
"success": true
}
SuccessResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| success | boolean | false | none | none |
SummaryResponse
{
"ig": {},
"page": {},
"ad_account": {},
"business": {},
"recent_own_media_count": 0,
"recent_tagged_media_count": 0
}
SummaryResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| ig | object | false | none | none |
| page | object | false | none | none |
| ad_account | object | false | none | none |
| business | object | false | none | none |
| recent_own_media_count | integer | false | none | none |
| recent_tagged_media_count | integer | false | none | none |
SweepstakesPricing
{
"campaign_type": "sweepstakes",
"reward_type": "cash",
"metric_type": "gmv",
"sweepstakes_prize": 0,
"sweepstakes_points_per_gmv": "0",
"sweepstakes_points_per_view": "0",
"sweepstakes_points_per_post": "0",
"sweepstakes_draw_trigger": "auto"
}
SweepstakesPricing
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| campaign_type | string | false | none | none |
| reward_type | string | false | none | none |
| metric_type | string | false | none | none |
| sweepstakes_prize | any | true | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sweepstakes_points_per_gmv | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sweepstakes_points_per_view | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sweepstakes_points_per_post | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sweepstakes_draw_trigger | string | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| sweepstakes_draw_trigger | auto |
| sweepstakes_draw_trigger | manual |
TabCounts
{
"creator_tracker_count": 0,
"sample_request_count": 0,
"video_count": 0,
"reply_count": 0,
"unread_count": 0
}
TabCounts
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_tracker_count | integer | false | none | none |
| sample_request_count | integer | false | none | none |
| video_count | integer | false | none | none |
| reply_count | integer | false | none | none |
| unread_count | integer | false | none | none |
TaggedMediaItem
{
"id": "string",
"caption": "string",
"media_type": "string",
"permalink": "string",
"timestamp": "string",
"username": "string",
"owner": {},
"like_count": 0,
"comments_count": 0
}
TaggedMediaItem
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| id | string | true | none | none |
| caption | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| media_type | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| permalink | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| timestamp | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| username | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| owner | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | object | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| like_count | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| comments_count | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
TaggedMediaResponse
{
"data": [
{
"id": "string",
"caption": "string",
"media_type": "string",
"permalink": "string",
"timestamp": "string",
"username": "string",
"owner": {},
"like_count": 0,
"comments_count": 0
}
]
}
TaggedMediaResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | [TaggedMediaItem] | false | none | none |
TargetCollabConfig
{
"invitation_name": "string",
"valid_until": "2019-08-24",
"message": "string",
"products": [
{
"product_id": "string",
"commission_rate": 1,
"shop_min_commission": 1,
"shop_ads_commission_rate": 1
}
],
"content_type": "no_preference",
"sample_policy": {
"offer_free_samples": false,
"auto_approve": false,
"send_to": "brand_recipient"
},
"support_contact": {
"email": "string",
"phone": "string"
}
}
TargetCollabConfig
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| invitation_name | string | true | none | Name shown on the TC invitation card (max 30 chars). Required by the portal — without it, the card displays empty. Persists as config.BASE_INVITATION_NAME. |
| valid_until | any | false | none | Date the TC card stops being valid. After this, the dispatcher stops the automation (see internal/queries/automations_to_run.py). Null = no expiry. Distinct from end_date (top-level automation stop date) — they can differ. Persists as config.VALID_UNTIL in MM/DD/YYYY format (legacy). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| message | string | true | none | TC card message text shown to the creator (max 500 chars). Different from messages[] (initial outreach DM addons) — this is the body on the invitation card itself. The portal rejects bodies containing the word amazon. Persists as config.TARGET_COLLAB_MESSAGE. |
| products | [TargetCollabProduct] | true | none | none |
| content_type | string | false | none | Content type preference for this TC. Translates to the legacy DB enum (No preference / Shoppable video / Shoppable LIVE) at the persistence boundary. |
| sample_policy | TargetCollabSamplePolicy | false | none | TC sample policy. Three modes from the portal: 1. Manual approval — offer_free_samples=False, auto_approve=False2. Free samples + manual approval — offer_free_samples=True, auto_approve=False3. Free samples + auto approval — offer_free_samples=True, auto_approve=Trueoffer_free_samples=False, auto_approve=True is also accepted butrare in prod (~0% — see audit 2026-05-01). |
| support_contact | any | false | none | Brand-side support contact shown on the TC card. Optional ONLY when this shop has a default configured via PUT /public/v1/target-collabs/support-contact-default (CORE-5428) — in that case it's used as the fallback. When provided here it overrides the shop default for this request. If neither is present the request is rejected with 422 SUPPORT_CONTACT_REQUIRED (the portal also rejects TC creates without a contact email). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | TargetCollabContact | false | none | Brand-side contact info displayed on the TC card so the creator can reach the merchant with questions. email is required by theportal at TC create time; phone is optional. Persists at the legacyconfig root as EMAIL / PHONE_NUMBER. |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| content_type | no_preference |
| content_type | shoppable_video |
| content_type | shoppable_live |
TargetCollabContact
{
"email": "string",
"phone": "string"
}
TargetCollabContact
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| string | true | none | Contact email shown to the creator on the TC card. | |
| phone | any | false | none | E.164 format recommended. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
TargetCollabContactPatch
{
"email": "string",
"phone": "string"
}
TargetCollabContactPatch
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| phone | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
TargetCollabDirectRequest
{
"creator_handle": "string",
"product_id": "string",
"commission_rate": 1,
"shop_ads_commission_rate": 1,
"message": "string",
"invitation_name": "string",
"valid_until": "2019-08-24",
"support_contact": {
"email": "string",
"phone": "string"
}
}
TargetCollabDirectRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_handle | string | true | none | TikTok @-handle (without the @). Resolved server-side against this shop's CRM / affiliate list (a row in crm_creators for reacher_shop_id=<shop_id> whose creator_name matches the handle, ordered by GMV via a LEFT JOIN against the region's creator table). The creator must already have interacted with your shop — handles for creators who haven't applied / sampled / transacted yet will not resolve, even if the handle exists globally on TikTok. Unknown handle → 404 CREATOR_NOT_FOUND. |
| product_id | string | true | none | TikTok Shop product ID to attach to the invitation. |
| commission_rate | number | true | none | Affiliate commission rate (0.0-1.0, e.g. 0.20 for 20%). |
| shop_ads_commission_rate | any | false | none | Optional Shop Ads (co-funded) commission rate (0.0-1.0). When set, persists into the legacy PRODUCTS blob at the per-product level; the TC runtime fills the matching field on the TC form. Omit to leave unset (worker treats as not configured). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| message | string | true | none | TC card message body shown to the creator (max 500 chars). Mirrors target_collab.message on the full TC create surface — the portal rejects bodies containing the word amazon. |
| invitation_name | string | true | none | Name shown on the TC invitation card (max 30 chars). Same field as target_collab.invitation_name on the full TC create. |
| valid_until | any | false | none | Date the TC card stops being valid. Defaults to today + 30 days when omitted. After this date the dispatcher stops the underlying automation (see internal/queries/automations_to_run.py). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| support_contact | any | false | none | Brand-side support contact shown on the TC card. Optional ONLY when this shop has a default configured via PUT /public/v1/target-collabs/support-contact-default (CORE-5428) — in that case it's used as the fallback. When provided here it overrides the shop default for this request. If neither is present the request is rejected with 422 SUPPORT_CONTACT_REQUIRED. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | TargetCollabDirectSupportContact | false | none | Brand-side support contact shown on the TC invitation card. MirrorsTargetCollabContact exactly — kept as a separate class so the directsurface's OpenAPI doesn't pull in the heavier automation-shape model name when callers only see this endpoint. |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
TargetCollabDirectResponse
{
"automation_id": 0,
"status": "string",
"creator_id": "string",
"creator_handle": "string",
"shop_id": 0,
"check_status_at": "string",
"queued_at": "string",
"dry_run": false
}
TargetCollabDirectResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| automation_id | integer | true | none | Underlying Automations.automation_id, for polling. |
| status | string | true | none | Always queued on success. The underlying automation is running immediately; the field name reflects delivery semantics (the TC invite itself is queued for the worker). |
| creator_id | string | true | none | Resolved creator_id for the supplied handle. |
| creator_handle | string | true | none | The handle echoed back (stripped of any leading @). |
| shop_id | integer | true | none | Shop the invite was created under. |
| check_status_at | string | true | none | Relative URL for polling automation state — /public/v1/automations/{automation_id}. |
| queued_at | string | true | none | ISO-8601 timestamp at which the start transition fired. |
| dry_run | boolean | false | none | True when X-Dry-Run was set — no automation row was created and no worker job was queued. automation_id is 0 and queued_at reflects the request time. |
TargetCollabDirectSupportContact
{
"email": "string",
"phone": "string"
}
TargetCollabDirectSupportContact
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| string | true | none | Contact email shown to the creator on the TC card. | |
| phone | any | false | none | E.164 format recommended. Normalized at persistence. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
TargetCollabPatchPayload
{
"invitation_name": "string",
"valid_until": "2019-08-24",
"message": "string",
"products": [
{
"product_id": "string",
"commission_rate": 1,
"shop_min_commission": 1,
"shop_ads_commission_rate": 1
}
],
"content_type": "no_preference",
"sample_policy": {
"offer_free_samples": true,
"auto_approve": true,
"send_to": "brand_recipient"
},
"support_contact": {
"email": "string",
"phone": "string"
},
"lock_receivers_profiles": true
}
TargetCollabPatchPayload
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| invitation_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| valid_until | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| message | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| products | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [TargetCollabProduct] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| content_type | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sample_policy | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | TargetCollabSamplePolicyPatch | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| support_contact | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | TargetCollabContactPatch | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| lock_receivers_profiles | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | boolean | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | no_preference |
| anonymous | shoppable_video |
| anonymous | shoppable_live |
TargetCollabProduct
{
"product_id": "string",
"commission_rate": 1,
"shop_min_commission": 1,
"shop_ads_commission_rate": 1
}
TargetCollabProduct
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_id | string | true | none | TikTok Shop product ID. |
| commission_rate | number | true | none | Affiliate commission rate (0.0-1.0, e.g. 0.20 for 20%). |
| shop_min_commission | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_ads_commission_rate | any | false | none | Optional Shop Ads (co-funded) commission rate (0.0-1.0). Persisted into the legacy PRODUCTS blob; the TC runtime fills it on the TC form when present. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
TargetCollabSamplePolicy
{
"offer_free_samples": false,
"auto_approve": false,
"send_to": "brand_recipient"
}
TargetCollabSamplePolicy
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| offer_free_samples | boolean | false | none | none |
| auto_approve | boolean | false | none | When true, accepted invites trigger immediate sample-request auto-approval without manual review. Maps to top-level config.AUTO_APPROVE. Per architecture review 2026-05-01. |
| send_to | string | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| send_to | brand_recipient |
| send_to | mall_recipient |
TargetCollabSamplePolicyPatch
{
"offer_free_samples": true,
"auto_approve": true,
"send_to": "brand_recipient"
}
TargetCollabSamplePolicyPatch
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| offer_free_samples | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | boolean | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| auto_approve | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | boolean | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| send_to | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | brand_recipient |
| anonymous | mall_recipient |
TargetCollaborationCardContent
{
"invitation_group_id": "string"
}
TargetCollaborationCardContent
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| invitation_group_id | string | true | none | none |
TargetMetricsInput
{
"creators_messaged": 200,
"sample_approved": 80,
"sample_requests": 100,
"spark_codes": 10,
"target_collabs": 50,
"videos_converted": 25,
"videos_posted": 35
}
TargetMetricsInput
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| target_collabs | any | false | none | Target number of collaborations |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creators_messaged | any | false | none | Target number of creators messaged |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sample_requests | any | false | none | Target number of sample requests |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| videos_converted | any | false | none | Target number of video conversions |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| spark_codes | any | false | none | Target number of spark codes |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sample_approved | any | false | none | Target number of samples approved |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| videos_posted | any | false | none | Target number of videos posted |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
TargetMetricsResponse
{
"creators_messaged": 200,
"sample_approved": 80,
"sample_requests": 100,
"spark_codes": 10,
"target_collabs": 50,
"videos_converted": 25,
"videos_posted": 35
}
TargetMetricsResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| target_collabs | any | false | none | Target number of collaborations |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creators_messaged | any | false | none | Target number of creators messaged |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sample_requests | any | false | none | Target number of sample requests |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| videos_converted | any | false | none | Target number of video conversions |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| spark_codes | any | false | none | Target number of spark codes |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sample_approved | any | false | none | Target number of samples approved |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| videos_posted | any | false | none | Target number of videos posted |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
TargetResponse
{
"created_at": "2024-01-01T00:00:00Z",
"customer_id": 924,
"granularity": "monthly",
"id": "550e8400-e29b-41d4-a716-446655440000",
"shop_id": 1183,
"targets": {
"creators_messaged": 200,
"sample_approved": 80,
"sample_requests": 100,
"spark_codes": 10,
"target_collabs": 50,
"videos_converted": 25,
"videos_posted": 35
},
"updated_at": "2024-01-01T00:00:00Z"
}
TargetResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| id | string | true | none | Target UUID |
| customer_id | integer | true | none | Customer ID |
| shop_id | integer | true | none | Shop ID |
| granularity | string | true | none | Target time period granularity |
| targets | TargetMetricsResponse | true | none | Target metrics nested object |
| created_at | string(date-time) | true | none | When this target becomes applicable |
| updated_at | string(date-time) | true | none | Last update timestamp |
TargetsBulkWriteRequest
{
"targets": [
{
"granularity": "monthly",
"targets": {
"creators_messaged": 200,
"target_collabs": 50,
"videos_posted": 35
}
}
]
}
TargetsBulkWriteRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| targets | [TargetsWriteRequest] | true | none | Up to 10 target sets, one per granularity. Repeating a granularity is rejected. |
TargetsBulkWriteResponse
{
"results": [
{
"created": true,
"target": {
"created_at": "2024-01-01T00:00:00Z",
"customer_id": 924,
"granularity": "monthly",
"id": "550e8400-e29b-41d4-a716-446655440000",
"shop_id": 1183,
"targets": {
"creators_messaged": 200,
"sample_approved": 80,
"sample_requests": 100,
"spark_codes": 10,
"target_collabs": 50,
"videos_converted": 25,
"videos_posted": 35
},
"updated_at": "2024-01-01T00:00:00Z"
}
}
]
}
TargetsBulkWriteResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| results | [TargetsWriteResponse] | true | none | One entry per submitted target set, in request order. |
TargetsListResponse
{
"targets": [
{
"created_at": "2024-01-01T00:00:00Z",
"creators_messaged": 200,
"customer_id": 1,
"granularity": "monthly",
"id": "550e8400-e29b-41d4-a716-446655440000",
"sample_approved": 80,
"sample_requests": 100,
"shop_id": 123,
"spark_codes": 10,
"target_collabs": 50,
"updated_at": "2024-01-01T00:00:00Z",
"videos_converted": 25
}
],
"total_count": 1
}
TargetsListResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| targets | [TargetResponse] | true | none | List of targets |
| total_count | integer | true | none | Total number of targets |
TargetsWriteRequest
{
"granularity": "monthly",
"targets": {
"creators_messaged": 200,
"target_collabs": 50,
"videos_posted": 35
}
}
TargetsWriteRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| granularity | GranularityEnum | true | none | Period the goals apply to: weekly, monthly or quarterly. |
| targets | TargetMetricsInput | true | none | Per-metric goal values. Omit a metric to leave it unset; at least one must be provided. |
| effective_from | any | false | none | When the goals start applying. Defaults to now. Cannot be more than a year in the future. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date-time) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
TargetsWriteResponse
{
"created": true,
"target": {
"created_at": "2024-01-01T00:00:00Z",
"customer_id": 924,
"granularity": "monthly",
"id": "550e8400-e29b-41d4-a716-446655440000",
"shop_id": 1183,
"targets": {
"creators_messaged": 200,
"sample_approved": 80,
"sample_requests": 100,
"spark_codes": 10,
"target_collabs": 50,
"videos_converted": 25,
"videos_posted": 35
},
"updated_at": "2024-01-01T00:00:00Z"
}
}
TargetsWriteResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| created | boolean | true | none | True when no target existed for this granularity and a new one was created; false when an existing one was updated. |
| target | TargetResponse | true | none | The stored target. |
TcCampaignLink
{
"campaign_id": 0,
"campaign_name": "string"
}
TcCampaignLink
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| campaign_id | integer | true | none | none |
| campaign_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
TcInvitationBatch
{
"sent_at": "string",
"status": "string",
"creator_count": 0,
"creators": [
"string"
],
"creators_truncated": false,
"expiration_date": "string"
}
TcInvitationBatch
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sent_at | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| status | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_count | integer | true | none | none |
| creators | [string] | false | none | none |
| creators_truncated | boolean | false | none | none |
| expiration_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
TierFunnelRow
{
"tier": "string",
"creators": 0,
"reached": 0,
"converted": 0,
"conversion_rate": 0,
"touches": 0,
"sample_requests": 0,
"samples_approved": 0,
"videos_posted": 0,
"gmv": 0
}
TierFunnelRow
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| tier | string | true | none | L0-L7, by the creator's ALL-TIME platform GMV. |
| creators | integer | true | none | Creators of this tier with any funnel activity in the week. |
| reached | integer | true | none | none |
| converted | integer | true | none | none |
| conversion_rate | number | true | none | none |
| touches | integer | true | none | Outreach messages sent — three DMs to one creator counts three. Use reached for distinct creators. |
| sample_requests | integer | true | none | none |
| samples_approved | integer | true | none | none |
| videos_posted | integer | true | none | none |
| gmv | number | true | none | GMV attributed to the window, not the lifetime GMV that set the tier. |
TierPerformanceRequest
{
"start_date": "2019-08-24",
"end_date": "2019-08-24"
}
TierPerformanceRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| start_date | any | false | none | Inclusive window start (YYYY-MM-DD). Defaults to 8 weeks back. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_date | any | false | none | Inclusive window end (YYYY-MM-DD). Defaults to yesterday. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
TierPerformanceResponse
{
"shop_id": 0,
"weeks": [
{
"week_start": "string",
"week_ending": "string",
"total": {
"creators": 0,
"reached": 0,
"converted": 0,
"conversion_rate": 0,
"touches": 0,
"sample_requests": 0,
"samples_approved": 0,
"videos_posted": 0,
"gmv": 0
},
"tiers": [
{
"tier": "string",
"creators": 0,
"reached": 0,
"converted": 0,
"conversion_rate": 0,
"touches": 0,
"sample_requests": 0,
"samples_approved": 0,
"videos_posted": 0,
"gmv": 0
}
]
}
]
}
TierPerformanceResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | integer | true | none | none |
| weeks | [TierWeek] | true | none | One entry per week touching the window, quiet weeks included. |
TierTotal
{
"creators": 0,
"reached": 0,
"converted": 0,
"conversion_rate": 0,
"touches": 0,
"sample_requests": 0,
"samples_approved": 0,
"videos_posted": 0,
"gmv": 0
}
TierTotal
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creators | integer | true | none | none |
| reached | integer | true | none | none |
| converted | integer | true | none | none |
| conversion_rate | number | true | none | Recomputed from the week's totals, not averaged across the eight tiers — that would weight an L7 with one creator like an L0 with two thousand. |
| touches | integer | true | none | none |
| sample_requests | integer | true | none | none |
| samples_approved | integer | true | none | none |
| videos_posted | integer | true | none | none |
| gmv | number | true | none | none |
TierWeek
{
"week_start": "string",
"week_ending": "string",
"total": {
"creators": 0,
"reached": 0,
"converted": 0,
"conversion_rate": 0,
"touches": 0,
"sample_requests": 0,
"samples_approved": 0,
"videos_posted": 0,
"gmv": 0
},
"tiers": [
{
"tier": "string",
"creators": 0,
"reached": 0,
"converted": 0,
"conversion_rate": 0,
"touches": 0,
"sample_requests": 0,
"samples_approved": 0,
"videos_posted": 0,
"gmv": 0
}
]
}
TierWeek
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| week_start | string | true | none | The Sunday the week starts on (YYYY-MM-DD). |
| week_ending | string | true | none | The Saturday it ends on — the label reports use ('WE 9/12'). |
| total | TierTotal | true | none | Every tier in the week, summed. |
| tiers | [TierFunnelRow] | true | none | L7 down to L0; all eight always present. |
TimeseriesDataPoint
{
"date": "string",
"value": 0
}
TimeseriesDataPoint
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| date | string | true | none | none |
| value | number | true | none | none |
TimeseriesRequest
{
"metrics": [
"gmv"
],
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"granularity": "day"
}
TimeseriesRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| metrics | [string] | true | none | none |
| start_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| granularity | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | day |
| anonymous | week |
| anonymous | month |
TimeseriesResponse
{
"data": {
"property1": [
{
"date": "string",
"value": 0
}
],
"property2": [
{
"date": "string",
"value": 0
}
]
},
"granularity": "string",
"start_date": "string",
"end_date": "string",
"currency": "string",
"shops_queried": [
"string"
]
}
TimeseriesResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | object | true | none | none |
| » additionalProperties | [TimeseriesDataPoint] | false | none | none |
| granularity | string | true | none | none |
| start_date | string | true | none | none |
| end_date | string | true | none | none |
| currency | string | true | none | none |
| shops_queried | any | false | none | Shop names included when querying multiple shops (x-shop-id: all or comma-separated). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
TopCreator
{
"creator_id": 0,
"creator_handle": "string",
"creator_avatar_url": "string",
"tiktok_profile_url": "string",
"gmv_generated": 0,
"videos_posted": 0
}
TopCreator
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_id | integer | true | none | none |
| creator_handle | string | true | none | none |
| creator_avatar_url | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| tiktok_profile_url | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| gmv_generated | number | true | none | none |
| videos_posted | integer | true | none | none |
TopLineMetrics
{
"creators_reached": 0,
"dm_response_count": 0,
"reply_rate": 0,
"unique_creators_posted": 0,
"post_rate": 0,
"videos_count": 0,
"total_revenue": 0,
"total_views": 0,
"total_shares": 0,
"total_likes": 0
}
TopLineMetrics
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creators_reached | integer | false | none | none |
| dm_response_count | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| reply_rate | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| unique_creators_posted | integer | false | none | none |
| post_rate | number | false | none | none |
| videos_count | integer | false | none | none |
| total_revenue | number | false | none | none |
| total_views | integer | false | none | none |
| total_shares | integer | false | none | none |
| total_likes | integer | false | none | none |
TopProduct
{
"product_id": 0,
"product_name": "string",
"product_image_url": "string",
"gmv_amount": 0,
"units_sold": 0,
"unit_revenue": 0,
"pct_of_total": 0,
"sample_request_count": 0,
"approval_count": 0,
"conversion_count": 0,
"growth_rate_pct": 0,
"prev_week_gmv": 0
}
TopProduct
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_id | integer | true | none | none |
| product_name | string | true | none | none |
| product_image_url | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| gmv_amount | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| units_sold | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| unit_revenue | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| pct_of_total | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sample_request_count | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| approval_count | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| conversion_count | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| growth_rate_pct | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| prev_week_gmv | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
TopVideo
{
"video_id": 0,
"video_title": "string",
"video_url": "string",
"video_thumbnail_url": "string",
"creator_handle": "string",
"gmv_generated": 0,
"view_count": 0,
"like_count": 0,
"comment_count": 0,
"engagement_rate": 0
}
TopVideo
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video_id | integer | true | none | none |
| video_title | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video_url | string | true | none | none |
| video_thumbnail_url | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_handle | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| gmv_generated | number | true | none | none |
| view_count | integer | true | none | none |
| like_count | integer | true | none | none |
| comment_count | integer | true | none | none |
| engagement_rate | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
TrackerVideosRequest
{
"campaign_creator_mapping_id": 0
}
TrackerVideosRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| campaign_creator_mapping_id | integer | true | none | none |
TrackerVideosResponse
{
"status": "success",
"data": [
{}
],
"count": 0
}
TrackerVideosResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| status | string | false | none | none |
| data | [object] | false | none | none |
| count | integer | false | none | none |
TrendingVideo
{
"video_id": "string",
"video_title": "string",
"thumbnail_url": "string",
"posted_at_epoch": 0,
"creator_name": "string",
"creator_id": "string",
"rank": 0,
"rank_change": 0,
"views_min": 0,
"views_max": 0,
"similar_videos_on_site": 0,
"linked_product": {
"product_id": "string",
"product_name": "string",
"price_min": 0,
"price_max": 0,
"rating": 0,
"review_count": 0
}
}
TrendingVideo
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video_id | string | true | none | none |
| video_title | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| thumbnail_url | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| posted_at_epoch | any | false | none | Unix timestamp TikTok reports for the video's creation. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_name | any | false | none | Public TikTok handle. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| rank | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| rank_change | any | false | none | Positions gained (+) or lost (-) since the previous ranking. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| views_min | any | false | none | TikTok reports views as a bucket, not an exact count. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| views_max | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| similar_videos_on_site | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| linked_product | TrendingVideoProduct | true | none | none |
TrendingVideoProduct
{
"product_id": "string",
"product_name": "string",
"price_min": 0,
"price_max": 0,
"rating": 0,
"review_count": 0
}
TrendingVideoProduct
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| price_min | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| price_max | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| rating | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| review_count | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
TrendingVideosExportBody
{
"video_ids": [
"string"
],
"search": "string",
"category": "string",
"subcategory": "string",
"sort_by": "string",
"sort_order": "desc",
"time_range": "string",
"min_gmv": 0,
"max_gmv": 0,
"start_date": "string",
"end_date": "string",
"min_engagement": 0,
"max_engagement": 0,
"min_views": 0,
"max_views": 0,
"format": "json"
}
TrendingVideosExportBody
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video_ids | any | false | none | Export these specific videos. Filters below are then ignored. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| search | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| category | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| subcategory | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sort_by | any | false | none | gmv, views, likes, engagement, date |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sort_order | string | false | none | none |
| time_range | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| min_gmv | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| max_gmv | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| start_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| min_engagement | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| max_engagement | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| min_views | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| max_views | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| format | string | false | none | json returns rows; csv returns a downloadable file. |
TrendingVideosResponse
{
"shop_id": 0,
"start_date": "string",
"end_date": "string",
"data": [
{
"video_id": "string",
"video_title": "string",
"thumbnail_url": "string",
"posted_at_epoch": 0,
"creator_name": "string",
"creator_id": "string",
"rank": 0,
"rank_change": 0,
"views_min": 0,
"views_max": 0,
"similar_videos_on_site": 0,
"linked_product": {
"product_id": "string",
"product_name": "string",
"price_min": 0,
"price_max": 0,
"rating": 0,
"review_count": 0
}
}
]
}
TrendingVideosResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | integer | true | none | none |
| start_date | any | false | none | Start of the ranked snapshot. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_date | any | false | none | End of the ranked snapshot. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | [TrendingVideo] | true | none | none |
TriggerFrequency
"daily"
TriggerFrequency
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| TriggerFrequency | string | false | none | How often the automation evaluates its conditions. Only daily is honoured by the offline execution engine today; theportal FE submits this value exclusively. |
Enumerated Values
| Property | Value |
|---|---|
| TriggerFrequency | daily |
UpdateGmvMaxCampaignRequest
{
"campaign_name": "string",
"daily_budget": 0,
"target_roas": 0,
"operation_status": "ENABLE",
"promotion_days": 1,
"auto_budget_enabled": true
}
UpdateGmvMaxCampaignRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| campaign_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| daily_budget | any | false | none | New daily budget. Maps to TikTok budget. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| target_roas | any | false | none | New target ROAS. Maps to TikTok roas_bid. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| operation_status | any | false | none | Pause (DISABLE) or resume (ENABLE) the campaign. Maps to TikTok operation_status. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| promotion_days | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| auto_budget_enabled | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | boolean | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | ENABLE |
| anonymous | DISABLE |
UpdateProfileResponse
{
"success": true,
"profile": {
"id": 0,
"title": "string",
"description": "string",
"search_query": "string",
"filters": {},
"source": "string",
"is_active": true,
"vault_file_resource_id": 0,
"is_hidden": true,
"is_deleted": true,
"hide_unsafe": true,
"creator_count": 0,
"last_search_at": "2019-08-24T14:15:22Z",
"created_at": "2019-08-24T14:15:22Z",
"updated_at": "2019-08-24T14:15:22Z",
"deleted_at": "2019-08-24T14:15:22Z"
}
}
UpdateProfileResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| success | boolean | true | none | none |
| profile | ProfileData | true | none | Profile data structure |
UpdateSharedDashboardResponse
{
"success": true,
"message": "string",
"uuid": "string",
"status": "string",
"share_url": "",
"created_at": "",
"locked_start_date": "2019-08-24",
"locked_end_date": "2019-08-24",
"report_config": {
"v": 1,
"metrics": [
"string"
],
"modules": {
"property1": true,
"property2": true
}
}
}
UpdateSharedDashboardResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| success | boolean | true | none | none |
| message | string | true | none | none |
| uuid | string | true | none | none |
| status | string | true | none | none |
| share_url | string | false | none | none |
| created_at | string | false | none | none |
| locked_start_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| locked_end_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| report_config | ShareReportConfig | false | none | Which metric cards and modules a share link shows an external viewer. An omitted/empty config is meaningful: it marks a legacy link, which renders the original fixed six-card layout. That is why metrics and modulesdefault to None rather than to empty collections — "no opinion" and "the owner turned everything off" must stay distinguishable. |
UsageRightsCreateRequest
{
"usageRightsMonths": 120,
"usageRightsScope": "organic_only",
"usageExclusivityEnabled": true,
"usageExclusivityMonths": 1,
"agreementClause": "string",
"videoId": "string",
"creatorId": "string",
"messageText": "string",
"isPaidOffer": false,
"offerAmount": 0
}
UsageRightsCreateRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| usageRightsMonths | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| usageRightsScope | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| usageExclusivityEnabled | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | boolean | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| usageExclusivityMonths | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| agreementClause | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| videoId | string | true | none | none |
| creatorId | string | true | none | none |
| messageText | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| isPaidOffer | boolean | false | none | none |
| offerAmount | number | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | organic_only |
| anonymous | organic_and_paid |
| anonymous | paid_only |
UsageRightsRecord
{
"id": "string",
"videoId": "string",
"shopId": 0,
"creatorId": "string",
"creatorAccountId": 0,
"messageText": "string",
"isPaidOffer": false,
"offerAmount": 0,
"currency": "USD",
"usageRightsMonths": 0,
"usageRightsScope": "string",
"usageExclusivityEnabled": true,
"usageExclusivityMonths": 0,
"agreementClause": "string",
"status": "",
"dmStatus": "pending",
"dmSentAt": "string",
"dmError": "string",
"gcsVideoPath": "string",
"respondedAt": "string",
"cancelledAt": "string",
"createdAt": "",
"updatedAt": ""
}
UsageRightsRecord
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| id | string | true | none | none |
| videoId | string | true | none | none |
| shopId | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creatorId | string | true | none | none |
| creatorAccountId | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| messageText | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| isPaidOffer | boolean | false | none | none |
| offerAmount | number | false | none | none |
| currency | string | false | none | none |
| usageRightsMonths | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| usageRightsScope | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| usageExclusivityEnabled | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | boolean | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| usageExclusivityMonths | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| agreementClause | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| status | string | false | none | none |
| dmStatus | string | false | none | none |
| dmSentAt | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| dmError | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| gcsVideoPath | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| respondedAt | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| cancelledAt | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| createdAt | string | false | none | none |
| updatedAt | string | false | none | none |
UsageRightsRecordResponse
{
"data": {
"id": "string",
"videoId": "string",
"shopId": 0,
"creatorId": "string",
"creatorAccountId": 0,
"messageText": "string",
"isPaidOffer": false,
"offerAmount": 0,
"currency": "USD",
"usageRightsMonths": 0,
"usageRightsScope": "string",
"usageExclusivityEnabled": true,
"usageExclusivityMonths": 0,
"agreementClause": "string",
"status": "",
"dmStatus": "pending",
"dmSentAt": "string",
"dmError": "string",
"gcsVideoPath": "string",
"respondedAt": "string",
"cancelledAt": "string",
"createdAt": "",
"updatedAt": ""
}
}
UsageRightsRecordResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | UsageRightsRecord | true | none | A single usage-rights record (the portal's full detail shape). |
UsageRightsVideosResponse
{
"data": {}
}
UsageRightsVideosResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | object | true | none | none |
ValidationError
{
"loc": [
"string"
],
"msg": "string",
"type": "string"
}
ValidationError
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| loc | [anyOf] | true | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| msg | string | true | none | none |
| type | string | true | none | none |
VideoAnalysis
{
"video_id": "string",
"analyzed": true,
"analysis_source": "string",
"analysis_version": 0,
"analyzed_at": "2019-08-24T14:15:22Z",
"transcript": "string",
"transcript_language": "string",
"transcript_duration_s": 0,
"transcript_source": "string",
"hook_summary": "string",
"structure_outline": [
"string"
],
"on_screen_text": "string",
"vision_tags": {},
"detected_products": {},
"features": {},
"features_experimental": {}
}
VideoAnalysis
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video_id | string | true | none | none |
| analyzed | boolean | true | none | False when the shop owns this video but the pipeline has not analyzed it yet — every other field is then null. |
| analysis_source | any | false | none | video for a full-motion analysis, thumbnail for a still-frame one. Thumbnail analyses carry no transcript and no motion features. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| analysis_version | any | false | none | Analyzer version that produced this row. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| analyzed_at | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date-time) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| transcript | any | false | none | Spoken-audio transcript of the video. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| transcript_language | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| transcript_duration_s | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| transcript_source | any | false | none | uvi when the transcript came from the analyzer, video_transcripts when it came from the shop's transcript store. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| hook_summary | any | false | none | One-line description of how the video opens. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| structure_outline | any | false | none | Ordered beats of the video (e.g. Hook, Demo, CTA). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| on_screen_text | any | false | none | On-screen text (OCR), all segments joined into one string. Null when the video has no on-screen text. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| vision_tags | any | false | none | Visual tags detected in the video. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | any | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| detected_products | any | false | none | Products the analyzer recognised on screen. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | any | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| features | any | false | none | Stable scored creative features: hook_present_first_3s, has_product_demo, solution_shown, has_voiceover, video_pace, content_summary. Members the analyzer could not score are omitted rather than returned as null. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | object | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| features_experimental | any | false | none | Only present with include_experimental=true: the analyzer's full scored-feature block. Unstable — members are added, renamed and removed as the analyzer changes, so do not build on it without pinning the fields you read. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | object | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
VideoAnalysisBatchResponse
{
"data": [
{
"video_id": "string",
"analyzed": true,
"analysis_source": "string",
"analysis_version": 0,
"analyzed_at": "2019-08-24T14:15:22Z",
"transcript": "string",
"transcript_language": "string",
"transcript_duration_s": 0,
"transcript_source": "string",
"hook_summary": "string",
"structure_outline": [
"string"
],
"on_screen_text": "string",
"vision_tags": {},
"detected_products": {},
"features": {},
"features_experimental": {}
}
],
"not_found": [
"string"
]
}
VideoAnalysisBatchResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | [VideoAnalysis] | true | none | [UVI creative analysis for one video.] |
| not_found | [string] | true | none | Requested video_ids that do not belong to this shop. Videos that are owned but unanalyzed appear in data with analyzed: false. |
VideoAnalysisResponse
{
"data": {
"video_id": "string",
"analyzed": true,
"analysis_source": "string",
"analysis_version": 0,
"analyzed_at": "2019-08-24T14:15:22Z",
"transcript": "string",
"transcript_language": "string",
"transcript_duration_s": 0,
"transcript_source": "string",
"hook_summary": "string",
"structure_outline": [
"string"
],
"on_screen_text": "string",
"vision_tags": {},
"detected_products": {},
"features": {},
"features_experimental": {}
}
}
VideoAnalysisResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | VideoAnalysis | true | none | UVI creative analysis for one video. |
VideoBof
{
"video_id": "string",
"classified": true,
"classification_status": "classified",
"bof_status": "string",
"bof_confidence": 0,
"is_bof": true,
"matched_signals": [
"string"
],
"matched_keywords": [
"string"
],
"matched_patterns": [
"string"
],
"classified_at": "2019-08-24T14:15:22Z"
}
VideoBof
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video_id | string | true | none | none |
| classified | boolean | true | none | False when the shop owns this video but the classifier has no verdict for it — every other field is then null / false. See classification_status for why. |
| classification_status | string | false | none | Why the video is (un)classified. BOF classification is a separate pipeline from UVI analysis, so an analysed video is not automatically classified. One of: classified (a verdict exists); pending (analysed with a transcript, classifier hasn't reached it — transient); no_transcript (analysed but no usable transcript to classify, e.g. a thumbnail-only analysis); not_analyzed (UVI hasn't analysed the video yet). |
| bof_status | any | false | none | bof, not_bof, needs_review or pending. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| bof_confidence | any | false | none | Confidence in the verdict, 0-100. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| is_bof | boolean | true | none | The displayable verdict: bof_status is bof and bof_confidence >= 90. Identical to the BOF badge in the Reacher portal. |
| matched_signals | any | false | none | Where the signals were found (e.g. transcript, on_screen_text). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| matched_keywords | any | false | none | Bottom-of-funnel keywords found in the video. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| matched_patterns | any | false | none | Bottom-of-funnel phrase patterns the video matched. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| classified_at | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date-time) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| classification_status | classified |
| classification_status | pending |
| classification_status | no_transcript |
| classification_status | not_analyzed |
VideoBofResponse
{
"data": {
"video_id": "string",
"classified": true,
"classification_status": "classified",
"bof_status": "string",
"bof_confidence": 0,
"is_bof": true,
"matched_signals": [
"string"
],
"matched_keywords": [
"string"
],
"matched_patterns": [
"string"
],
"classified_at": "2019-08-24T14:15:22Z"
}
}
VideoBofResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | VideoBof | true | none | Bottom-of-funnel verdict for one video. |
VideoContentResponse
{
"status": "success",
"data": [
{}
],
"count": 0
}
VideoContentResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| status | string | false | none | none |
| data | [object] | false | none | none |
| count | integer | false | none | none |
VideoCreativeBreakdown
{
"analyzed": true,
"hook": {
"text": "string",
"classification": "string",
"reasoning": "string"
},
"sell_points": [
"string"
],
"product_niche": "string",
"shot_style": [
"string"
],
"videography": {
"locations": [
"string"
],
"lighting": [
"string"
],
"product_showcase": [
"string"
],
"notes": "string"
},
"missing_fields": [
"string"
]
}
VideoCreativeBreakdown
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| analyzed | boolean | true | none | none |
| hook | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | VideoCreativeHook | false | none | Opening-seconds angle of the video. |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sell_points | any | false | none | Key selling points the video leans on |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_niche | any | false | none | Product category leaf from the catalog, falling back to the content-angle tag |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shot_style | any | false | none | How the video is framed and composed |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| videography | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | VideoCreativeVideography | false | none | Camera work, setting, and presentation patterns. |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| missing_fields | [string] | false | none | none |
VideoCreativeHook
{
"text": "string",
"classification": "string",
"reasoning": "string"
}
VideoCreativeHook
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| text | any | false | none | The hook line as spoken/shown |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| classification | any | false | none | Hook type, e.g. problem-solution, curiosity |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| reasoning | any | false | none | Why the analysis classified it this way |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
VideoCreativeItem
{
"video_id": "string",
"title": "string",
"creator_handle": "string",
"tiktok_url": "string",
"video_gmv": 0,
"views": 0,
"like_count": 0,
"comment_count": 0,
"order_count": 0,
"posted_date": "string",
"rank": 0,
"creative": {
"analyzed": true,
"hook": {
"text": "string",
"classification": "string",
"reasoning": "string"
},
"sell_points": [
"string"
],
"product_niche": "string",
"shot_style": [
"string"
],
"videography": {
"locations": [
"string"
],
"lighting": [
"string"
],
"product_showcase": [
"string"
],
"notes": "string"
},
"missing_fields": [
"string"
]
}
}
VideoCreativeItem
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video_id | string | true | none | none |
| title | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_handle | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| tiktok_url | any | false | none | Canonical TikTok video permalink (the watch page): https://www.tiktok.com/@/video/. Null when the handle is unavailable. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video_gmv | any | false | none | GMV earned in the date range (not lifetime) |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| views | any | false | none | Views in the date range (not lifetime) |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| like_count | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| comment_count | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| order_count | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| posted_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| rank | integer | true | none | none |
| creative | VideoCreativeBreakdown | true | none | AI creative analysis of the video (customers.video_analysis). Not every video has been analyzed — when analyzed is false, or whenindividual fields are null, missing_fields names the gaps so clientscan render "not analyzed" instead of blanks. |
VideoCreativeVideography
{
"locations": [
"string"
],
"lighting": [
"string"
],
"product_showcase": [
"string"
],
"notes": "string"
}
VideoCreativeVideography
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| locations | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| lighting | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_showcase | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| notes | any | false | none | Free-text videography notes (older analyses store prose instead of structured fields) |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
VideoItem
{
"video_id": "string",
"creator_id": "string",
"title": "string",
"video_url": "string",
"tiktok_url": "string",
"creator_handle": "string",
"product_id": "string",
"product_name": "string",
"views": 0,
"like_count": 0,
"comment_count": 0,
"share_count": 0,
"units_sold": 0,
"video_gmv": 0,
"posted_date": "string"
}
VideoItem
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video_id | string | true | none | none |
| creator_id | any | false | none | Stable TikTok creator id for the video's author. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| title | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video_url | any | false | none | Thumbnail/preview image URL for the video (not the watch page). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| tiktok_url | any | false | none | Canonical TikTok video permalink (the watch page): https://www.tiktok.com/@/video/. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_handle | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| views | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| like_count | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| comment_count | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| share_count | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| units_sold | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video_gmv | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| posted_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
VideoLeaderboardRequest
{
"page": 1,
"page_size": 50,
"sort_by": "total_video_gmv",
"sort_dir": "asc",
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"product_ids": [
"string"
],
"min_gmv": 0
}
VideoLeaderboardRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| page | integer | false | none | none |
| page_size | integer | false | none | none |
| sort_by | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sort_dir | string | false | none | none |
| start_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_ids | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| min_gmv | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | total_video_gmv |
| anonymous | total_units_sold |
| anonymous | qualifying_video_count |
| sort_dir | asc |
| sort_dir | desc |
VideoLeaderboardResponse
{
"data": [
{
"creator_id": "string",
"creator_handle": "string",
"total_video_gmv": 0,
"total_units_sold": 0,
"qualifying_video_count": 0,
"products": [
{
"product_id": "string",
"product_name": "string",
"video_gmv": 0,
"units_sold": 0,
"video_count": 0
}
]
}
],
"currency": "string",
"pagination": null,
"date_range": {
"start_date": "string",
"end_date": "string"
},
"shops_queried": [
"string"
]
}
VideoLeaderboardResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | [LeaderboardCreatorItem] | true | none | [One creator's aggregated leaderboard row for the campaign window.] |
| currency | string | true | none | none |
| pagination | any | true | none | none |
| date_range | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | DateRange | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shops_queried | any | false | none | Shop names included when querying multiple shops (x-shop-id: all or comma-separated). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
VideoPerformanceItem
{
"video_id": "string",
"title": "string",
"creator_handle": "string",
"tiktok_url": "string",
"video_gmv": 0,
"views": 0,
"like_count": 0,
"comment_count": 0,
"order_count": 0,
"posted_date": "string"
}
VideoPerformanceItem
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video_id | string | true | none | none |
| title | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_handle | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| tiktok_url | any | false | none | Canonical TikTok video permalink (the watch page): https://www.tiktok.com/@/video/. Null when the handle is unavailable. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video_gmv | any | false | none | GMV earned in the date range (not lifetime) |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| views | any | false | none | Views in the date range (not lifetime) |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| like_count | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| comment_count | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| order_count | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| posted_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
VideoPerformanceRequest
{
"page": 1,
"page_size": 50,
"sort_by": "video_gmv",
"sort_dir": "asc",
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"creator_handle": "string",
"min_gmv": 0,
"min_views": 0
}
VideoPerformanceRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| page | integer | false | none | none |
| page_size | integer | false | none | none |
| sort_by | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sort_dir | string | false | none | none |
| start_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_handle | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| min_gmv | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| min_views | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | video_gmv |
| anonymous | views |
| anonymous | like_count |
| anonymous | order_count |
| anonymous | posted_date |
| sort_dir | asc |
| sort_dir | desc |
VideoPerformanceResponse
{
"data": [
{
"video_id": "string",
"title": "string",
"creator_handle": "string",
"tiktok_url": "string",
"video_gmv": 0,
"views": 0,
"like_count": 0,
"comment_count": 0,
"order_count": 0,
"posted_date": "string"
}
],
"currency": "string",
"pagination": null,
"date_range": {
"start_date": "string",
"end_date": "string"
},
"shops_queried": [
"string"
]
}
VideoPerformanceResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | [VideoPerformanceItem] | true | none | [Video with period-specific metrics from video_info (daily table).] |
| currency | string | true | none | none |
| pagination | any | true | none | none |
| date_range | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | DateRange | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shops_queried | any | false | none | Shop names included when querying multiple shops (x-shop-id: all or comma-separated). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
VideoProduct
{
"id": "string",
"name": "string"
}
VideoProduct
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
VideoRetention
{
"video_id": "string",
"video_url": "string",
"video_name": "string",
"video_duration_s": 0,
"publish_time": "2019-08-24T14:15:22Z",
"creator_handle": "string",
"creator_alias": "string",
"views": 0,
"impressions": 0,
"clicks": 0,
"ctr_rate": 0,
"watch_finish_rate": 0,
"likes": 0,
"comments": 0,
"shares": 0,
"new_followers": 0,
"gpm": 0,
"revenue": 0,
"currency": "string",
"products": [
{
"id": "string",
"name": "string"
}
]
}
VideoRetention
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video_id | string | true | none | none |
| video_url | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video_duration_s | any | false | none | Video length in seconds. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| publish_time | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date-time) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_handle | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_alias | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| views | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| impressions | any | false | none | Video exposure count (impressions). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| clicks | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| ctr_rate | any | false | none | Click-through rate, percent. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| watch_finish_rate | any | false | none | Video-completion rate, percent — the share of viewers who watched to the end. The organic hook-quality signal (TikTok exposes no 2-second view rate for organic videos, only completion). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| likes | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| comments | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shares | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| new_followers | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| gpm | any | false | none | Gross revenue per mille. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| revenue | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| currency | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| products | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [VideoProduct] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
VideoRetentionResponse
{
"data": [
{
"video_id": "string",
"video_url": "string",
"video_name": "string",
"video_duration_s": 0,
"publish_time": "2019-08-24T14:15:22Z",
"creator_handle": "string",
"creator_alias": "string",
"views": 0,
"impressions": 0,
"clicks": 0,
"ctr_rate": 0,
"watch_finish_rate": 0,
"likes": 0,
"comments": 0,
"shares": 0,
"new_followers": 0,
"gpm": 0,
"revenue": 0,
"currency": "string",
"products": [
{
"id": "string",
"name": "string"
}
]
}
],
"pagination": {
"total_count": 0,
"page": 0,
"page_size": 0,
"total_pages": 0
}
}
VideoRetentionResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | [VideoRetention] | true | none | [One video's retention / hook-quality metrics.] |
| pagination | public_api__core__pagination__PaginationMeta | true | none | Pagination metadata returned in responses. |
VideosCreativeCoverage
{
"videos_returned": 0,
"with_creative_analysis": 0
}
VideosCreativeCoverage
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| videos_returned | integer | true | none | none |
| with_creative_analysis | integer | true | none | none |
VideosCreativeRequest
{
"limit": 10,
"sort_by": "video_gmv",
"sort_dir": "asc",
"start_date": "2019-08-24",
"end_date": "2019-08-24"
}
VideosCreativeRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| limit | integer | false | none | none |
| sort_by | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sort_dir | string | false | none | none |
| start_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | video_gmv |
| anonymous | views |
| anonymous | like_count |
| anonymous | order_count |
| anonymous | posted_date |
| sort_dir | asc |
| sort_dir | desc |
VideosCreativeResponse
{
"data": [
{
"video_id": "string",
"title": "string",
"creator_handle": "string",
"tiktok_url": "string",
"video_gmv": 0,
"views": 0,
"like_count": 0,
"comment_count": 0,
"order_count": 0,
"posted_date": "string",
"rank": 0,
"creative": {
"analyzed": true,
"hook": {
"text": "string",
"classification": "string",
"reasoning": "string"
},
"sell_points": [
"string"
],
"product_niche": "string",
"shot_style": [
"string"
],
"videography": {
"locations": [
"string"
],
"lighting": [
"string"
],
"product_showcase": [
"string"
],
"notes": "string"
},
"missing_fields": [
"string"
]
}
}
],
"currency": "string",
"date_range": {
"start_date": "string",
"end_date": "string"
},
"coverage": {
"videos_returned": 0,
"with_creative_analysis": 0
},
"total_count": 0,
"message": "string",
"shops_queried": [
"string"
]
}
VideosCreativeResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | [VideoCreativeItem] | true | none | [Video performance row enriched with the creative breakdown.] |
| currency | string | true | none | none |
| date_range | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | DateRange | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| coverage | VideosCreativeCoverage | true | none | none |
| total_count | integer | true | none | Total videos with performance data in the window (not just the top N) |
| message | any | false | none | Set when there are no videos in the window (explicit empty state) |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shops_queried | any | false | none | Shop names included when querying multiple shops (x-shop-id: all or comma-separated). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
VideosListPaginatedResponse
{
"data": [
{
"video_id": "string",
"creator_id": "string",
"title": "string",
"video_url": "string",
"tiktok_url": "string",
"creator_handle": "string",
"product_id": "string",
"product_name": "string",
"views": 0,
"like_count": 0,
"comment_count": 0,
"share_count": 0,
"units_sold": 0,
"video_gmv": 0,
"posted_date": "string"
}
],
"currency": "string",
"pagination": null,
"date_range": {
"start_date": "string",
"end_date": "string"
},
"shops_queried": [
"string"
]
}
VideosListPaginatedResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | [VideoItem] | true | none | none |
| currency | string | true | none | none |
| pagination | any | true | none | none |
| date_range | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | DateRange | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shops_queried | any | false | none | Shop names included when querying multiple shops (x-shop-id: all or comma-separated). |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
VideosListRequest
{
"page": 1,
"page_size": 50,
"sort_by": "video_gmv",
"sort_dir": "asc",
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"creator_id": "string",
"creator_handle": "string",
"product_id": "string",
"product_ids": [
"string"
],
"min_gmv": 0,
"min_views": 0
}
VideosListRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| page | integer | false | none | none |
| page_size | integer | false | none | none |
| sort_by | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| sort_dir | string | false | none | none |
| start_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_date | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| creator_handle | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| product_ids | any | false | none | Restrict to these product ids (IN filter). Max 50. The single product_id filter still works and is ANDed if both are supplied. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | [string] | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| min_gmv | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| min_views | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
Enumerated Values
| Property | Value |
|---|---|
| anonymous | video_gmv |
| anonymous | views |
| anonymous | units_sold |
| anonymous | posted_date |
| anonymous | like_count |
| sort_dir | asc |
| sort_dir | desc |
ViewVideoContentRequest
{
"video_id": "string"
}
ViewVideoContentRequest
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| video_id | string | true | none | none |
WeeklyReportBody
{
"start_date": "2019-08-24",
"end_date": "2019-08-24"
}
WeeklyReportBody
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| start_date | any | false | none | First day of the window (inclusive). Defaults to 7 days before end_date. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| end_date | any | false | none | Last day of the window (inclusive). Must be at least 1 day in the past — today is never fully settled. Defaults to yesterday. |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string(date) | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
WeeklyReportData
{
"id": 0,
"shop_id": 0,
"shop_name": "string",
"customer_id": 0,
"start_date": "string",
"end_date": "string",
"currency_symbol": "$",
"affiliate_gmv": 0,
"affiliate_gmv_prev_week": 0,
"affiliate_gmv_pct_change": 0,
"gmv_per_video": 0,
"gmv_per_video_prev_week": 0,
"gmv_per_video_pct_change": 0,
"gmv_per_sample": 0,
"gmv_per_sample_prev_week": 0,
"gmv_per_sample_pct_change": 0,
"units_sold": 0,
"units_sold_prev_week": 0,
"units_sold_pct_change": 0,
"total_creators_reached": 0,
"total_sample_requests": 0,
"total_samples_approved": 0,
"creators_added_to_showcase": 0,
"dm_reply_rate": 0,
"tc_reply_rate": 0,
"email_open_rate": 0,
"email_reply_rate": 0,
"videos_posted": 0,
"videos_posted_prev_week": 0,
"videos_posted_pct_change": 0,
"video_views": 0,
"creators_posting_videos": 0,
"creators_converting": 0,
"creators_converting_prev_week": 0,
"creators_converting_pct_change": 0,
"videos_generating_sales": 0,
"creator_levels": {
"l0": 0,
"l1": 0,
"l2": 0,
"l3": 0,
"l4": 0,
"l5": 0,
"l6": 0,
"l7": 0
},
"top_products_by_gmv": [],
"top_products_by_units": [],
"top_products_by_sample_requests": [],
"top_products_by_approvals": [],
"top_products_by_conversions": [],
"top_products_by_growth": [],
"top_creators": [],
"top_videos": [],
"recommendations": []
}
WeeklyReportData
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| id | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | integer | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | integer | true | none | none |
| shop_name | string | true | none | none |
| customer_id | integer | true | none | none |
| start_date | string | true | none | none |
| end_date | string | true | none | none |
| currency_symbol | string | false | none | none |
| affiliate_gmv | number | true | none | none |
| affiliate_gmv_prev_week | number | true | none | none |
| affiliate_gmv_pct_change | number | true | none | none |
| gmv_per_video | number | true | none | none |
| gmv_per_video_prev_week | number | true | none | none |
| gmv_per_video_pct_change | number | true | none | none |
| gmv_per_sample | number | true | none | none |
| gmv_per_sample_prev_week | number | true | none | none |
| gmv_per_sample_pct_change | number | true | none | none |
| units_sold | integer | true | none | none |
| units_sold_prev_week | integer | true | none | none |
| units_sold_pct_change | number | true | none | none |
| total_creators_reached | integer | true | none | none |
| total_sample_requests | integer | true | none | none |
| total_samples_approved | integer | true | none | none |
| creators_added_to_showcase | integer | false | none | none |
| dm_reply_rate | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| tc_reply_rate | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| email_open_rate | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| email_reply_rate | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | number | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
continued
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| videos_posted | integer | true | none | none |
| videos_posted_prev_week | integer | true | none | none |
| videos_posted_pct_change | number | true | none | none |
| video_views | integer | true | none | none |
| creators_posting_videos | integer | true | none | none |
| creators_converting | integer | true | none | none |
| creators_converting_prev_week | integer | true | none | none |
| creators_converting_pct_change | number | true | none | none |
| videos_generating_sales | integer | false | none | none |
| creator_levels | CreatorLevelCounts | true | none | Creator counts by level |
| top_products_by_gmv | [TopProduct] | false | none | [Top product data] |
| top_products_by_units | [TopProduct] | false | none | [Top product data] |
| top_products_by_sample_requests | [TopProduct] | false | none | [Top product data] |
| top_products_by_approvals | [TopProduct] | false | none | [Top product data] |
| top_products_by_conversions | [TopProduct] | false | none | [Top product data] |
| top_products_by_growth | [TopProduct] | false | none | [Top product data] |
| top_creators | [TopCreator] | false | none | [Top creator data] |
| top_videos | [TopVideo] | false | none | [Top video data] |
| recommendations | [RecommendedAction] | false | none | [One recommended action shown in the Affiliate Report ("Affiliate Summary"). Generation is currently rule-based — items are pulled from the same top-N realtime queries the report itself uses, then templated into actionable copy ("Send more samples to these top creators", "Replicate these hooks in your next brief", "Prioritize sample budget for these products"). The Pydantic shape is deliberately generic so a future Gemini-backed implementation can swap in without FE / report-section changes — see the docstring on get_recommended_actions for the swap-point and how to wire the model call.] |
WeightableMetric
"gmv"
WeightableMetric
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| WeightableMetric | string | false | none | Metrics that can carry a weight in a weighted leaderboard.live_gmv is campaign-product-scoped LIVE GMV and combined_gmv isvideo GMV + that LIVE GMV as one dollar figure; a campaign weighting either must define product_ids (validated in LeaderboardPricing). |
Enumerated Values
| Property | Value |
|---|---|
| WeightableMetric | gmv |
| WeightableMetric | avg_views_per_post |
| WeightableMetric | views |
| WeightableMetric | videos_posted |
| WeightableMetric | units_sold |
| WeightableMetric | live_gmv |
| WeightableMetric | combined_gmv |
| WeightableMetric | sessions |
WeightedMetricItem
{
"metric_type": "gmv",
"weight": 100
}
WeightedMetricItem
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| metric_type | WeightableMetric | true | none | Metrics that can carry a weight in a weighted leaderboard.live_gmv is campaign-product-scoped LIVE GMV and combined_gmv isvideo GMV + that LIVE GMV as one dollar figure; a campaign weighting either must define product_ids (validated in LeaderboardPricing). |
| weight | integer | true | none | none |
WhoamiResponse
{
"customer_id": 0,
"shops": [
{
"shop_id": 0,
"shop_name": "string"
}
],
"shop_count": 0,
"scopes": [
"string"
],
"can_write": true
}
WhoamiResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| customer_id | integer | true | none | The account this key belongs to. |
| shops | [WhoamiShop] | true | none | Every shop this key can reach right now. Narrowed by the shop grant chosen at connect time, so it answers what this connection can see rather than what the account owns. |
| shop_count | integer | true | none | none |
| scopes | [string] | true | none | read always; read_write when the key may create and send. |
| can_write | boolean | true | none | Convenience mirror of read_write in scopes. |
WhoamiShop
{
"shop_id": 0,
"shop_name": "string"
}
WhoamiShop
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | integer | true | none | none |
| shop_name | any | false | none | none |
anyOf
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | string | false | none | none |
or
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| » anonymous | null | false | none | none |
WinningHook
{
"text": "string",
"lead": true
}
WinningHook
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| text | string | true | none | none |
| lead | boolean | true | none | none |
WriteErrorResponse
{
"error": {}
}
WriteErrorResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| error | object | true | none | none |
community__schemas__common__PaginationMeta
{
"page": 0,
"page_size": 0,
"total_count": 0,
"total_pages": 0
}
PaginationMeta
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| page | integer | true | none | none |
| page_size | integer | true | none | none |
| total_count | integer | true | none | none |
| total_pages | integer | true | none | none |
modules__discovery_agent__DiscoveryAgentModels__ProfileListResponse
{
"shop_id": 0,
"profiles": [
{
"id": 0,
"title": "string",
"description": "string",
"search_query": "string",
"filters": {},
"source": "string",
"is_active": true,
"vault_file_resource_id": 0,
"is_hidden": true,
"is_deleted": true,
"hide_unsafe": true,
"creator_count": 0,
"last_search_at": "2019-08-24T14:15:22Z",
"created_at": "2019-08-24T14:15:22Z",
"updated_at": "2019-08-24T14:15:22Z",
"deleted_at": "2019-08-24T14:15:22Z"
}
],
"has_profiles": true,
"total_profiles": 0
}
ProfileListResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| shop_id | integer | true | none | none |
| profiles | [ProfileData] | true | none | [Profile data structure] |
| has_profiles | boolean | true | none | none |
| total_profiles | integer | true | none | none |
modules__sample_requests__SampleRequestsV2Schemas__Pagination
{
"page": 0,
"perPage": 0,
"totalItems": 0,
"totalPages": 0
}
Pagination
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| page | integer | true | none | none |
| perPage | integer | true | none | none |
| totalItems | integer | true | none | none |
| totalPages | integer | true | none | none |
modules__sample_requests__SampleRequestsV2Schemas__ProfileListResponse
{
"data": [
{
"id": 0,
"name": "string",
"criteria": {
"minPostRate": 0,
"gmvRange": {
"min": 0,
"max": 0
},
"minViews": 0,
"minFollowers": 0
},
"linkedProducts": 0,
"createdAt": "string",
"updatedAt": "string"
}
]
}
ProfileListResponse
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| data | [ProfileItem] | true | none | none |
public_api__core__pagination__PaginationMeta
{
"total_count": 0,
"page": 0,
"page_size": 0,
"total_pages": 0
}
PaginationMeta
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| total_count | integer | true | none | none |
| page | integer | true | none | none |
| page_size | integer | true | none | none |
| total_pages | integer | true | none | none |
public_api__models__sc_official__Pagination
{
"page": 0,
"page_size": 0,
"stored_total": 0
}
Pagination
Properties
| Name | Type | Required | Restrictions | Description |
|---|---|---|---|---|
| page | integer | true | none | none |
| page_size | integer | true | none | none |
| stored_total | integer | true | none | Items stored for this snapshot and metric. |