> ## Documentation Index
> Fetch the complete documentation index at: https://aisa.one/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# WeChat Channels Video Search

> WeChat Channels Video Search

WeChat Channels Video Search

**Pricing** — billed per successful call; the final charge scales by your plan multiplier. Charged only when the upstream response body `code` is `200`.

<Note>
  Response structure is not yet fully documented — **refer to the actual API response**.
</Note>

## Example

```bash theme={null}
curl -X POST "https://api.aisa.one/apis/v1/tikhub/wechat_search/v2/fetch_search_videos" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'  # see request schema below
```


## OpenAPI

````yaml openapi/tikhub.json POST /tikhub/wechat_search/v2/fetch_search_videos
openapi: 3.0.0
info:
  title: TikHub API
  description: >-
    Multi-platform social media data — Douyin, TikTok, Bilibili, Kuaishou,
    Weibo, Xiaohongshu, Zhihu, and commercial (Xingtu/Huahuo/Billboard)
    endpoints.
  version: 1.0.0
servers:
  - url: https://api.aisa.one/apis/v1
security:
  - bearerAuth: []
paths:
  /tikhub/wechat_search/v2/fetch_search_videos:
    post:
      tags:
        - TikHub - Wechat_search
      summary: WeChat Channels Video Search
      description: >-
        WeChat Search (v2). Pricing and billing notes describe the upstream
        provider. Use the AIsa price quote for gateway calls.


        ### Purpose

        - Search WeChat Channels videos specifically (`video` vertical), with
        the result page's "duration" filter, "relevance/newest/most-liked" sort,
        and "time" dropdown.

        - Equivalent to universal search `/tikhub/wechat_search/v2/fetch_search`
        (`business_type=video`) plus filters; all filters are verified to work.

        - ⏱️ Due to WeChat server latency, this endpoint responds slowly; please
        set your client request timeout to 30 seconds — a timeout that is too
        small may result in being billed without receiving the response.

        - ⚠️ Large-integer ID precision: IDs such as `docID` / `feedNonceId` in
        the response are 64-bit big integers beyond JavaScript's safe-integer
        range (2^53-1). Always receive / pass such IDs as **strings** (parse
        JSON with json-bigint or read them as text), never through JS `Number`.
        Swagger UI rounds the trailing digits of huge integers in its docs view
        — this is expected and does not affect the actual data returned by the
        API.


        ### Parameters

        - keyword: Search keyword (1-100 chars after trimming). For example,
        `food`

        - duration: Optional, default `all`. Duration tier (Channels video only)
        — `all`/0 / `short`/1 (<5min) / `medium`/2 (5-10min) / `long`/3
        (20min+); string key or integer, invalid values rejected (400).

        - sort: Optional, default `default`. Sort — `default`/0 (relevance) /
        `latest`/1 (newest) / `hot`/2 (most liked); string key or integer,
        invalid values rejected (400).

        - publish_time: Optional, default `all`. Publish time — `all`/0 /
        `day`/1 / `week`/2 / `half_year`/3; string key or integer, invalid
        values rejected (400).

        - offset: Optional, default 0 (>=0). Pass `0` for the first page; use
        `cursor` to paginate (offset alone does not work).

        - cursor: Optional. Pagination cursor, same usage as universal search
        `/tikhub/wechat_search/v2/fetch_search`. Leave empty for the first page;
        for the next page pass back the `cursor` from the previous response
        (repeat the same `duration` / `sort` / `publish_time`).

        - raw: Optional, default True. True=raw search response;
        False=simplified parsing.


        ### Return

        - Channels video search result list (same structure as the `video`
        vertical of universal search)


        ### Typical chains

        - 💡 The "account" option in the sort dropdown is **not a sort** — it
        switches to the official-account vertical; use universal search
        `/tikhub/wechat_search/v2/fetch_search` (`business_type=account`).

        - 💡 **To get Channels video detail (media download address /
        decode_key)**: video result items do **not** contain media directly —
        only `exportId` (+ `jumpInfo.extInfo.feedNonceId`). To download /
        decrypt: take `exportId` → call the Channels V2 endpoint
        `/tikhub/wechat_channels/v2/fetch_video_detail` (pass `export_id`) to
        get `media` (`url` / `url_token` / `decode_key`) and the plain
        `username`. Result fields and response structure are the same as
        `/tikhub/wechat_search/v2/fetch_search`.


        API references: `fetch_search` = `POST
        /tikhub/wechat_search/v2/fetch_search` (operationId:
        `post_tikhub_wechat_search_v2_fetch_search`); `fetch_video_detail` =
        `POST /tikhub/wechat_channels/v2/fetch_video_detail` (operationId:
        `post_tikhub_wechat_channels_v2_fetch_video_detail`).
      operationId: post_tikhub_wechat_search_v2_fetch_search_videos
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/FetchSearchVideosRequest'
        required: true
      responses:
        '200':
          description: >-
            Successful response. The outer object follows `ResponseModel`; the
            endpoint-specific payload is in `data`.


            ### Return

            - Channels video search result list (same structure as the `video`
            vertical of universal search)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponseModel'
