> ## 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.

# Get WeChat Channels Video Detail

> Get WeChat Channels Video Detail

Get WeChat Channels Video Detail

**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_channels/v2/fetch_video_detail" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'  # see request schema below
```


## OpenAPI

````yaml openapi/tikhub.json POST /tikhub/wechat_channels/v2/fetch_video_detail
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_channels/v2/fetch_video_detail:
    post:
      tags:
        - TikHub - Wechat_channels
      summary: Get WeChat Channels Video Detail
      description: >-
        WeChat Channels (v2). Pricing and billing notes describe the upstream
        provider. Use the AIsa price quote for gateway calls.


        ### Purpose

        - Get the full detail of a WeChat Channels video (media address `media`
        + `decode_key`).

        - Three input options, **choose one, priority object_id > export_id >
        share_url**.

        - ⏱️ 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 `id` 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

        - object_id: Highest priority, optional. Video objectId (numeric), e.g.
        `14941130915890399732`. Obtainable from the video `id` of
        `fetch_user_videos` / `fetch_collection_videos`.

        - export_id: Second priority, optional. `exportId` from search results
        (must start with `export/`). Search results often only carry `exportId`
        without a plain object_id — pass export_id directly in that case (it
        expires, use it soon).

        - object_nonce_id: Optional. `feedNonceId` (numeric) from search
        results, pairs with the above to improve hit rate.

        - share_url: Last, optional. Channels share URL
        (`https://weixin.qq.com/sph/…`), e.g.
        `https://weixin.qq.com/sph/AH3sCoIPhH`. Used only when both object_id
        and export_id are empty.

        - raw: Optional, default True. True=raw response; False=simplified
        parsed structure (recommended for media download).

        - At least one of the three must be provided; `share_url` must be a
        Channels share URL (`https://weixin.qq.com/sph/…`).


        ### Return

        - Full video detail (including media download address and decryption
        key)


        ### Typical chain (from a video to the account / more videos)

        1. This endpoint `fetch_video_detail` → response contains plain `id`
        (objectId), `username` (`v2_…@finder`), `media` (`url` / `url_token` /
        `decode_key`)

        2. Feed the obtained `username` into → `fetch_channel_info` (account
        info / verification), `fetch_user_videos` (more videos of the account),
        `fetch_user_profile` (homepage stats), `fetch_video_comments` (comments
        of this video, using `id` from step 1)


        ### Response structure & JSON Path

        #### `raw=false` (simplified, recommended):

        - `data` is a single video object:
            - `id` (video objectId): `$.data.id`
            - `username` (`v2_…@finder`) / `nickname` / `title`: `$.data.username` etc.
            - Interaction counts: `$.data.read_count` / `.like_count` / `.fav_count` / `.forward_count` / `.comment_count`
            - Publish time / type / location: `$.data.create_time` / `$.data.object_type` / `$.data.location`
            - Media object: `$.data.media` (see download/decryption below)
        #### `raw=true` (raw):

        - Status code: `$.data.baseResponse.ret`

        - Hit receipt: `$.data.objectResponses[0].objectId` / `.exportId`

        - Video object (**note: plural `objects`**, camelCase):
        `$.data.objects[0]`

        - Mapping: flat fields of raw=false correspond to `objects[0]` of
        raw=true.


        ### Important Note (video download & decryption)

        - Accessing the `url` field directly may fail to open the video page —
        WeChat applies **anti-hotlinking** to Channels pages. Concatenate `url`
        and `url_token` into a complete URL, then open it in a browser / HTTP
        client. (Note: opening = HTTP 200, **does not mean playable**, the video
        file is encrypted.)

        - ⚠️ **Video Encryption Notice**: If the MP4 cannot be played, it is
        encrypted. Use the `decode_key` field from the response together with
        the encrypted video file to decrypt it.

        - ⚠️ **Important**: The WeChat API returns a **new encrypted file link
        and `decode_key` on every request**, even for the same video. Make sure
        the `decode_key` used for decryption and the downloaded encrypted file
        come from the **same API response**, otherwise decryption will fail.

        - JSON Path (by raw):
            - `raw=false` (recommended for media download) — `$.data.media` is a single object:
                - Video CDN link (without Token): `$.data.media.url`
                - Token of the video CDN link: `$.data.media.url_token`
                - Pre-concatenated full CDN URL (= `url` + `url_token`, ready to use): `$.data.media.full_url`
                - Video decryption key (different on every request): `$.data.media.decode_key`
            - `raw=true` — `$.data.objects[0].objectDesc.media[0]`:
                - Video CDN link (without Token): `$.data.objects[0].objectDesc.media[0].url`
                - Token: `$.data.objects[0].objectDesc.media[0].urlToken`
                - Full URL = `url` + `urlToken` (concatenate)
                - Video decryption key: `$.data.objects[0].objectDesc.media[0].decodeKey`
        - Online decryption tool:
        https://evil0ctal.github.io/WeChat-Channels-Video-File-Decryption/

        - Self-deployable decryption API (one-click Docker deployment):
        https://github.com/Evil0ctal/WeChat-Channels-Video-File-Decryption


        API references: `fetch_channel_info` = `POST
        /tikhub/wechat_channels/v2/fetch_channel_info` (operationId:
        `post_tikhub_wechat_channels_v2_fetch_channel_info`);
        `fetch_collection_videos` = `POST
        /tikhub/wechat_channels/v2/fetch_collection_videos` (operationId:
        `post_tikhub_wechat_channels_v2_fetch_collection_videos`);
        `fetch_user_profile` = `POST
        /tikhub/wechat_channels/v2/fetch_user_profile` (operationId:
        `post_tikhub_wechat_channels_v2_fetch_user_profile`);
        `fetch_user_videos` = `POST
        /tikhub/wechat_channels/v2/fetch_user_videos` (operationId:
        `post_tikhub_wechat_channels_v2_fetch_user_videos`);
        `fetch_video_comments` = `POST
        /tikhub/wechat_channels/v2/fetch_video_comments` (operationId:
        `post_tikhub_wechat_channels_v2_fetch_video_comments`).
      operationId: post_tikhub_wechat_channels_v2_fetch_video_detail
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/FetchVideoDetailRequest'
        required: true
      responses:
        '200':
          description: >-
            Successful response. The outer object follows `ResponseModel`; the
            endpoint-specific payload is in `data`.


            ### Return

            - Full video detail (including media download address and decryption
            key)


            ### Response structure & JSON Path

            #### `raw=false` (simplified, recommended):

            - `data` is a single video object:
                - `id` (video objectId): `$.data.id`
                - `username` (`v2_…@finder`) / `nickname` / `title`: `$.data.username` etc.
                - Interaction counts: `$.data.read_count` / `.like_count` / `.fav_count` / `.forward_count` / `.comment_count`
                - Publish time / type / location: `$.data.create_time` / `$.data.object_type` / `$.data.location`
                - Media object: `$.data.media` (see download/decryption below)
            #### `raw=true` (raw):

            - Status code: `$.data.baseResponse.ret`

            - Hit receipt: `$.data.objectResponses[0].objectId` / `.exportId`

            - Video object (**note: plural `objects`**, camelCase):
            `$.data.objects[0]`

            - Mapping: flat fields of raw=false correspond to `objects[0]` of
            raw=true.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponseModel'
