---
title: "Shop sales by channel (creators, own videos, own lives, product page)"
method: POST
path: "/shop-performance/channels"
tags: ["Shop Performance"]
---

# Shop sales by channel (creators, own videos, own lives, product page)

`POST /shop-performance/channels`

## Request

- Base URL: `https://api.reacherapp.com/public/v1`
- URL: `https://api.reacherapp.com/public/v1/shop-performance/channels`
- Auth: API key in header `x-api-key` and API key in header `x-shop-id`

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.

## Request body

- SeriesRequest: Body for the two shop-performance series endpoints.
  - `preset` string, nullable: 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.
  - `start_date` string, date, nullable: Inclusive window start (YYYY-MM-DD).
  - `end_date` string, date, nullable: Inclusive window end (YYYY-MM-DD).
  - `granularity` 'day' | 'week': ``day`` returns one point per day; ``week`` sums Sunday-start weeks.

## Response `200`

Successful Response

- ShopChannelSplitSeriesResponse
  - `shop_id` integer, required
  - `currency_code` string, nullable: Null when the window mixes currencies; points carry their own.
  - `start_date` string, required
  - `end_date` string, required
  - `granularity` 'day' | 'week', required
  - `week_start` 'sunday'
  - `latest_available_date` string, nullable: Newest stored day for this shop, or null when nothing is stored.
  - `earliest_available_date` string, nullable: 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.
  - `is_complete` boolean, required
  - `points` ShopChannelSplitPoint[], required
    - `date` string, required: Bucket start (YYYY-MM-DD).
    - `date_end` string, required: Bucket end, inclusive (YYYY-MM-DD).
    - `days_expected` integer, required: Days of this bucket inside the window and on or before the settled day.
    - `days_observed` integer, required: Days with a stored row.
    - `is_complete` boolean, required: 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` string, nullable: ISO 4217 currency code. ``USD`` when present — the official TikTok API normalises all amounts to US dollars. ``null`` when the window has no data.
    - `gmv` number, nullable
    - `refunds` number, nullable
    - `other_gmv` number, nullable
    - `orders` integer, nullable: Per-product order lines (not unique checkouts). A single checkout with 3 SKUs counts as 3 here. Use ``ShopPerformancePoint.orders`` for the unique-checkout count.
    - `items_sold` integer, nullable
    - `product_impressions` integer, nullable
    - `product_clicks` integer, nullable
    - `add_cart_count` integer, nullable
    - `product_count` integer, nullable
    - `affiliate_gmv` number, nullable
    - `affiliate_orders` integer, nullable
    - `affiliate_clicks` integer, nullable
    - `affiliate_impressions` integer, nullable
    - `affiliate_video_gmv` number, nullable
    - `affiliate_video_clicks` integer, nullable
    - `affiliate_video_impressions` integer, nullable
    - `affiliate_live_gmv` number, nullable
    - `affiliate_live_clicks` integer, nullable
    - `affiliate_live_impressions` integer, nullable
    - `seller_video_gmv` number, nullable
    - `seller_video_orders` integer, nullable
    - `seller_video_clicks` integer, nullable
    - `seller_video_impressions` integer, nullable
    - `seller_live_gmv` number, nullable
    - `seller_live_orders` integer, nullable
    - `seller_live_clicks` integer, nullable
    - `seller_live_impressions` integer, nullable
    - `product_card_gmv` number, nullable
    - `product_card_orders` integer, nullable
    - `product_card_clicks` integer, nullable
    - `product_card_impressions` integer, nullable
    - `shop_tab_gmv` number, nullable
    - `shop_tab_sold_items` integer, nullable
    - `shop_tab_clicks` integer, nullable
    - `shop_tab_impressions` integer, nullable
    - `pages_fetched` integer, nullable
    - `is_walk_complete` boolean, nullable: Whether the collector's product walk covered every page.

## Other responses

- `422`: Validation Error

## Changes

> 76 revisions in range; 1 not diffed.

- **2026-09-09** `a5d66477ac03`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/reacherapp/apis/reacher-data-api/changes/shop-performance/channels/post.md)

---

[API](https://skmtc.dev/reacherapp/apis/reacher-data-api.md) - [All operations](https://skmtc.dev/reacherapp/apis/reacher-data-api/llms.txt) - [OpenAPI document](https://skmtc.dev/reacherapp/apis/reacher-data-api/revisions/63ce74b30b5a?raw)
