---
title: "List product's videos"
method: POST
path: "/products/{product_id}/videos"
tags: ["Products"]
---

# List product's videos

`POST /products/{product_id}/videos`

## Request

- Base URL: `https://api.reacherapp.com/public/v1`
- URL: `https://api.reacherapp.com/public/v1/products/{product_id}/videos`
- Auth: API key in header `x-api-key` and API key in header `x-shop-id`

Videos featuring this product. By default a video matches on its primary product only, so a post that tags this product second is not returned; set `product_match: "any"` to match a product tagged anywhere on the post. Each video's full tagged set is in `products`.

## Path parameters

- `product_id` string, required

## Request body

- ProductVideosRequest: POST /products/{product_id}/videos request body.
  - `page` integer
  - `page_size` integer
  - `sort_by` 'video_gmv' | 'views' | 'units_sold' | 'posted_date' | 'like_count', nullable
  - `sort_dir` 'asc' | 'desc'
  - `start_date` string, date, nullable
  - `end_date` string, date, nullable
  - `product_match` 'primary' | 'any': How the product filter matches. 'primary' (default) tests only the video's primary product_id. 'any' matches a product tagged anywhere on the post, so multi-product videos are no longer missed — note a video tagging two products is then returned for BOTH, each time carrying its full video_gmv, so do not sum GMV across per-product queries under 'any'.

## Response `200`

Successful Response

- VideosListPaginatedResponse
  - `data` VideoItem[], required
    - `video_id` string, required
    - `creator_id` string, nullable: Stable TikTok creator id for the video's author.
    - `title` string, nullable
    - `video_url` string, nullable: Thumbnail/preview image URL for the video (not the watch page).
    - `tiktok_url` string, nullable: Canonical TikTok video permalink (the watch page): https://www.tiktok.com/@<handle>/video/<id>.
    - `creator_handle` string, nullable
    - `product_id` string, nullable: The video's primary tagged product. A creator can tag several products on one post; this is only the first of them. Read `products` for the full set.
    - `product_name` string, nullable
    - `products` TaggedProduct[]: Every product tagged on the video, primary first. A single-product video returns one entry matching product_id/product_name. Empty only when we hold no product for the video at all.
      - `product_id` string, nullable
      - `product_name` string, nullable
    - `views` integer, nullable
    - `like_count` integer, nullable
    - `comment_count` integer, nullable
    - `share_count` integer, nullable
    - `units_sold` integer, nullable
    - `video_gmv` number, nullable
    - `posted_date` string, nullable
  - `currency` string, required
  - `pagination` unknown, required
  - `date_range` DateRange
    - `start_date` string, nullable
    - `end_date` string, nullable
  - `shops_queried` string[], nullable: Shop names included when querying multiple shops (x-shop-id: all or comma-separated).

## Other responses

- `422`: Validation Error

## Changes

> 76 revisions in range; 1 not diffed.

- **2026-10-14** `2a7ed9f8c407`: 2 info
  - added the new optional request property `product_match`
  - added the optional property `data/items/products` to the response with the `200` status
- **2026-09-19** `291230805105`: 1 info
  - api operation id `product_videos_products__product_id__videos_post` removed and replaced with `product_videos`

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