polyhub_discover
Polyhub Discover Skill
Version: v0.3.8
When to use
Use this skill when the user asks about:
- Discover page tag list
- Trader rankings on the discover page
- Cross-tag discover queries
- Filtering and sorting discover traders
- Looking up a trader by address
- Looking up market tags by condition IDs
Requirements
curlmust be available in the runtime environment
POLYHUB_API_BASE_URL is fixed to https://polyhub.skill-test.bedev.hubble-rpc.xyz.
This skill does not require POLYHUB_API_KEY.
Safety rules
- These are public read-only endpoints. No confirmation step is required.
- Do not invent filter values. Only pass filters the user requested.
- Prefer building query strings from explicit user intent.
- When querying by address, trim whitespace and keep the original checksum/casing if provided.
Tools
Use the bash tool to call the API with curl.
Fast Path
For common intents, map user requests like this:
- “discover 页有哪些标签” ->
GET /api/v1/markets/tags - “看某个 tag 的 trader 排行” ->
GET /api/v1/traders-v2/?tag=... - “跨 tag 找高手” ->
GET /api/v1/traders-v2/?tag=CROSS-TAG - “看某个地址在各标签下的数据” ->
GET /api/v1/traders/by-address?user_id=... - “查 condition id 对应什么标签” ->
GET /api/v1/markets/by-condition-ids?ids=...
Curl base setup
BASE="https://polyhub.skill-test.bedev.hubble-rpc.xyz"
Tags
Action: List discover tags
GET /api/v1/markets/tags- Auth: public
curl -sS --fail-with-body "$BASE/api/v1/markets/tags"
Use this when the user wants the discover page tag list or wants to browse available niches first.
Trader Rankings
Action: List traders for discover
GET /api/v1/traders-v2/- Auth: public
Core query params:
tag— requiredtime_range— required:allor30dlimit— optional, default10, max100offset— optional, default0filterBots— optional:0or1sort_by— optional:volume,pnl,roi,avg_adt,trade_count_30,ev_per_bought,timing_scoresort_direction— optional:ascordesc
Range filter params:
pnl_min,pnl_maxvolume_min,volume_maxroi_min,roi_maxavg_adt_min,avg_adt_maxtrade_count_30_min,trade_count_30_maxev_per_bought_min,ev_per_bought_maxtiming_score_min,timing_score_max
Validation:
tagis requiredtime_rangemust beallor30dlimitshould be between1and100offsetshould be0or greaterfilterBotsshould be0or1
Example: standard discover query
curl -sS --fail-with-body \
"$BASE/api/v1/traders-v2/?tag=Politics&time_range=all&limit=10&offset=0"
Example: cross-tag query
curl -sS --fail-with-body \
"$BASE/api/v1/traders-v2/?tag=CROSS-TAG&time_range=30d&limit=20&offset=0"
Example: filtered and sorted query
curl -sS --fail-with-body \
"$BASE/api/v1/traders-v2/?tag=Sports&time_range=30d&filterBots=1&pnl_min=1000&trade_count_30_min=30&sort_by=ev_per_bought&sort_direction=desc"
Guidance:
- Use
tag=CROSS-TAGwhen the user wants discover results across all tags. - Use
time_range=30dwhen the user asks for recent performance. - Use
filterBots=1when the user explicitly wants bot filtering. - Prefer
sort_direction=descunless the user explicitly wants ascending order.
Trader Detail
Action: Get trader stats by address
GET /api/v1/traders/by-address- Auth: public
Required query params:
user_id— trader wallet address
Optional query params:
time_range— if supported by caller flow
curl -sS --fail-with-body \
"$BASE/api/v1/traders/by-address?user_id=0x1234..."
Use this when the user clicks into a trader from discover and wants stats across tags.
Market Tag Lookup
Action: Get market tags by condition IDs
GET /api/v1/markets/by-condition-ids- Auth: public
Required query params:
ids— comma-separated condition ID list
Validation:
idsmust not be empty- The backend supports up to
200IDs per request
curl -sS --fail-with-body \
"$BASE/api/v1/markets/by-condition-ids?ids=0xabc,0xdef"
Use this when the user wants to map market condition IDs back to discover tags.
Strategy: Find Profitable Traders
When the user asks to find traders worth copying (e.g. "帮我找值得跟单的地址", "find me smart money", "谁在赚钱"), follow this multi-step process:
Step 1: Query top traders
Choose the scope based on user intent:
- If user specifies a tag (e.g. "Sports"), use that tag
- If user wants broad search, use
tag=CROSS-TAG - Always use
time_range=30dunless user asks for all-time
Default filters (user can override any):
filterBots=1(exclude bots)pnl_min=5000(minimum $5K profit in 30 days)timing_score_min=52(at least slightly positive alpha)trade_count_30_min=30(enough trades for statistical significance)sort_by=ev_per_bought,sort_direction=desc(rank by expected return per dollar)limit=15
curl -sS --fail-with-body \
"$BASE/api/v1/traders-v2/?tag=Sports&time_range=30d&filterBots=1&pnl_min=5000&timing_score_min=52&trade_count_30_min=30&sort_by=ev_per_bought&sort_direction=desc&limit=15"
Step 2: Identify hot sub-tags
From Step 1 results, note which tags appear frequently in top results. Common valuable sub-tags under Sports: Soccer, Premier League, UCL, NBA, NHL, Liga MX, Argentina Primera División.
Then query those specific sub-tags with the same filters to find specialists:
curl -sS --fail-with-body \
"$BASE/api/v1/traders-v2/?tag=Soccer&time_range=30d&filterBots=1&pnl_min=5000&timing_score_min=52&trade_count_30_min=10&sort_by=ev_per_bought&sort_direction=desc&limit=10"
Step 3: Cross-validate with by-address
For top 3-5 candidates, call by-address to see their performance across ALL tags:
curl -sS --fail-with-body \
"$BASE/api/v1/traders/by-address?user_id=0x..."
Evaluation criteria (prioritized):
- Multi-tag consistency: Strong in 3+ sub-tags beats one-hit wonder
- Alpha Score > 55: Indicates buy-low-sell-high timing ability (higher = better)
- EV/Bought > 0.25: Good expected return per dollar invested
- 30D trades >= 30: Statistically reliable sample size
- Positive 30D PnL across tags: Not just one lucky market
Disqualify if:
- ALL-HUBBLE EV < 0.1 (too many low-quality trades overall)
- Only one sub-tag has positive PnL (single-market luck)
- Alpha = 50 exactly in main tag (no timing edge)
Step 4: Present results and handoff
Present ranked results in this format:
🏆 推荐跟单地址
1. 0x{address}
📊 Sports 30D: PnL ${pnl}, EV/Bought {ev}, Alpha {alpha}
📈 强势子标签: {subtag1} (EV {ev1}), {subtag2} (EV {ev2})
🔗 详情: https://polyhub.hubble.xyz/trader/{address}
想跟单哪个?
A) 我直接帮你创建跟单任务(通过 polyhub_copy skill,需要 API key)
B) 打开网页操作: https://polyhub.hubble.xyz/discover?copy={address}&tag={tag}
Parameter override examples
- "PnL 至少 1 万" →
pnl_min=10000 - "要更活跃的" →
trade_count_30_min=100 - "Alpha 要高" →
timing_score_min=60 - "我要看机器人" →
filterBots=0 - "看全量数据" →
time_range=all
Empty results fallback
If a query returns zero results, progressively loosen filters:
- Reduce
pnl_minto 1000 - Reduce
trade_count_30_minto 10 - Remove
timing_score_min - Broaden to
tag=CROSS-TAGif using a niche sub-tag
Handoff to Copy
After the user selects an address to copy:
- Preferred: Skill 直接创建 — If
POLYHUB_API_KEYis configured, usepolyhub_copyskill's "Quick Copy from Discover" flow:- Check balance via
GET /api/v1/portfolio/stats - If balance sufficient →
POST /api/v1/copy-taskswithtargetTraderand optionalfilteredByTag - If balance insufficient → direct user to deposit on the web (skill cannot deposit):
https://polyhub.hubble.xyz/copy-history?action=deposit
- Check balance via
- Fallback: 网页端跟单 — Provide the deep link:
https://polyhub.hubble.xyz/discover?copy={address}&tag={tag} - Always show the trader detail page link:
https://polyhub.hubble.xyz/trader/{address}
Note: Depositing funds is only possible via the web UI, not through any skill or API.
Error handling
400: Invalid query parameters such as missingtag, invalidtime_range, or emptyids500: Backend query failed or service unavailable
More from hubblevision/polyhub-skills
polyhub_account
View portfolio stats on Polyhub using an API key.
18polyhub_copy
Manage copy-trading tasks, view signals, positions and trades on Polyhub using an API key.
17polyhub-copy
Manage copy-trading tasks, view signals, positions and trades on Polyhub using an API key.
12polyhub-account
View portfolio stats on Polyhub using an API key.
12polyhub-discover
Explore public discover data on Polyhub without API key auth, including tags, trader rankings, trader detail stats, and market tag lookup.
12