SuperAPI AI Directory

doubaoya

General & other

View repository

Updated 10-16 08:02

About this skill

Doubaoya · doubaoya

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):

  1. First confirm whether there is a key (if not, walk them through §1 to get a key, just once).
  2. 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.
  3. 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:

  1. Open https://doubaoya.com → Log in
  2. Go to Key Center → Generate Key
  3. 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_RESULT what 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 in doubaoya-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 and dby。

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 total from 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 to target.method + target.path , and the body is that capability's input parameters.
  • mode: "dedicated" → likewise call according to target , but it is a dedicated route,the method is not necessarily POST (e.g. the account charter is PUT /api/ip-profile/:id/charter). Mistakenly going through the generic /invoke returns 400 DEDICATED_ROUTE, and the error message directly states which route to use.
  • mode: "unavailable"(At this point there is no target field) → the capability is under maintenance or has been retired,don't call it; forcing a call returns 503 CAPABILITY_UNAVAILABLE,availability.note is 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_FAILED the 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):

  1. Query both sets:GET /api/skills and GET /api/apis(§4). Eight times out of ten the capability is in the other half, and the wrong route was chosen.
  2. Use GET /api/skills/search?query=… or POST /api/skills/recommend to search by intent (only covers the skills side).
  3. Once foundcall according to its execution.target.path Hit, don't assemble the path yourself.
  4. 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 add the 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 often null, 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.com no longer returns NXDOMAIN, and mera '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 GET discovery endpointsdo not need a key to pull (but including one doesn't hurt).
  • POST /api/skills/recommend Be sure to include the Authorization header: it itself does not verify identity, but a POST without a Bearer header will be blocked as 403 by cross-site protection CSRF_FORBIDDEN。query being empty will 400 INVALID_PARAMS。
  • recommend / search only 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 in GET /api/skills + GET /api/apis the 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).

  1. 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, see hotCount/index/url)。
  2. 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。
  3. Intelligent matching: scan the comprehensive hot list, pick out 2–3 hot topics that this IP cancredibly leverage(hotCount High + cross-platform hit-list + IP fit), for each one give this IP'sexclusive angle; when necessary use xiaohongshu-viral-notes / *-ai-feed to verify "it's really blowing up."
  4. 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).
  5. Safety check: throw the script into POST /api/skills/content-safety-check/invoke { "platform": "douyin", "content": "<脚本>" }— it returns content(annotated version) / originalContent(original text) / prohibitedWordsType(risk category); the matched words are located from the annotations in content , 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.
  6. 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.
  7. 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-write pull viral article samples on the same theme to write the body → wechat-title come up with titles / wechat-cover determine the cover formula → wechat-banned-words produce a review-passing version of the body → wechat-article-pipeline format + 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 to dby。

Workflow B: "Why did this Douyin/Xiaohongshu link go viral? Give me reusable topic angles"

  1. Parse the work:POST /api/apis/tool/parse-content-detail/call { "url": "<分享链接>" } → get the title, author, and interaction data.
  2. Find same-topic heat: use the core words in the title to call POST /api/skills/xiaohongshu-viral-notes/invoke or the corresponding platform's daily report source (GET /api/apis search ai-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).
  3. 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-publish will write into the user's own WeChat official account backend); ⛔ If a capability that has been taken down (such as mera, 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 prohibitedWordsType is 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)

  1. Never echo / print / record the whole DOUBAOYA_API_KEY—when confirming identity, only reveal the prefix.
  2. 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 "都爆鸭".
  3. First success then fetch data;false , handle error codes per §2.3; do not dump raw 500/502 onto the user.
  4. For the call path, use the execution.target returned 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.
  5. 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.
  6. 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, if status=done has not been obtained, never say "saved".)
  7. 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.