Reacher Public API Reference — searchable (Ctrl/Cmd+F) Interactive reference ↗ openapi.json

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

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: toReviewreadyToShipshippedpendingContentcompleted, 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 (productIdusedThisMonth). 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:

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:

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:

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

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
Status Meaning Description Schema
200 OK Successful Response Inline

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:

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:

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

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.

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
Status Meaning Description Schema
200 OK Successful Response Inline
422 Unprocessable Entity Validation Error HTTPValidationError

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

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"
}
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"
  ]
}
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).

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

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"
}
Name In Type Required Description
body body WeeklyReportBody true none

Example responses

200 Response

{
  "shop_id": 0,
  "actions": []
}
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_statusnew_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:

summarybase_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

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.

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
      }
    }
  ]
}
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:

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_timeend_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

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
    }
  ]
}
Status Meaning Description Schema
200 OK Successful Response SharedDashboardListResponse

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
    }
  }
}
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
}
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

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
    }
  }
}
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
    }
  }
}
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

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.

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"
}
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 execution
engine today. The other portal-side enum values (budget_adjust,
material_status_update, etc.) are template-preview-only and will
not 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 a
value ?? '—' 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 the
FE 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 previous
time 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 derived
from 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 in
the 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 body
per 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 via
POST /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 one
email address — the vault_files.creator_emails JSONB column must be
non-empty. Targeting requires emails to send to. The route validates
this at create time and returns 400 LIST_MISSING_EMAILS for any
list 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 in
the 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. null
on 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 legacy
sample_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 text
that 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%), exactly
as 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 derived
from 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 in
the 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 derived
from 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 in
the 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 derived
from 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 in
the 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 block
inside a follow-up step. Polymorphic by type.

Per PR #1513 round-3 review (coderabbitai): each type has required
fields validated below. Without this, {"type": "image"} (no
image_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 for
delayed steps. Mirrors the runtime config shape (config.addons[]
vs config.FOLLOW_UP_STEPS[]) — the previous translator was
flattening follow-up addons into config.addons[] where the
runtime 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; the
portal 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 the
DB 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 supplied
on the request (the aggregate is window-scoped by design). None
on 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 earlier
than your end_date these totals under-count — or read 0 for a single
fresh 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-label
under 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 a
per-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 tab
and acting only there is what a brand expects. shop is the opt-in that
also 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 tab
and acting only there is what a brand expects. shop is the opt-in that
also 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. The
smuggling 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-only
toggles 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. The
smuggling 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-only
toggles 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 a
caller that round-trips a template through POST /automations is
not 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) and
the legacy symbol form (>=, <) are accepted — the controller
treats 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 Instagram
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, follower
count, 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, follower
count, 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, follower
count, 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, follower
count, 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, follower
count, 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, follower
count, 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, follower
count, 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, follower
count, 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 on
the 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, and
buildAISearchFilters for the AI-search variant). The translator
splits AI-only fields out into config.ai_search_filters and sets
config.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 the
webhook'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 against
the linked guild and takes display_name / avatar_url from Discord, so a
caller 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 a
malformed shape 400s at create time and can never blow up mid-dispatch.
paused deliberately lives in its own column (the claim predicate must
match 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 a
malformed shape 400s at create time and can never blow up mid-dispatch.
paused deliberately lives in its own column (the claim predicate must
match 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 the
field matching content_type is populated — for text drafts,
text_content is set and payload is {}; for image drafts
payload = {"image_url": "..."}; for product drafts
payload = {"product_id": "..."}. Keeping the response shape tight
means 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 tab
and acting only there is what a brand expects. shop is the opt-in that
also 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 TikTok
campaign/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 this
creative on this day: 2s / 6s are the share of impressions watched
for at least 2 / 6 seconds; p25p100 are the share that watched to
25 / 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 this
field 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 is
byte-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 is
byte-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) and
the legacy symbol form (>=, <) are accepted — the controller
treats 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 is
mandatory on every set_up_creative_boost automation (enforced
by AutomationCreateRequest.validate_total_budget_cap). The
remaining 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 the
micro-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 is
weight/100 × (raw_value / top_performer_raw × 100) — the points
this 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 the
list 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 the
list 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. The
smuggling 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. The
smuggling 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 modules
default 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, not
reconstructed from Reacher's send tables — the two cannot agree, because
used counts connections shop-wide. It therefore includes outreach NOT
sent 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 finance
export": no_permission means the shop's Seller Center account lacks
finance-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 finance
export": no_permission means the shop's Seller Center account lacks
finance-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 the
page. 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 finance
export": no_permission means the shop's Seller Center account lacks
finance-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 finance
export": no_permission means the shop's Seller Center account lacks
finance-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_profit
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.]
data_status PnlDataStatus true none Freshness and reachability of this shop's P&L data.

state distinguishes "no sales" from "we cannot read the finance
export": no_permission means the shop's Seller Center account lacks
finance-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 finance
export": no_permission means the shop's Seller Center account lacks
finance-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 finance
export": no_permission means the shop's Seller Center account lacks
finance-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
email 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; supply
weekly_auto_approval_per_product for the global per-product cap.
* include_all_products=False → enumerate selected_products with
per-product max_approvals_per_week caps.

Mirrors the legacy sample_request_config.products shape exactly so
FE-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's
asymmetric 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's
asymmetric 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 the
performance gate. Other fields ignored.
* enabled=True + always_approve_status set → auto-approve any
creator whose automation_status matches; bypass criteria.
* total_weekly_approved_sample_limit → hard ceiling on weekly
auto-approvals across all creators (not per-product).
* always_approve_from_lists_ids → approve members of these vault
lists 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; supply
weekly_auto_approval_per_product for the global per-product cap.
* include_all_products=False → enumerate selected_products with
per-product max_approvals_per_week caps.

Mirrors the legacy sample_request_config.products shape exactly so
FE-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's
asymmetric 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's
asymmetric 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 the
performance gate. Other fields ignored.
* enabled=True + always_approve_status set → auto-approve any
creator whose automation_status matches; bypass criteria.
* total_weekly_approved_sample_limit → hard ceiling on weekly
auto-approvals across all creators (not per-product).
* always_approve_from_lists_ids → approve members of these vault
lists 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 modules
default 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 modules
default 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
email 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.
email 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=False
2. Free samples + manual approval — offer_free_samples=True, auto_approve=False
3. Free samples + auto approval — offer_free_samples=True, auto_approve=True

offer_free_samples=False, auto_approve=True is also accepted but
rare 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 the
portal at TC create time; phone is optional. Persists at the legacy
config 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
email 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
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
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. Mirrors
TargetCollabContact exactly — kept as a separate class so the direct
surface'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
email 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.
{
  "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; the
portal 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 modules
default 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 when
individual fields are null, missing_fields names the gaps so clients
can 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 is
video 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 is
video 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.