This duck is a viral-hit work buddy prepared for new media / operations. You (AI agent) take a single DOUBAOYA_API_KEY,
and can, on behalf of the user,dig up viral topics, chase trends across the whole web, search content on the three major platforms, parse works, write opening scripts, and detect prohibited words——
all through https://doubaoya.com 's public API. The user doesn't need to touch any technical details; you handle calling the interfaces and assembling the results.
0. What you can help the user do (one-sentence version)
- Dig up topics: give a niche keyword, and it returns viral directions that are heating up.
- Chase trends: one request aggregates hot lists from multiple platforms and gives topic signals.
- Search content: search real works and articles on Douyin / Xiaohongshu / WeChat Official Accounts by keyword.
- View accounts: check the follower counts and work overviews of influencers / competitor accounts.
- Parse works: paste a public link, and it returns the normalized title, author, and engagement data.
- Save your skin: detect prohibited words before publishing, and return the annotated body text and riskcategory; hit words are located from the annotations, and replacements are provided by you based on the context.
- Write scripts: using the above data as material, you (the agent) synthesize the opening script / storyboard.
- Record into the second brain(
mera) —— ⛔ Discontinued, see the "Second Brain" subsection in §3.
0.5 Which capability should the user use? (choose by "what do I want to do")
This Skill is themain entry point / onboarding guide: one key connects to all of Doubaoya's capabilities. Users usually don't know which slugs exist, your (the agent's) job is tounderstand what the user wants to do → pick the right capability → call it → explain the results in plain language. Match them up using this "operations intent → capability" table:
WeChat Official Account request exception: whenever a request involves WeChat Official Accounts, first read
references/wechat-routing.json, then choose the Skill according to its priority. Minimalist principle:
to deliver a complete article (write + format + save draft), go through the writing delivery chain; for local QR code scanning, checking the latest / today by account, or pulling body text or historical archives, go through
MP Ark; for public data, engagement metrics, and topic analysis, go through Doubaoya's cloud capabilities.
"Help me write a WeChat Official Account article" exception: this is not a job one API can finish, it isa chain spanning 5 Skills——
wechat-hot-write(pull viral article samples + write body text) → wechat-title(title) / wechat-cover(cover) →
wechat-banned-words(compliance) → wechat-article-pipeline(formatting + cover + save into the user's own WeChat Official Account draft box)。
🔴 First ask clearly what end state the user wants, then decide which stop on the chain to go to: if they only want a finished draft, it ends once the body text is written;
if they wantformatted WeChat Official Account HTML or want thearticle in their own draft box, then you have to go all the way to wechat-article-pipeline.
Handing over a Markdown section and assuming that's the end is the most common way this chain gets cut off; conversely, if the user, once the draft is done, goes and writes to their own WeChat Official Account backend on their own,
that's equally wrong—wechat-article-pipeline has real side effects. If unsure, just ask.
Hop-by-hop navigation (which step to take after finishing this one) is handled by dby , which has the completepost-task navigation graph; make the handoff clear before passing it over.
If the user hasn't installed dby , continue on your own according to the chain above.
"My own stuff" exception — ⛔ this capability has been taken offline: when the request points to the user'sowncontent (help me note this down / my notes /
I said before / what kind of person am I), it used to go through mera second brain;this capability has been taken offline and can no longer be called(for the criteria and
failure conditions, see references/mera-routing.json 's retired field).
Truthfully tell the user this capability has been taken offline, and don't substitute public platform search for it—public search can't see the user's own notes,
it will only fob him off with strangers' content, which is worse than saying outright "this capability doesn't exist."
| The user says this (plain operations language) | Which type of capability to use | Typical starting move (full path, don't treat it as a slug to concatenate) |
|---|---|---|
| "What's trending across the web lately? Give me some topic ideas" | Comprehensive trending topic selection (direct retrieval without keywords + IP-based matching) | POST /api/apis/trend/trending-hub-keyword/call |
| "What's rising in my niche (e.g., fat-loss breakfast)?" | Platform viral content search | POST /api/skills/xiaohongshu-viral-notes/invoke, daily report sources for each platform (GET /api/apis search ai-feed) |
| "Why is this link viral? Break it down for me" | Work analysis | POST /api/apis/tool/parse-content-detail/call |
| "Help me review this copy, make sure it's not non-compliant" | Content safety | POST /api/skills/content-safety-check/invoke |
| "Get me an image" | Creation assistant | POST /api/skills/gpt-image-gen/invoke |
| "Rewrite this viral post into my copy" | Rewrite (purely local, no internet, no key needed) | Skill wechat-rewrite(WeChat Official Account) / xiaohongshu-rewrite(Xiaohongshu); if not installed, use searched materials and synthesize it yourself |
| "Help me write a WeChat Official Account article / after writing, format it and send it to drafts" | WeChat Official Account writing delivery chain(cross-Skill, not a single slug;ask about the end state first: just a finished draft vs. needs to go into the drafts box) | Skill wechat-hot-write → wechat-title / wechat-cover → wechat-banned-words → wechat-article-pipeline(only go to this stop if the drafts box is needed); for hop-by-hop navigation ask dby |
| "How to make a Xiaohongshu cover / first-image formulas / cover topic selection / come up with a Xiaohongshu title / help me break down this note / note breakdown / note benchmarking / benchmark analysis / topic breakdown / viral structure" | Xiaohongshu viral cover (first image) / title / note analysis · benchmark data | POST /api/apis/xiaohongshu/xiaohongshu-coze/call |
| "What are the 100k+ WeChat Official Account posts / original viral articles / original trending list / original hot articles list" | WeChat Official Account category time-period hot article list (100k+ / original) | POST /api/apis/gongzhonghao/category-time-hot/call |
| "What is the WeChat Official Account travel / short drama section publishing" | WeChat Official Account travel / short drama daily report source | POST /api/apis/gongzhonghao/gongzhonghao-playlet-feed/call |
| 🔴 "What's going viral on WeChat Channels lately / what's hot in AI (or XX) on WeChat Channels / WeChat Channels daily report / WeChat Channels topic selection" | WeChat Channels AI daily report source(High-engagement content clustering) | POST /api/apis/sph/shipinhao-ai-feed/call; to search content / accounts, go to /api/apis/sph/search-work、/api/apis/sph/search-user |
| "low-follower viral hits / ordinary-user viral hits / dark-horse notes / low-follower high-likes / small-account playbook / cold-start benchmarking" | Xiaohongshu low-follower viral hits ranking (topics that small accounts can also scale) | POST /api/apis/xiaohongshu/xiaohongshu-low-fans-top/call |
| "Xiaohongshu weekly ranking / weekly viral hits / weekly trends / mid-term topics" | Xiaohongshu weekly ranking (better than the daily ranking for setting mid-term topics) | POST /api/apis/xiaohongshu/xiaohongshu-weekly-top/call |
| "content going global / global viral hits / global daily report / global topics" | All-platform content going global Top ranking | POST /api/apis/multi/multi-content-export-top/call |
| "follow a certain account / keep an eye on a public account / subscribe to a public account / account post list / competitor post review" | Public account post list (pull posts by account and time period) | POST /api/apis/gongzhonghao/gongzhonghao-work-list/call |
| "top accounts / public account ranking / public account leaderboard / popularity index" | Public account popular accounts ranking | POST /api/apis/gongzhonghao/gongzhonghao-index-rank/call |
| "A-share public accounts / stock market influencers / stock public account ranking" | No single-item capability,three-step orchestration: search account → pull posts → find viral articles | POST /api/apis/gongzhonghao/gongzhonghao-search-user/call → .../gongzhonghao-work-list/call(or gongzhonghao-daily-publish)→ .../hot-article/call |
| "help me note this down / save to notes / check my notes / what kind of person am I" | ⛔ Second brain (mera) has been taken offline |
No replacement capability: truthfully state it has been taken offline,don't substitute public search for it(see the "my own stuff" exception above) |
Three sentences for first-time onboarding(when the user uses it for the first time, you can proactively guide them like this):
- First confirm whether there is a key (if not, walk them through §1 to get a key, just once).
- Ask "do you want to do topic selection, chase hot topics, or check accounts right now?" — narrow the vague need down to one of the categories above.
- Pick one capability and run it once to produce a result,let the user see something real, then guide them to the next step / subscription.
Don't dump a long list of slugs on the user right away — what the user wants is "do things for me", not an API catalog. Slugs are for your internal routing.
⚠️ The column above is paths, not slugs. The platform has two disjoint capability sets, going through two different routes (see §2.1); taking the tail segment of a path as a slug to assemble another route will inevitably 404. If unsure, run the discovery interface first (§4).
❌ Iron rule for topic selection: do not use the user's account name / IP name as a keyword to search. The user's public account/account name (such as "菜籽油") iswho he is(domain/persona/audience), not a search term — searching it will only find literally same-named content. For general hot topics, use the keyword-free hot ranking interface to fetch directly (
POST /api/apis/trend/trending-hub-keyword/call), the IP name is only used for matching and filtering. For general topic selectiondon't usecross-platform trend radar (/api/skills/trend-radar/invoke) or all-network hot ranking aggregation (/api/apis/trend/hot-topics/call) — they are feed-reposting accounts for keyword search, popularity is often empty, with many "unnamed content"; for general comprehensive hot topics always use trending-hub-keyword (keyword-free direct fetch).
1. Get the key (Auth)
Calling any interface requires carrying a key (API Key).
How to get the key:
- Open https://doubaoya.com → Log in
- Go to Key Center → Generate Key
- The full key is only fully revealed at the moment of generation, so copy and store it safely (in the form
dyh_…)。
How the agent uses the key:
- Read from the environment variable first:
DOUBAOYA_API_KEY。 - If it's not in the environment, thenask the user once, and once obtained, store it in the environment variable / local config,and don't ask again afterward。
- Never echo / print / write the full key into logs or chat. When confirmation is needed, only mention the prefix (e.g.
dyh_xxxx…)。
Include it with every request:
Authorization: Bearer $DOUBAOYA_API_KEY
2. How to call (unified conventions)
All public capabilities are mounted under https://doubaoya.com/api/... , JSON in, JSON out. The vast majority are POST;
a few dedicated routes use the PUT / GET,method, subject to the capability's own execution.target.method shall prevail(see §2.1).
⚙️ This section covers the conventions that are sufficient.Only when you're stuck at the protocol layershould you dig one level deeper: how exactly to choose between the two non-fallback routes, how to parse the unified envelope,
SKILL_NOT_FOUND/ENDPOINT_NOT_FOUND/DEDICATED_ROUTE/NO_RESULTwhat to do in each case, and the discipline of "pull the input spec fresh before calling, don't assemble it from memory or local docs"—all of that is indoubaoya-gateway. It only answershow to send out a single call, and does not carry business intent; for which capability the task itself should go through, see §3 anddby。
2.1 Calling an operation: discover first, then call according to execution.target call
The platform hastwo capability sets, each handling half, with no fallback between them:
| Set | Discovery interface | Call route | Magnitude |
|---|---|---|---|
| Productized Skill | GET /api/skills |
POST /api/skills/<slug>/invoke |
A dozen or so |
| Platform data capabilities | GET /api/apis |
POST /api/apis/<platform>/<slug>/call |
Seventy or eighty (the bulk in terms of quantity) |
This columnonly gives magnitude, not exact numbers: capabilities are added and also retired (retired entries are filtered out of the discovery interface), so the exact number is always based on the
totalfrom your actual pull of the discovery interface this time. Don't copy any particular number into your judgment.
🔴 These two routes are not two aliases of the same batch of capabilities, but two disjoint sets.
Using a data capability's slug to call /api/skills/<slug>/invoke always returns 404 SKILL_NOT_FOUND(the bulk in terms of quantity
—more than eighty percent of capabilities—are all on this side), and the reverse likewise returns 404 ENDPOINT_NOT_FOUND。Don't guess from memory which half a capability belongs to.
The only correct approach: get the capability object from the discovery interface (§4), directly read its execution.target, and call accordingly.
Every capability (same for both sets) carries a block like this:
"execution": {
"mode": "generic", // generic=通用调用代理 / dedicated=专用路由 / unavailable=当前不可调
"sideEffect": "read", // read / generate / write_internal / write_external
"target": { "method": "POST", "path": "/api/apis/trend/trending-hub-keyword/call" }
}
mode: "generic"→ send the request according totarget.method+target.path, and the body is that capability's input parameters.mode: "dedicated"→ likewise call according totarget, but it is a dedicated route,the method is not necessarily POST (e.g. the account charter isPUT /api/ip-profile/:id/charter). Mistakenly going through the generic/invokereturns 400DEDICATED_ROUTE, and the error message directly states which route to use.mode: "unavailable"(At this point there is notargetfield) → the capability is under maintenance or has been retired,don't call it; forcing a call returns 503CAPABILITY_UNAVAILABLE,availability.noteis a reason that can be relayed to the user.
target.path isthe full path, prepend https://doubaoya.com and you can send it;don't assemble it yourself
/api/skills/…—this is exactly how this document historically wrote off an entire side's data capabilities as guaranteed 404s.
POST https://doubaoya.com<execution.target.path>
Authorization: Bearer $DOUBAOYA_API_KEY
Content-Type: application/json
{ ...该操作的入参... }
2.2 Unified response envelope
Whether it succeeds or fails, the response is the same envelope layer:
// 成功
{ "success": true, "requestId": "req_...", "data": { /* 真正的结果 */ }, "error": null }
// 失败
{ "success": false, "requestId": "req_...", "data": null, "error": { "code": "...", "message": "..." } }
Always first look at success:true to get data,false read error.code / error.message。
A success envelope may also carry three optional fields (absence is the norm, don't treat it as an anomaly):
noResult:{ "code": "NO_RESULT", "message": "…" }。The query is valid, there's just no data found, this timenot billed. Don't treat it as a failure to retry, and don't treat it as "the API is broken"—truthfully tell the user there are no results, and suggest changing keywords / time range / filter conditions.notice: a notice that there's an update about this Skill,relay it to the user verbatim, it doesn't affect this result, no need to retry.detailUrl: the detail page link for this call's result on doubaoya.com, you can give it to the user to click.
2.3 How to handle error codes
| HTTP | error.code | Meaning | What you should do |
|---|---|---|---|
| 401 | MISSING_API_KEY |
No key provided | Tell the user to generate one at the doubaoya.com key center, and set it into DOUBAOYA_API_KEY |
| 401 | UNAUTHORIZED |
key invalid / revoked | Have the user go to thekey centerrevoke andregenerate, update the environment variable |
| 400 | VALIDATION_ERROR |
Invalid input parameters | Look at message to fix the input parameters (e.g. missing keyword) |
| 400 | DEDICATED_ROUTE |
This capability has a dedicated route, you used the generic proxy | message says which one to call; resend according to execution.target (§2.1) |
| 402 | INSUFFICIENT_CREDITS |
Insufficient quota | Tell the user to top up their quota at doubaoya.com |
| 404 | SKILL_NOT_FOUND |
This slug is not in the skills set | See "How to break a 404" below |
| 404 | ENDPOINT_NOT_FOUND |
This platform/slug is not in the apis set | See "How to break a 404" below |
| 503 | CAPABILITY_UNAVAILABLE |
Capability under maintenance / delisted (execution.mode is unavailable) |
Don't retry: switch to another capability, or truthfully tell the user this capability is temporarily unavailable |
| 502 | PROVIDER_FAILED |
Upstream temporary failure (quota automatically refunded) | Retry later; no need to top up quota before retrying |
Tip:
PROVIDER_FAILEDthe quota is automatically refunded, so just retry with peace of mind, don't worry about being double-charged.
How to break a 404(🔴 Don't just retry the same route in different ways on the spot—the two routes query two disjoint sets, and trying a hundred times on the wrong half will still be a 404):
- Query both sets:
GET /api/skillsandGET /api/apis(§4). Eight times out of ten the capability is in the other half, and the wrong route was chosen. - Use
GET /api/skills/search?query=…orPOST /api/skills/recommendto search by intent (only covers the skills side). - Once foundcall according to its
execution.target.pathHit, don't assemble the path yourself. - Not in either set → this capabilitydoes not exist(or has been delisted). Tell the user truthfully, stop guessing other slugs.
⚠️ The slug you remember in your head / in this document is only astarting clue; whether it can be called and how to call it depends on what the discovery interface returns. In particular, don't treat theskill package directory name(
npx skills addthe folder name it was installed into, e.g.trending-hub、content-parse、douyin-search) as the invocation slug—theyare not, and calling them will definitely return 404.
3. Common capability starter table (paths verified, slug is not the directory name)
The table below givescomplete invocation paths, not "slugs"—because which route a capability takes depends on which collection it is in (§2.1). Every entry in the table has been checked against the platform catalog and can be called directly.
🔴 This table is only a starting clue, not a checklist. The platform currently has 100 capabilities (17 skills + 83 apis), only about a dozen of the most commonly used ones are listed here. For the full set, the latest, and accurate input parameters,pull them at runtime with the discovery interface(§4)。
Comprehensive trending topics (direct fetch without keywords + combined with IP matching)
For topic selection, thecorrect starting move: first fetch comprehensive trending topics directly without keywords, then combine with the user's IP to locate intelligent matches.Don't use the account name/IP name as a keyword.
| Capability | How to call (complete path) | Key input parameters |
|---|---|---|
| Comprehensive trending direct fetch(preferred):without keywordspull the current hottest batch across the web (Weibo/Douyin/Bilibili) | POST /api/apis/trend/trending-hub-keyword/call |
{ "platforms": [2,5,8] }(don't pass keywords) |
| Web-wide hot search keywords(seed, optional): output a batch of hot words + their platforms, used as seeds for topic names | POST /api/apis/trend/hot-keywords/call |
{}(don't include dates: the upstream only provides the latest batch, including a date range will definitely return 0 results) |
| Chinese social media discussions in the last 30 days: cross-platform public opinion trends for a certain word (this is "look up a word", not general topic selection) | POST /api/skills/cn-last30days/invoke |
{ "keyword", "days": 30, "platforms": ["xiaohongshu","douyin"] } |
⚠️ General comprehensive trendingdon't usecross-platform trend radar (
POST /api/skills/trend-radar/invoke) or web-wide hot list aggregation (POST /api/apis/trend/hot-topics/call)—they are feed reposters for keyword search (heat is oftennull, and many are "unnamed content"), only consider them in the narrow scenario where you explicitly want to "search a content feed with the same name by a certain word".
Search content (various platforms)
| Capability | How to call (complete path) | Key input parameters |
|---|---|---|
| Xiaohongshu viral note discovery: high-interaction notes | POST /api/skills/xiaohongshu-viral-notes/invoke |
{ "keyword", "page"? } |
| Douyin work search: batch search Douyin works by keyword, lay out a table for topic selection | POST /api/apis/douyin/search-work/call |
{ "keyword", "page"? } |
| WeChat Official Account information source(short drama track example): popular article daily report | POST /api/skills/playlet-wechat-feed/invoke |
{ "keyword", "dateRange"?, "minReadCount"? } |
| WeChat Channels information source: high-heat work clustering daily report | POST /api/skills/wechat-channels-ai-feed/invoke |
{ "keyword", "limit"?, "minLikeCount"? } |
Xiaohongshu / Douyin / WeChat Official Account / WeChat Channels / Bilibili / Kuaishou / TikTok search, accounts, rankings, and daily report sources add up to more than 80, all in
GET /api/apis.To find a certain kind of data for a certain platform, go look there first; don't give up just because you can't find it in this short table.
Parsing / Compliance / Assets
| Capability | How to call (full path) | Key input parameters |
|---|---|---|
| Multi-platform prohibited-word detection: hit annotation + risk category | POST /api/skills/content-safety-check/invoke |
{ "platform", "content" } |
| Work / article parsing: paste a public link, get normalized details back, break down "why it went viral" | POST /api/apis/tool/parse-content-detail/call |
{ "url" } |
| AI image generation / editing: produce accompanying images, assets, cover images | POST /api/skills/gpt-image-gen/invoke |
{ "prompt", "size"? }(slow operation, wait for the result within a single request) |
⛔ Second Brain (mera · delisted, don't call)
mera The six capabilities under the platform (note-write / note-status / note-search / source-read / ask / self)
already delisted, this section only explains why, and what you should do—call paths are deliberately no longer listed, to avoid you copying them。
Why(historical fact, you may verify it yourself): the Second Brain's backend service stayed on the old machine along with 2026-08-10 's server migration and entered the decommissioning process; it does not exist in the production environment; the DNS record for the domain mera.doubaoya.com has been removed (dig returns NXDOMAIN).
What happens when you call: you will never get a result—either it is stopped by the availability gatebefore points are deductedand returns 503 CAPABILITY_UNAVAILABLE
(no billing at all), or it can't connect and returns 502 PROVIDER_FAILED(deducted points are automatically refunded). Neither path will wrongly deduct the user's points, but retrying, changing keys, or changing parameters is meaningless.
⚠️ Don't use the discovery interface as the criterion, in either direction: these 6 have been marked as delisted (hidden); the discovery interface will filter delisted entries out of
GET /api/apis,GET /api/apis/mera/<slug>and "doesn't exist at all" are both 404; while deployments earlier than this marking will still list them as before (with prices). So when you pull the list per §4,you may or may not see them, the conclusion in both cases is exactly the same:"being in the list" does not mean "it can be called", and "no longer in the list" does not mean "try again later". The criterion is this section, not the list.⚠️ There is no replacement capability, and downgrading is not allowed: the Second Brain contains the user'sownprivate notes. All the "looking outward" public platform capabilities in this document cannot see it—using public search to answer "what did I say before" is equivalent to passing off a stranger's content as the user's own memory.Truthfully inform that the capability has been delisted, then ask the user whether they want to do something else instead.
♻️ When this conclusion becomes invalid:
dig mera.doubaoya.comno longer returns NXDOMAIN, andmera's capability can actually return data (rather than 503 / 502), this section is expired and the call contract should be written back.
4. Runtime discovery of operations (don't hardcode the list)
The platform may add new operations at any time;prefer pulling the list at runtime, then decide which one to call.
🔴 There are two discovery surfaces, and you must pull both. only pulls /api/skills you only see the smaller half, and the other side (the majority in number) simply does not exist in your world—It won't throw an error, it will just silently lose more than half its capabilities.
This is exactly the mistake this document made in the past.
# ① 产品化 Skill
GET https://doubaoya.com/api/skills → data: { items, total }
GET https://doubaoya.com/api/skills/<slug> → data: 单条详情(不存在 / 已下架同为 404)
GET https://doubaoya.com/api/skills/search?query=选题&category=数据查询&limit=12
→ data: { items, total, categories, query, category }
POST https://doubaoya.com/api/skills/recommend body: { "query": "帮我找选题", "category"?: "全部", "limit"?: 6 }
→ data: { primary, candidates, decisionSummary, signals }
# ② 平台数据能力(数量上的大头,别漏)
GET https://doubaoya.com/api/apis → data: { items, total }
GET https://doubaoya.com/api/apis/<platform>/<slug> → data: 单条详情
platform Current values:douyin / xiaohongshu / gongzhonghao / sph(Video Channels) / bilibili /
kuaishou / tiktok / trend / tool / multi / mera(⛔ delisted, cannot be called; whether it shows up in the list is not the criterion either, see §3).
What's in each entry:
| Field | skills | apis | Description |
|---|---|---|---|
slug |
✓ | ✓ | apis also has one more platform, it takes both together to locate one |
title / summary / tags |
✓ | ✓ | Determines whether to use it |
unitPrice |
✓ | ✓ | The points to be deducted for this call (¥1 = 100 points) |
| Input example | inputSchema |
requestSchema |
⚠️ is a set of example values, not a JSON Schema—pass according to its key names and value shapes |
| Output example | outputExample |
responseExample |
Same as above, used to align which fields you want to read |
execution |
✓ | ✓ | 🔑 execution.target.path is the complete call path for this capability(see §2.1) |
availability |
Optional | Optional | Its presence indicates it is under maintenance (status: "maintenance" + note), combined with execution.mode === "unavailable" |
category(only skills has it) no need to memorize,GET /api/skills/search the response of comes with a real-time categories array.
A few notes from actual testing:
- Four
GETdiscovery endpointsdo not need a key to pull (but including one doesn't hurt). POST /api/skills/recommendBe sure to include theAuthorizationheader: it itself does not verify identity, but a POST without a Bearer header will be blocked as 403 by cross-site protectionCSRF_FORBIDDEN。querybeing empty will 400INVALID_PARAMS。recommend/searchonly sorts on the skills side, it cannot see the apis side. Using it as "when unsure, ask first" is fine,don't treat it as a full catalog—the full one is inGET /api/skills+GET /api/apisthe two entries.- Delisted capabilities will not appear in any discovery endpoint (not being in the list ≠ you searched wrong, it really isn't there).
5. Real call examples (parameterized, no keys)
curl
# 综合热点直取:不带关键词,把当下全网最热的一批拉下来
curl -sS https://doubaoya.com/api/apis/trend/trending-hub-keyword/call \
-H "Authorization: Bearer $DOUBAOYA_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "platforms": [2, 5, 8] }'
Successful response (some envelope fields omitted; entries are often grouped in wbList/dyList/bzList):
{
"success": true,
"requestId": "req_abc123",
"data": {
"wbList": [ { "title": "样例热点", "hotCount": 98231, "index": 1, "url": "https://…" } ],
"dyList": [ /* … */ ],
"bzList": [ /* … */ ]
},
"error": null
}
Node (zero-dep, key read from environment variables)
const key = process.env.DOUBAOYA_API_KEY;
if (!key) throw new Error("先设好 DOUBAOYA_API_KEY:doubaoya.com → 登录 → 密钥中心 → 生成密钥");
const res = await fetch("https://doubaoya.com/api/skills/xiaohongshu-viral-notes/invoke", {
method: "POST",
headers: { "Authorization": `Bearer ${key}`, "Content-Type": "application/json" },
body: JSON.stringify({ keyword: "减脂早餐", page: 1 })
});
const env = await res.json();
if (!env.success) throw new Error(`${env.error.code}: ${env.error.message}`);
console.log(env.data.items);
The repository includes a zero-dependency wrapper:
scripts/doubaoya.mjs, see §7.
6. End-to-end example workflow
Workflow A: "What topics should my account (e.g., a WeChat Official Account named X) do today?"
Core:Fetch comprehensive hot topics directly with no keywords → intelligently match based on this IP's positioning → produce topics。 ❌ Neveruse the user's account name/IP name as keywords to search (that will only find literally same-named content).
- Fetch comprehensive hot topics directly (no keywords):
POST /api/apis/trend/trending-hub-keyword/call{ "platforms": [2,5,8] }(don't pass keywords) → get the current hottest batch across the whole internet (wbList/dyList/bzList, seehotCount/index/url)。 - Clarify IP positioning: the user's account name/IP name iswho he is(domain/persona/angle/audience), not a search term. Get this positioning from the user or their identity profile;if unclear, ask the user。
- Intelligent matching: scan the comprehensive hot list, pick out 2–3 hot topics that this IP cancredibly leverage(
hotCountHigh + cross-platform hit-list + IP fit), for each one give this IP'sexclusive angle; when necessary usexiaohongshu-viral-notes/*-ai-feedto verify "it's really blowing up." - Write opening script: based on the selected hot topics + the IP's exclusive angle, write for each topic a 3-second opening hook + a segment of opening script(don't write emptily, detached from the data).
- Safety check: throw the script into
POST /api/skills/content-safety-check/invoke{ "platform": "douyin", "content": "<脚本>" }— it returnscontent(annotated version) /originalContent(original text) /prohibitedWordsType(risk category); the matched words are located from the annotations incontent, and replacement suggestions are given by you based on context. 🔴 When none of these three fields can be read, honestly say "no detection result was obtained"—don't treat it as a compliance pass. - Deliver topics: 3–5 topics (each: which hot topic to ride + my IP's exclusive angle + why it can blow up now) + their respective opening scripts + already passed the prohibited-word check.
- Turn the topic into an article(when what the user wants is aWeChat official account articlerather than a short-video script, there is still a path after step 6):
select one topic →
wechat-hot-writepull viral article samples on the same theme to write the body →wechat-titlecome up with titles /wechat-coverdetermine the cover formula →wechat-banned-wordsproduce a review-passing version of the body →wechat-article-pipelineformat + add cover + save into the user's own WeChat official account draft box(only save as draft, never mass-send).🔴 How far to go is determined by the end state the user wants: if they only want topics and scripts, step 6 is the endpoint; if they want a finished draft, it ends once the body is written; if they wantformatted WeChat official account HTML or want thearticle in their own draft box, then go all the way to
wechat-article-pipeline(it will write into the user's own WeChat official account backend; don't run it for him when he hasn't mentioned this intention). Leave step-by-step navigation todby。
Workflow B: "Why did this Douyin/Xiaohongshu link go viral? Give me reusable topic angles"
- Parse the work:
POST /api/apis/tool/parse-content-detail/call{ "url": "<分享链接>" }→ get the title, author, and interaction data. - Find same-topic heat: use the core words in the title to call
POST /api/skills/xiaohongshu-viral-notes/invokeor the corresponding platform's daily report source (GET /api/apissearchai-feed), see whether this angle is rising at the track level (this step isexplicitly checking evidence by a certain word, different from the generic topic selection's keyword-free direct pull from the hot list). - Output: break down "why it went viral" (topic angle / hook / timing), then give 2-3reusable topics from the same source。
7. Optional: zero-dependency wrapper script
The repository includes scripts/doubaoya.mjs(Node 18+, no third-party dependencies, key read from DOUBAOYA_API_KEY ):
# 运行时发现(两个集合都拉,不需要 key)
node scripts/doubaoya.mjs list # 两个集合一起拉,每行直接给出完整调用路径
node scripts/doubaoya.mjs list --apis # 只看平台数据能力
node scripts/doubaoya.mjs search 小红书 爆款 # 两个集合一起搜
node scripts/doubaoya.mjs describe trending-hub-keyword
# 调一条能力:<ref> = <slug> 或 <platform>/<slug>
node scripts/doubaoya.mjs invoke xiaohongshu-viral-notes '{"keyword":"减脂早餐","page":1}'
node scripts/doubaoya.mjs invoke trend/trending-hub-keyword '{"platforms":[2,5,8]}'
# 离线自检(不联网、不需要 key)
node scripts/doubaoya.mjs selfcheck
What it does:first parse <ref>(for a bare slug, check the skills collection first; if not found, then look in the apis collection; same name across platforms will require you to write the full
<platform>/<slug>),get that capability's execution.target and then send the request accordingly—don't assemble paths yourself, so both collections
are reachable, and a dedicated route's PUT/GET won't be forced into a POST either. The rest: assemble Authorization header, open the envelope,
put notice / noResult to stderr,success=false with code: message to exit.never print the whole key.
⚠️ When a certain capability cannot be found, it will state plainly "both sets have been checked" and remind you that you may have askill package directory name— don't keep retrying the same route in different ways.
7.5 Delivery receipt (bring one along with every delivery)
If you only try to recall when the user later asks "which capabilities / which skills did you just use," whatever you answer will inevitably be inaccurate— the receipt is written at delivery time, not made up afterward. It makes your routing reviewable, and lets the user see which path has not been taken.
Declare the final state first, then choose capabilities
Before starting, first state clearly which level this delivery is meant to reach,stop at whichever level the goal stops at. The final states of the writing chain are a staircase (same wording as §0.5):
① Markdown finished draft → ② formatted WeChat official account HTML → ③ saved into the user's own WeChat official account drafts
When the user only wants ①,not running wechat-article-pipeline is correct behavior, not a missed run—that step would write into the user's own
WeChat official account backend, with real side effects. Conversely, if the user wants ③ but you stop after delivering a Markdown section, that is a severed head. If unsure, ask.
Format
Attach at the end of the delivery, four stateswritten separately, a few lines are enough:
查阅:<读了哪份路由 / 参考了哪张表>
执行:<真正调了哪些能力 / 跑了哪些 skill>
质检:<跑了哪些检查>
跳过:<发现了但没跑的能力 / skill> —— 原因:<为什么不该跑>
Hard rules
- Do not merge the four lines."Executed" only includes whatactually ran; anything not run is absolutely not allowed to appear on this line.
- "Skipped" distinguishes two things:never discovered need not be listed;discovered, but judged that it should not be run mustmustbe listed with the reason stated.
Those with side effects especially cannot be omitted (
wechat-article-pipeline/wechat-draft-publishwill write into the user's own WeChat official account backend); ⛔ If a capability that has been taken down (such asmera, see §3) is hit by the user's needs, also write it under "Skipped" and explain that it has been taken down. - Truthfully: what ran but failed goes under "Executed" with the failure noted; it must not be moved under "Skipped" to gloss it over; if no quality check was done, write "none."
- In the receipt, only write quantities that can be proven. The conclusion in parentheses must point back to someactually returned field(such as banned-word detection's
prohibitedWordsTypeis a category array, so "hit N categories" is provable; the interfacedoes not returnrisk level / score / list of hit words, so things like "0 high risk" or "low risk" are fabricated). If you are unsure whether it is a real field, do not write this quantity in the receipt. - Brief: this is part of the delivery, not another report. Within four lines, do not expand into paragraphs.
8. Hard rules (must be followed)
- Never echo / print / record the whole
DOUBAOYA_API_KEY—when confirming identity, only reveal the prefix. - Only through
https://doubaoya.com's public/api/...interfaceFetch data; do not describe, guess at, or expose to the user any upstream data source / internal service. To the user, the capability comes from "都爆鸭". - First
successthen fetch data;false, handle error codes per §2.3; do not dump raw 500/502 onto the user. - For the call path, use the
execution.targetreturned by the discovery interface as authoritative, do not assemble it yourself, do not hard-code a fixed list (§2.1 / §4). Discovery surfacesthere are two(GET /api/skills+GET /api/apis), pulling only one will make you silently miss most of the capabilities. The skill package directory name ≠ the call slug. - Write scripts using real data as the material, put the real angles of hot topics / viral notes into the script, do not write empty content detached from the data.
- The second brain (
mera) has been taken offline(§3): do not call it, and alsodo not use public search to substitute for it—public capabilities cannot see the user's own notes; impersonating his memory is worse than plainly saying "there is no such capability". Just tell it as it is. (The red lines from before it was taken offline are still recorded here, for reference if it is restored later: private content is only answered to the user themself and must not be transmitted to other services; before writing, ifstatus=donehas not been obtained, never say "saved".) - When delivering, bring back the receipt(§7.5):
查阅 / 执行 / 质检 / 跳过four lines. In "Executed", only write what was actually run; what was discovered but, judged by the final state, should not be run, write into "Skipped" and explain why, do not let the user find out only afterward by asking.