Skip to main content
POST
WeChat Universal Search
WeChat Universal Search Pricing — billed per successful call; the final charge scales by your plan multiplier. Charged only when the upstream response body code is 200.
Response structure is not yet fully documented — refer to the actual API response.

Example

Authorizations

Authorization
string
header
required

AIsa API key. Get yours at https://aisa.one

Body

application/json
keyword
string
required

Search keyword, 1-100 characters after trimming. For account searches, use the account display name.

Required string length: 1 - 100
Example:

"People's Daily"

business_type
enum<string>
default:all

ai_search) are gated server-side per account & region and currently always come back empty (count=0 plus a no_more message — still billed as a normal call). Use the categories field of an all search for the authoritative per-account tab list. Values outside this list are rejected (422

Usage: Optional, default all. Vertical string key (18 total). Verified to return data: all / account / article / video / sticker. The rest (underline / encyclopedia / live_stream / comment / listen / news / photos / book / moments / image / mini_game / weixin_index / ai_search) are gated server-side per account & region and currently always come back empty. Any value outside this list is rejected (422).

Available options:
all,
account,
article,
video,
sticker,
underline,
encyclopedia,
live_stream,
comment,
listen,
news,
photos,
book,
moments,
image,
mini_game,
weixin_index,
ai_search
Example:

"account"

sort
default:default

Optional, default default. Sort (result page "sort" dropdown, common to all verticals) — default/0 (relevance) / latest/1 (newest) / hot/2 (most liked); string key or integer, invalid values rejected (400).

Example:

"hot"

publish_time
default:all

Optional, default all. Publish time (result page "time" dropdown, common) — all/0 / day/1 / week/2 / half_year/3; string key or integer, invalid values rejected (400).

Example:

"week"

offset
integer
default:0

Optional, default 0 (>=0). Pass 0 for the first page; use cursor to paginate — offset alone does not work (it returns the first page every time).

Required range: x >= 0
cursor
string | null

Optional. Pagination cursor. Leave empty for the first page; for the next page pass back the cursor returned in the previous response (repeat the same sort / publish_time), and use continue_flag to check whether there are more pages.

raw
boolean
default:true

True=raw search response; False=simplified parsed structure

Response

200 - application/json

Successful response. The outer object follows ResponseModel; the endpoint-specific payload is in data.

Return

  • Search result list (structure varies slightly by vertical)

Response structure & JSON Path

raw=false (simplified, snake_case):

  • Keyword echo: $.data.keyword
  • Effective vertical code (e.g. account=33554499): $.data.business_type
  • Total results: $.data.total — the maximum totalCount scanned across every box and subBox (a vertical's totalCount hangs off subBoxes; the All tab has no single total, so this is the largest contributing box). null on a zero-result page (no positive totalCount anywhere), so it is always null for the always-empty verticals
  • Has next page: $.data.continue_flag
  • Pagination cursor (pass back as the cursor parameter for the next page): $.data.cursor
  • Server-side offset (informational only; passing it back alone does not paginate): $.data.offset
  • Results on this page: $.data.count
  • Flattened result item list (items of all boxes / subBoxes merged): $.data.items[]
  • Server-issued vertical tab list (only present for business_type=all, null otherwise): $.data.categories[] — each entry has .type / .word / .extra_kvs. This is the authoritative list of verticals actually available to the serving account. Note .type is the vertical's integer code (e.g. 33554499) while this endpoint's business_type accepts only the 18 string keys above — an integer is rejected (422), so map it yourself (e.g. 33554499 → account).
  • Server wording for a zero-result page: $.data.no_more (present = a legitimate empty result from WeChat, not a failed call)
  • Single item (N is the index; fields vary by vertical; below is an account example):
    • Title (with <em> highlight): $.data.items[N].title
    • Description: $.data.items[N].desc
    • Document id: $.data.items[N].docID
    • Type name: $.data.items[N].accTypeName
    • Jump info: $.data.items[N].jumpInfo (.userName = gh_…, .nickName, .signature)
    • Video vertical items also carry exportId (+ jumpInfo.extInfo.feedNonceId) → see "Typical chains" above

raw=true (raw, default for this endpoint):

  • data top level: keyword / business_type / results (items are not flattened) / total / continue_flag / offset / cursor / categories / no_more (total / categories / no_more are top level in both modes — the key sets are aligned)
  • Full result set: $.data.results
  • Result box array: $.data.results.data[]; each box's results are in $.data.results.data[M].items[] and $.data.results.data[M].subBoxes[K].items[] — the items[] of raw=false is the flattened merge of these.
  • Has next page: $.data.continue_flag (top level for both raw=true / raw=false)
  • Pagination cursor: $.data.cursor — pass it back as the cursor parameter for the next page; $.data.offset is only the server-side offset and passing it back alone does not paginate
  • Read the total from the top level $.data.total (present in both raw modes) — it is the maximum of $.data.results.data[M].totalCount and $.data.results.data[M].subBoxes[K].totalCount; a vertical's number hangs off subBoxes, so reading only the top-level box's totalCount yields null
  • For result iteration, prefer raw=false (items already flattened) for cleaner paths.
code
integer
default:200

HTTP status code

request_id
string | null

Unique request identifier

message
string
default:Request successful. This request will incur a charge.

Response message (EN-US)

message_zh
string
default:请求成功,本次请求将被计费。

Response message (ZH-CN)

support
string
default:Discord: https://discord.gg/aMEAS8Xsvz

Support message

time
string

The time the response was generated

time_stamp
integer

The timestamp the response was generated

time_zone
string
default:America/Los_Angeles

The timezone of the response time

docs
string | null

Link to the API Swagger documentation for this endpoint

cache_message
string | null
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.

Cache message (EN-US)

cache_message_zh
string | null
default:本次响应已缓存,可通过下方 URL 直接查看,有效期 24 小时,访问缓存链接无额外费用。缓存仅用于请求溯源,不影响接口数据的时效性,也不会再次通过接口返回。

Cache message (ZH-CN)

cache_url
string | null

The URL to access the cached result

router
string
default:""

The endpoint that generated this response

params
any
default:{}

The parameters used in the request

data
any | null

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.