# Douyin trend-index keyword hot videos API

The Douyin trend-index keyword hot videos API returns the roughly 20 high-index videos Douyin's index tool puts forward for a keyword: caption, link, author's display name, likes, video index and category. One page only; the author's ID and the publication time are not given, the video endpoint has them. One call costs 2 credits ($0.004 to $0.0067 depending on the pack); failed calls are free. Call it over HTTP or from your AI client over MCP. Last tested 2026-10-17.

- Page: https://socialtoai.com/douyin-keyword-videos-api/
- Last updated: 2026-10-17
- Last tested: 2026-10-17

| Request | Price key | Credits |
| --- | --- | --- |
| `POST /v1/call/douyin.keyword_videos` | `douyin.keyword_videos` | 2 |

## Request

```bash
curl https://api.socialtoai.com/v1/call/douyin.keyword_videos \
  -H "Authorization: Bearer $SOCIALTOAI_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "query": "露营"
  }'
```

```python
import os
import requests

response = requests.post(
    "https://api.socialtoai.com/v1/call/douyin.keyword_videos",
    headers={"Authorization": f"Bearer {os.environ['SOCIALTOAI_KEY']}"},
    json={
        "query": "露营",
    },
)
print(response.json())
```

## Parameters

| Name | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `query` | string | Required | — | The keyword |

First page only: up to 20 items, with no cursor parameter and no next page.

## Response fields

| Field | Type | Meaning | Given |
| --- | --- | --- | --- |
| `items[].url` | string | A link that opens the item. | yes |
| `items[].format` | string | video, image, text or article. | yes |
| `items[].title` | string | The title. | always null: Douyin does not give it |
| `items[].text` | string | The body text or caption. | yes |
| `items[].published_at` | string | When it was published, ISO 8601 in UTC. | always null: Douyin does not give it |
| `items[].author.id` | string | The author's account ID. | always null: Douyin does not give it |
| `items[].author.username` | string | The author's handle. | always null: Douyin does not give it |
| `items[].author.name` | string | The author's display name. | yes |
| `items[].author.verified` | boolean | Whether the author is verified. | always null: Douyin does not give it |
| `items[].author.followers` | integer | The author's follower count. | always null: Douyin does not give it |
| `items[].metrics.likes` | integer | Likes. | yes |
| `items[].metrics.comments` | integer | Comments. | always null: Douyin does not give it |
| `items[].metrics.shares` | integer | Shares. | always null: Douyin does not give it |
| `items[].metrics.collects` | integer | Saves. | always null: Douyin does not give it |
| `items[].metrics.views` | integer | Views or plays. | always null: Douyin does not give it |
| `items[].metrics.reposts` | integer | Reposts. | always null: Douyin does not give it |
| `items[].images` | string[] | Image addresses. | always null: Douyin does not give it |
| `items[].hashtags` | string[] | Hashtags, without the #. | always null: Douyin does not give it |
| `items[].is_pinned` | boolean | Whether the author pinned it. | always null: Douyin does not give it |

