Polyhub Discover Skill
Version: v0.3.3
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
POLYHUB_API_BASE_URL— Polyhub API server base URLcurlmust be available in the runtime environment
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="${POLYHUB_API_BASE_URL%/}"
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.
Error handling
400: Invalid query parameters such as missingtag, invalidtime_range, or emptyids500: Backend query failed or service unavailable