---
title: "Per-video GMV Max spend and performance (across campaigns)"
method: POST
path: "/gmv-max/videos/summary"
tags: ["GMV Max"]
---

# Per-video GMV Max spend and performance (across campaigns)

`POST /gmv-max/videos/summary`

## Request

- Base URL: `https://api.reacherapp.com/public/v1`
- URL: `https://api.reacherapp.com/public/v1/gmv-max/videos/summary`
- Auth: API key in header `x-api-key` and API key in header `x-shop-id`

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.

## Request body

- GmvMaxVideoSummaryRequest: POST /gmv-max/videos/summary — per-VIDEO GMV Max window totals for one shop, across campaigns (the Ads Manager creative export, without the export).
  - `start_date` string, date, nullable: Inclusive window start (YYYY-MM-DD). Defaults to 29 days before ``end_date``.
  - `end_date` string, date, nullable: Inclusive window end (YYYY-MM-DD). Defaults to yesterday.
  - `campaign_id` string, nullable: Restrict to a single GMV Max campaign.
  - `min_spend` number, nullable: Only videos whose window spend is at least this amount.
  - `sort_by` 'spend' | 'revenue' | 'orders' | 'roi' | 'cost_per_order' | 'ctr' | 'video_ctr' | 'last_active_date': Column to sort by.
  - `sort_dir` 'asc' | 'desc'
  - `page` integer
  - `page_size` integer

## Response `200`

Successful Response

- GmvMaxVideoSummaryResponse: POST /gmv-max/videos/summary.
  - `shop_id` integer, required
  - `currency` string, required: ISO currency code for the shop's region.
  - `start_date` string, required
  - `end_date` string, required
  - `data` GmvMaxVideoSummaryItem[], required
    - `video_id` string, required: TikTok video id (== creative material_id).
    - `campaign_ids` string[], required: Campaigns the video delivered in during the window.
    - `item_group_id` string, nullable: TikTok SPU / product id (join key to product datasets); null on older rows.
    - `posted_date` string, nullable: 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.
    - `creator_name` string, nullable: Creator handle, when the video is an affiliate video.
    - `title` string, nullable: Video caption, when known.
    - `spend` number, required: Window ad spend.
    - `revenue` number, required: Window gross revenue (GMV) attributed to the video.
    - `orders` integer, required: Window orders.
    - `cost_per_order` number, nullable: spend / orders over the window; null when no orders.
    - `roi` number, nullable: revenue / spend over the window; null when no spend.
    - `impressions` integer, required
    - `clicks` integer, required
    - `ctr` number, nullable: Impressions-weighted ad click-through rate over the window, percent (0–100).
    - `video_ctr` number, nullable: Impressions-weighted video (product) click-through rate over the window, percent (0–100).
    - `delivery_status` string, nullable: Latest TikTok creative_delivery_status seen in the window (e.g. DELIVERING, EXCLUDED).
    - `surface` string, nullable: Latest delivery surface bucket: product_card, affiliate or brand.
    - `first_active_date` string, required: First day in the window with a metric row.
    - `last_active_date` string, required: Last day in the window with a metric row.
    - `is_excluded` boolean, required: True when the video is on the shop's GMV Max exclusion list.
    - `exclusion_status` string, nullable: applied_status of the exclusion row when `is_excluded` is true.
  - `pagination` PublicApiCorePaginationPaginationMeta, required: Pagination metadata returned in responses.
    - `total_count` integer, required
    - `page` integer, required
    - `page_size` integer, required
    - `total_pages` integer, required

## Other responses

- `422`: Validation Error

## Changes

> 76 revisions in range; 1 not diffed.

- **2026-09-19** `291230805105`: 1 info
  - api operation id `gmv_max_videos_summary_gmv_max_videos_summary_post` removed and replaced with `gmv_max_videos_summary`
- **2026-09-12** `19eefbad93ec`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/reacherapp/apis/reacher-data-api/changes/gmv-max/videos/summary/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)