Every item also has platform, id, ref, approx and type; the response around the items is the same on every call. [Response format](https://socialtoai.com/docs/api/response.md)

## Sample response

Sample data: names, links and text are replaced by placeholders; the numbers are as recorded.

```json
{
  "request_id": "req_00000000-0000-4000-8000-000000000001",
  "schema_version": "v1",
  "fetched_at": "2026-10-12T21:56:34.000Z",
  "action": "call",
  "op": "douyin.keyword_videos",
  "platform": "douyin",
  "status": "ok",
  "items": [
    {
      "platform": "douyin",
      "id": "…",
      "ref": "…",
      "approx": [],
      "type": "content",
      "url": "https://example.com/…",
      "format": "video",
      "title": null,
      "text": "…",
      "published_at": null,
      "author": {
        "id": null,
        "username": null,
        "name": "…",
        "verified": null,
        "followers": null
      },
      "metrics": {
        "likes": 1762741,
        "comments": null,
        "shares": null,
        "collects": null,
        "views": null,
        "reposts": null
      },
      "images": null,
      "hashtags": null,
      "is_pinned": null
    }
  ],
  "unavailable": ["title", "published_at", "author.id", "author.username", "author.verified", "author.followers", "metrics.comments", "metrics.shares", "metrics.collects", "metrics.views", "metrics.reposts", "images", "hashtags", "is_pinned"],
  "page": {
    "has_more": false
  },
  "warnings": [],
  "applied_params": {
    "query": "露营"
  },
  "cost_credits": 2,
  "billing": {
    "cost_credits": 2,
    "balance_credits": 98,
    "today_spend_credits": 2,
    "daily_limit_credits": null,
    "daily_remaining_credits": null,
    "display": "This call: 2 credits. Balance: 98 credits."
  },
  "replayed": false
}
```

## Paging and failures

- One call returns the first page only, up to 20 items, with no cursor, for 2 credits.
- A call that runs and finds nothing is a successful call: status is "empty", items is empty, and it costs 2 credits.
- 1 call per second per key, 5 after a purchase; going over is not charged. [Rate limits](https://socialtoai.com/docs/credits-and-billing.md#rate-limits)
- A failed call costs 0 credits and is never retried on its own. [Error codes](https://socialtoai.com/docs/api/errors.md)

## Ask your AI

- Get the roughly 20 high-index videos Douyin's index tool puts forward for a keyword: 露营. → `call {"op":"douyin.keyword_videos","query":"露营"}`, 2 credits

## More on Douyin

| Interface | What it does | Price key | Credits | Page |
| --- | --- | --- | --- | --- |
| `brand_radar` | Get the daily averages of a brand's search, content and spread indexes on Douyin over a date range, from the platform's own index tool, with the averages of every brand in its industry and of the industry's top 3, 5, 10, 15 and 30 to hold them against. | `douyin.brand_radar` | 2 | https://socialtoai.com/douyin-brand-radar-api.md |
| `keyword_audience` | Get who is behind a keyword on Douyin over a date range, from the platform's own keyword tool. | `douyin.keyword_audience` | 2 | https://socialtoai.com/douyin-keyword-audience-api.md |
| `keyword_history` | Get the day-by-day search index and composite index of a keyword on Douyin over a date range, from 巨量算数 (the Douyin index), with the daily averages of the period, of the one before and of a year earlier. | `douyin.keyword_history` | 4 | https://socialtoai.com/douyin-keyword-history-api.md |
| `brand_history` | Get a brand's day-by-day search, content and spread indexes on Douyin over a date range, from the platform's own index tool. | `douyin.brand_history` | 2 | https://socialtoai.com/douyin-brand-history-api.md |
| `keyword_related` | Get the keywords related to a keyword on Douyin in one week, from the platform's own keyword tool. | `douyin.keyword_related` | 2 | https://socialtoai.com/douyin-keyword-related-api.md |
| `index_topics` | Get the live topic board or the fastest-rising topic board of Douyin's index tool, about 30 entries each. | `douyin.index_topics` | 2 | https://socialtoai.com/douyin-index-topics-api.md |
| `search` | Find videos by keyword: text, author, likes, comment count and publish time. | `douyin.search` | 12 | https://socialtoai.com/douyin-search-api.md |
| `trending` | What is trending now: title, rank and heat. | `douyin.trending` | 2 | https://socialtoai.com/douyin-trending-api.md |
| `detail` | One video by ID or link: text, author, likes, comment count and publish time. | `douyin.detail` | 2 | https://socialtoai.com/douyin-detail-api.md |
| `comments` | The comments under one video: text, likes, reply count and time. | `douyin.comments` | 2 | https://socialtoai.com/douyin-comments-api.md |

## FAQ

**Do I need a Douyin account or Douyin's own API access?**

No. You only need a SocialToAI key. The call returns content and account information publicly visible on Douyin; you never sign in to Douyin or apply for anything there.

**Can I get the next page?**

No. On Douyin this interface gives its first page only (up to 20 items): the response carries no cursor, and page.has_more is always false.