components:
  schemas:
    FetchSearchVideosRequest:
      properties:
        keyword:
          type: string
          maxLength: 100
          minLength: 1
          title: Keyword
          description: Search keyword, 1-100 characters after trimming.
          example: food
        duration:
          anyOf:
            - type: integer
            - type: string
          title: Duration
          description: >-
            Duration filter for Channels videos: all/0 (default), short/1 (under
            5 minutes), medium/2 (5-10 minutes), long/3 (20 minutes or more).
            Accepts either a string key or integer; invalid values return HTTP
            400.
          default: all
          example: short
        sort:
          anyOf:
            - type: integer
            - type: string
          title: Sort
          description: >-
            Sort order: default/0=relevance (default), latest/1=newest,
            hot/2=most liked. Accepts either a string key or integer; invalid
            values return HTTP 400.
          default: default
          example: hot
        publish_time:
          anyOf:
            - type: integer
            - type: string
          title: Publish Time
          description: >-
            Publication-time filter: all/0 (default), day/1, week/2,
            half_year/3. Accepts either a string key or integer; invalid values
            return HTTP 400.
          default: all
          example: week
        offset:
          type: integer
          minimum: 0
          title: Offset
          description: >-
            Offset, default 0 and minimum 0. Use cursor for pagination; offset
            alone does not advance the result page.
          default: 0
        cursor:
          title: Cursor
          description: >-
            Pagination cursor, as in /tikhub/wechat_search/v2/fetch_search.
            Leave empty for the first page, then pass the previous response
            cursor verbatim while keeping duration, sort, and publish_time
            unchanged.


            API references: `fetch_search` = `POST
            /tikhub/wechat_search/v2/fetch_search` (operationId:
            `post_tikhub_wechat_search_v2_fetch_search`).
          nullable: true
          type: string
        raw:
          type: boolean
          title: Raw
          description: True=raw search response; False=simplified parsed structure
          default: true
      type: object
      required:
        - keyword
      title: FetchSearchVideosRequest
    ResponseModel:
      properties:
        code:
          type: integer
          title: Code
          description: HTTP status code
          default: 200
        request_id:
          title: Request Id
          description: Unique request identifier
          nullable: true
          type: string
        message:
          type: string
          title: Message
          description: Response message (EN-US)
          default: Request successful. This request will incur a charge.
        message_zh:
          type: string
          title: Message Zh
          description: Response message (ZH-CN)
          default: 请求成功，本次请求将被计费。
        support:
          type: string
          title: Support
          description: Support message
          default: 'Discord: https://discord.gg/aMEAS8Xsvz'
        time:
          type: string
          title: Time
          description: The time the response was generated
        time_stamp:
          type: integer
          title: Time Stamp
          description: The timestamp the response was generated
        time_zone:
          type: string
          title: Time Zone
          description: The timezone of the response time
          default: America/Los_Angeles
        docs:
          title: Docs
          description: Link to the API Swagger documentation for this endpoint
          nullable: true
          type: string
        cache_message:
          title: Cache Message
          description: Cache message (EN-US)
          default: >-
            This response is cached and accessible via the URL below for 24
            hours at no extra cost. The cache is for request tracing only — it
            doesn't affect the API's data freshness and won't be returned
            through the API again.
          nullable: true
          type: string
        cache_message_zh:
          title: Cache Message Zh
          description: Cache message (ZH-CN)
          default: >-
            本次响应已缓存，可通过下方 URL 直接查看，有效期 24
            小时，访问缓存链接无额外费用。缓存仅用于请求溯源，不影响接口数据的时效性，也不会再次通过接口返回。
          nullable: true
          type: string
        cache_url:
          title: Cache Url
          description: The URL to access the cached result
          nullable: true
          type: string
        router:
          type: string
          title: Router
          description: The endpoint that generated this response
          default: ''
        params:
          title: Params
          description: The parameters used in the request
          default: {}
        data:
          title: Data
          description: >-
            Endpoint-specific response payload. The official shared model does
            not declare a fixed type or field set. Use the operation's
            documented return fields or response example; an operation-specific
            schema, when present, describes the documented fields. Undocumented
            fields must be read from the actual response rather than assumed.
          nullable: true
      type: object
      title: ResponseModel
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: AIsa API key. Get yours at https://aisa.one

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.