---
title: "TikTok's suggested SEO words (search keywords) per product"
method: POST
path: "/product-insights/seo-keywords"
tags: ["Products"]
---

# TikTok's suggested SEO words (search keywords) per product

`POST /product-insights/seo-keywords`

## Request

- Base URL: `https://api.reacherapp.com/public/v1`
- URL: `https://api.reacherapp.com/public/v1/product-insights/seo-keywords`
- Auth: API key in header `x-api-key` and API key in header `x-shop-id`

The SEO words TikTok suggests for each of the shop's top live products, from the newest daily collection: pass ``product_ids`` (at most 50) or page through every product asked. A product the collector asked about that TikTok returned nothing for has ``asked: true`` and an empty ``words`` list; a product not asked has ``asked: false``. TikTok serves SEO words only for US, UK and Southeast Asian shops (``region_not_supported``).

``runs`` says what the collector has for each type — ``ok``, ``partial`` (TikTok had more than was paged through), ``collected_empty``, ``failed`` or ``not_collected`` — with ``latest_attempt_outcome`` for the newest attempt, so an empty ``data`` list always comes with its reason. Only the newest successful collection's rows are returned. Single-shop only. Returns 503 while the keyword tables are unavailable.

## Request body

- SeoWordsRequest: Body for ``/product-insights/seo-keywords``.
  - `product_ids` string[], nullable: These products only, in this order; every product asked when omitted (paged).
  - `limit` integer: Products per page without product_ids.
  - `page` integer: 1-based page.

## Response `200`

Successful Response

- ProductSeoWordsResponse
  - `shop_id` integer, required
  - `runs` SeoWordsRun[], required
    - `snapshot_date` string, nullable
    - `status` 'not_collected' | 'collected_empty' | 'partial' | 'failed' | 'ok' | 'region_not_supported', required: ``ok``: the newest stored collection. ``partial``: stored, but TikTok had more than the collector paged through. ``collected_empty``: collected, TikTok returned nothing. ``failed``: every attempt in the window failed. ``not_collected``: no attempt in the window — the last 35 days, or that day of the requested range. ``region_not_supported``: TikTok serves SEO words only for US, UK and Southeast Asian shops.
    - `latest_attempt_outcome` string, nullable: Outcome of the newest attempt, which may be newer than the data shown, e.g. ``failed`` after an earlier ``ok``.
    - `run_id` string, nullable
    - `coverage` SeoWordsRunCoverage
      - `products_requested` integer, nullable
      - `products_returned` integer, nullable
      - `products_with_words` integer, nullable: Products in the run with at least one word.
  - `data` ProductSeoWords[], required
    - `product_id` string, required
    - `asked` boolean, required: Whether the collector asked TikTok for this product.
    - `words` string[]: TikTok's suggested SEO words, in its order; empty when asked and none came back.
  - `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-10-21** `b98092453f76`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/reacherapp/apis/reacher-data-api/changes/product-insights/seo-keywords/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)