components:
  schemas:
    FetchVideoDetailRequest:
      properties:
        object_id:
          title: Object Id
          description: >-
            Highest priority, optional. Video objectId (numeric), e.g.
            `14941130915890399732`. Obtainable from the video `id` of
            `fetch_user_videos` / `fetch_collection_videos`.


            API references: `fetch_collection_videos` = `POST
            /tikhub/wechat_channels/v2/fetch_collection_videos` (operationId:
            `post_tikhub_wechat_channels_v2_fetch_collection_videos`);
            `fetch_user_videos` = `POST
            /tikhub/wechat_channels/v2/fetch_user_videos` (operationId:
            `post_tikhub_wechat_channels_v2_fetch_user_videos`).
          default: ''
          example: '14941130915890399732'
          nullable: true
          type: string
          maxLength: 32
          pattern: ^[0-9]*$
        export_id:
          title: Export Id
          description: >-
            Second priority, optional. `exportId` from search results (must
            start with `export/`). Search results often only carry `exportId`
            without a plain object_id — pass export_id directly in that case (it
            expires, use it soon).
          default: ''
          nullable: true
          type: string
          maxLength: 2048
          pattern: ^(export/.+)?$
        object_nonce_id:
          title: Object Nonce Id
          description: >-
            Optional objectNonceId (numeric, improves hit rate


            Usage: Optional. `feedNonceId` (numeric) from search results, pairs
            with the above to improve hit rate.
          default: ''
          nullable: true
          type: string
          maxLength: 32
          pattern: ^[0-9]*$
        share_url:
          title: Share Url
          description: >-
            Last, optional. Channels share URL (`https://weixin.qq.com/sph/…`),
            e.g. `https://weixin.qq.com/sph/AH3sCoIPhH`. Used only when both
            object_id and export_id are empty.
          default: ''
          nullable: true
          type: string
          maxLength: 256
          pattern: ^(https?://weixin\.qq\.com/sph/[A-Za-z0-9]+/?)?$
        raw:
          type: boolean
          title: Raw
          description: >-
            True=raw response; False=simplified parsed structure (recommended
            for media download
          default: true
      type: object
      title: FetchVideoDetailRequest
    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.