metengine-data-agent
npx skills add https://github.com/sendaifun/skills --skill metengine-data-agent
Agent 安装分布
Skill 文档
MetEngine Data Agent API
Real-time smart money analytics across Polymarket, Hyperliquid, and Meteora. 63 endpoints covering wallet scoring, insider detection, capital flow tracking, and position analysis. Pay per request with USDC on Solana — no API keys, no accounts, no onboarding friction.
Display Rules
- NEVER truncate or trim wallet/contract addresses. Always show full addresses (e.g.
0x61276aba49117fd9299707d5d573652949d5c977, not0x6127...c977). - This applies to all Polymarket (0x hex), Hyperliquid (0x hex), Meteora (base58), condition_ids, token_ids, pool addresses, position addresses, and transaction hashes.
Skill Auto-Update
This skill file may change as new endpoints are added or pricing updates. Keep it fresh by downloading the latest version weekly.
Download the latest skill file:
curl -sL https://www.metengine.xyz/skill.md -o ~/.claude/agents/metengine-data-agent.md
Automate weekly updates (cron):
# Add to crontab: crontab -e
0 0 * * 0 curl -sL https://www.metengine.xyz/skill.md -o ~/.claude/agents/metengine-data-agent.md 2>/dev/null
Check skill version before querying (optional):
# Compare local vs remote version
LOCAL_VER=$(grep '^version:' ~/.claude/agents/metengine-data-agent.md | head -1 | tr -d '"' | awk '{print $2}')
REMOTE_VER=$(curl -sL https://www.metengine.xyz/skill.md | grep '^version:' | head -1 | tr -d '"' | awk '{print $2}')
[ "$LOCAL_VER" != "$REMOTE_VER" ] && curl -sL https://www.metengine.xyz/skill.md -o ~/.claude/agents/metengine-data-agent.md
Agents SHOULD check for updates at the start of a new session if more than 7 days have passed since the last update.
Session Memory (CRITICAL — Read This First)
Before making ANY API call, check for a memory file at:
~/.claude/agents/metengine-memory.md
This file persists across sessions and stores everything needed to skip setup and make faster queries. If the memory file exists, read it first. It will tell you:
- Wallet configuration — path to the Solana keypair, public address, whether SOL/USDC balances were verified
- Package status — whether
@x402/core,@x402/svm,@solana/kitare already installed and where - Client bootstrap — a working code snippet from the last successful query (copy-paste ready)
- Endpoint learnings — which endpoints worked, which timed out, which fallbacks were used
- Pricing cache — last-fetched pricing schedule (avoids re-reading the full pricing section)
Memory File Format
Create or update ~/.claude/agents/metengine-memory.md using this template:
# MetEngine Session Memory
<!-- Auto-maintained by agents. Do not delete. -->
## Last Updated
YYYY-MM-DD HH:MM UTC
## Skill Version
<version from frontmatter>
## Wallet
- keypair_path: ~/.config/solana/id.json
- public_address: <base58 pubkey -- NEVER store the private key>
- sol_balance_ok: true/false
- usdc_balance_ok: true/false
- last_balance_check: YYYY-MM-DD
## Packages
- installed: true/false
- install_dir: <path where bun add was run>
- packages: @x402/core, @x402/svm, @solana/kit
- bun_version: <version>
## Client Bootstrap
<!-- Paste the minimal working paidFetch setup here after first successful call -->
```typescript
// <paste the one-time setup + paidFetch function that worked>
Endpoint History
| Date | Endpoint | Status | Latency | USDC Cost | Notes |
|---|
Fallbacks Learned
| Endpoint | Issue | Fallback Used |
|---|
Quirks Encountered
### Memory Update Rules
Agents MUST update the memory file:
1. **After first successful setup** -- Record wallet path, public address, installed packages, working bootstrap code
2. **After every API call** -- Append to Endpoint History (keep last 10 rows, prune older)
3. **When a fallback is used** -- Record in Fallbacks Learned
4. **When a new quirk is discovered** -- Record in Quirks Encountered
5. **At session end** -- Update `Last Updated` timestamp
### How Memory Saves Tokens
| Without Memory | With Memory | Token Savings |
|---------------|-------------|---------------|
| Read full skill file (2400 lines) to find setup instructions | Skip to Client Bootstrap section | ~80% fewer setup tokens |
| Trial-and-error wallet detection | Read wallet path from memory | ~500 tokens saved |
| Install packages every session | Check `installed: true`, skip | ~200 tokens saved |
| Hit known-broken endpoint, get 504, try fallback | Check Fallbacks Learned, use fallback directly | ~1000 tokens saved per avoided failure |
| Re-discover quirks through errors | Check Quirks Encountered | ~300 tokens saved per quirk |
### Quick Start for Returning Agents
If `~/.claude/agents/metengine-memory.md` exists:
- Read memory file
- If wallet and packages are set up: a. Copy the Client Bootstrap code b. Check Fallbacks Learned for the endpoint you need c. Make the API call directly d. Update Endpoint History
- If wallet or packages NOT set up: a. Follow the Onboarding Path below b. Update memory file after setup
**First-time agents:** Follow the Onboarding Path below, then create the memory file.
### Wallet Security Rules
- **NEVER** read, log, print, or display the contents of any keypair file
- **NEVER** store private keys in the memory file
- **ONLY** store the file path and the public address
- Load the keypair at runtime using `Bun.file(path).text()` or `fs.readFileSync(path)` -- pipe directly into the signer, never into a variable that gets logged
---
## Onboarding Path
Two steps from zero to data:
**Step 1: Verify service is live (free)**
GET https://agent.metengine.xyz/health
**Step 2: Make a paid request**
GET https://agent.metengine.xyz/api/v1/markets/trending?timeframe=24h&limit=5
First call returns `402` with price. Sign payment. Re-send with `PAYMENT-SIGNATURE` header. Receive `200` with data + settlement proof.
Prerequisites: A Solana wallet with SOL (for tx fees) and USDC (for payments). Install `@x402/core`, `@x402/svm`, `@solana/kit`.
---
## Payment Protocol: x402 on Solana Mainnet
Every paid endpoint uses a two-step handshake. No API keys. No accounts. Payment IS authentication.
### Flow
Agent MetEngine Solana | | | |– GET /api/v1/endpoint ——>| | |<– 402 + PaymentRequired —–| | | | | | [sign payment locally] | | | | | |– GET + PAYMENT-SIGNATURE —>| | | |– verify ——————>| | |<– valid ——————-| | | | | | [execute query] | | | | | |– settle ——————>| | |<– tx hash —————–| |<– 200 + data + PAYMENT- —–| | | RESPONSE (settlement) | |
### Important: Settle-After-Execute
If the query fails (timeout, server error), no payment is settled. The agent keeps their funds. This is enforced server-side. Only successful `2xx` responses trigger settlement.
### Headers
| Header | Direction | Description |
|--------|-----------|-------------|
| `PAYMENT-REQUIRED` | Response (402) | Encoded payment requirements |
| `X-PAYMENT-REQUIRED` | Response (402) | Duplicate of above for compatibility |
| `PAYMENT-SIGNATURE` | Request | Signed payment payload |
| `X-PAYMENT` | Request | Alternate payment header name |
| `PAYMENT-RESPONSE` | Response (200) | Settlement proof with tx hash |
| `X-PAYMENT-RESPONSE` | Response (200) | Duplicate of above for compatibility |
### Client Implementation (TypeScript/Bun)
```typescript
import { x402Client, x402HTTPClient } from "@x402/core/client";
import { registerExactSvmScheme } from "@x402/svm/exact/client";
import { toClientSvmSigner } from "@x402/svm";
import { getBase58Encoder, createKeyPairSignerFromBytes } from "@solana/kit";
import type { PaymentRequired, SettleResponse } from "@x402/core/types";
// --- One-time setup ---
const bytes = getBase58Encoder().encode(process.env.SOLANA_PRIVATE_KEY!);
const signer = await createKeyPairSignerFromBytes(bytes);
const client = new x402Client();
registerExactSvmScheme(client, { signer: toClientSvmSigner(signer) });
const httpClient = new x402HTTPClient(client);
// --- Reusable paid fetch ---
const BASE_URL = "https://agent.metengine.xyz";
async function paidFetch(
path: string,
options?: { method?: string; body?: Record<string, unknown> },
): Promise<{ data: unknown; settlement: SettleResponse; price: number }> {
const method = options?.method ?? "GET";
const url = `${BASE_URL}${path}`;
const fetchOpts: RequestInit = { method };
if (options?.body) {
fetchOpts.headers = { "Content-Type": "application/json" };
fetchOpts.body = JSON.stringify(options.body);
}
// Step 1: Get 402 with price
const initial = await fetch(url, fetchOpts);
if (initial.status !== 402) throw new Error(`Expected 402, got ${initial.status}`);
const body = await initial.json();
// Step 2: Parse payment requirements
const paymentRequired: PaymentRequired = httpClient.getPaymentRequiredResponse(
(name) => initial.headers.get(name), body,
);
const price = Number(paymentRequired.accepts[0]!.amount);
// Step 3: Sign payment
const paymentPayload = await httpClient.createPaymentPayload(paymentRequired);
const paymentHeaders = httpClient.encodePaymentSignatureHeader(paymentPayload);
// Step 4: Re-send with payment
const paid = await fetch(url, {
...fetchOpts,
headers: { ...fetchOpts.headers as Record<string, string>, ...paymentHeaders },
});
if (paid.status !== 200) {
const err = await paid.json();
throw new Error(`Payment failed (${paid.status}): ${JSON.stringify(err)}`);
}
const paidBody = (await paid.json()) as { data: unknown };
// Step 5: Extract settlement proof
const settlement = httpClient.getPaymentSettleResponse(
(name) => paid.headers.get(name),
);
return { data: paidBody.data, settlement, price };
}
Usage Examples
// GET endpoint
const { data, price } = await paidFetch("/api/v1/markets/trending?timeframe=24h&limit=5");
console.log(`Paid $${price} USDC. Got ${(data as any[]).length} markets.`);
// POST endpoint
const { data: intel } = await paidFetch("/api/v1/markets/intelligence", {
method: "POST",
body: { condition_id: "0xabc123...", top_n_wallets: 10 },
});
NPM Dependencies
bun add @x402/core @x402/svm @solana/kit
Pricing
All prices are in USDC on Solana Mainnet. Pricing is dynamic based on endpoint tier, timeframe, limit, and filter usage.
Tier Base Costs
| Tier | Base Cost (USDC) | Description |
|---|---|---|
| light | $0.01 | Simple lookups, searches, feeds |
| medium | $0.02 | Aggregated analytics, trending data |
| heavy | $0.05 | Computed intelligence, leaderboards, scoring |
| whale | $0.08 | Multi-entity comparisons, complex scans |
Price Modifiers
Timeframe multiplier (applied to base cost):
| Timeframe | Multiplier |
|---|---|
| 1h | 0.5x |
| 4h | 0.7x |
| 12h | 0.9x |
| 24h / today | 1.0x |
| 7d | 2.0x |
| 30d | 3.0x |
| 90d | 4.0x |
| 365d / all | 5.0x |
Limit multiplier: price *= max(1, requested_limit / default_limit)
Filter discounts (reduce scan cost):
| Filter | Discount | Applicable Endpoints |
|---|---|---|
| category | 0.7x | trending, top-performers, whales, capital-flow, high-conviction, opportunities |
| condition_id | 0.5x | whales, sentiment, participants, wallet activity |
| smart_money_only=true | 0.7x | whales, capital-flow, volume-heatmap (Polymarket + HL) |
| coin/coins | 0.7x | HL whales, long-short-ratio, pressure/pairs |
| pool_type (not “all”) | 0.7x | All Meteora endpoints with pool_type param |
| pool_address | 0.5x | pool detail, volume-history, events, fee-analysis, positions/active |
Special rules:
wallets/compare:price *= wallets.length / 2hl/traders/compare:price *= traders.length / 2meteora/lps/compare:price *= owners.length / 2wallets/profile: both includes=1.0x, one include=0.7x, neither=0.4xwallets/top-performerswithout category: 2.0x penalty
Hard caps:
/api/v1/markets/opportunities: max $0.15/api/v1/wallets/copy-traders: max $0.12
Global bounds: Floor $0.01, Ceiling $0.20 per request.
Machine-Readable Pricing
GET https://agent.metengine.xyz/api/v1/pricing
Returns the full pricing schedule as JSON including all tiers, routes, multipliers, discounts, and special rules. Free endpoint. No payment required.
Capability Manifest
Polymarket (27 endpoints)
| # | Method | Path | Tier | Description |
|---|---|---|---|---|
| 1 | GET | /api/v1/markets/trending | medium | Trending markets with volume spikes |
| 2 | GET | /api/v1/markets/search | light | Search markets by keyword, category, status, or Polymarket URL |
| 3 | GET | /api/v1/markets/categories | light | All categories with activity stats |
| 4 | GET | /api/v1/platform/stats | light | Platform-wide aggregate stats |
| 5 | POST | /api/v1/markets/intelligence | heavy | Full smart money intelligence report for a market |
| 6 | GET | /api/v1/markets/price-history | light | OHLCV price/probability time series |
| 7 | POST | /api/v1/markets/sentiment | medium | Sentiment time series with smart money overlay |
| 8 | POST | /api/v1/markets/participants | medium | Participant summary by scoring tier |
| 9 | POST | /api/v1/markets/insiders | heavy | Insider pattern detection (7-signal behavioral scoring) |
| 10 | GET | /api/v1/markets/trades | light | Chronological trade feed for a market |
| 11 | GET | /api/v1/markets/similar | whale | Related markets by wallet overlap |
| 12 | GET | /api/v1/markets/opportunities | whale | Markets where smart money disagrees with price |
| 13 | GET | /api/v1/markets/high-conviction | heavy | High-conviction smart money bets |
| 14 | GET | /api/v1/markets/capital-flow | medium | Capital flow by category (sector rotation) |
| 15 | GET | /api/v1/trades/whales | medium | Large whale trades |
| 16 | GET | /api/v1/markets/volume-heatmap | medium | Volume distribution across categories/hours/days |
| 17 | POST | /api/v1/wallets/profile | heavy | Full wallet dossier with score, positions, trades |
| 18 | POST | /api/v1/wallets/activity | medium | Recent trading activity for a wallet |
| 19 | POST | /api/v1/wallets/pnl-breakdown | medium | Per-market PnL breakdown |
| 20 | POST | /api/v1/wallets/compare | whale | Compare 2-5 wallets side-by-side |
| 21 | POST | /api/v1/wallets/copy-traders | whale | Detect wallets copying a target wallet |
| 22 | GET | /api/v1/wallets/top-performers | heavy | Leaderboard by PnL, ROI, Sharpe, win rate, volume |
| 23 | GET | /api/v1/wallets/niche-experts | heavy | Top wallets in a specific category |
| 24 | GET | /api/v1/markets/resolutions | light | Resolved markets with smart money accuracy |
| 25 | GET | /api/v1/wallets/alpha-callers | heavy | Wallets that trade early on later-trending markets |
| 26 | GET | /api/v1/markets/dumb-money | medium | Low-score trader positions (contrarian indicator) |
| 27 | GET | /api/v1/wallets/insiders | heavy | Global insider candidates by behavioral score |
Hyperliquid (18 endpoints)
| # | Method | Path | Tier | Description |
|---|---|---|---|---|
| 28 | GET | /api/v1/hl/platform/stats | light | Platform aggregate stats |
| 29 | GET | /api/v1/hl/coins/trending | medium | Trending coins by activity |
| 30 | GET | /api/v1/hl/coins/list | light | All traded coins with 7d stats |
| 31 | GET | /api/v1/hl/coins/volume-heatmap | medium | Volume by coin and hour |
| 32 | GET | /api/v1/hl/traders/leaderboard | heavy | Ranked trader leaderboard |
| 33 | POST | /api/v1/hl/traders/profile | heavy | Full trader dossier |
| 34 | POST | /api/v1/hl/traders/compare | whale | Compare 2-5 traders |
| 35 | GET | /api/v1/hl/traders/daily-pnl | medium | Daily PnL time series with streaks |
| 36 | POST | /api/v1/hl/traders/pnl-by-coin | medium | Per-coin PnL breakdown (closed PnL only) |
| 37 | GET | /api/v1/hl/traders/fresh-whales | heavy | New high-volume wallets |
| 38 | GET | /api/v1/hl/trades/whales | medium | Large trades |
| 39 | GET | /api/v1/hl/trades/feed | light | Chronological trade feed for a coin |
| 40 | GET | /api/v1/hl/trades/long-short-ratio | medium | Long/short volume ratio time series |
| 41 | GET | /api/v1/hl/smart-wallets/list | light | Smart wallet list with scores |
| 42 | GET | /api/v1/hl/smart-wallets/activity | medium | Smart wallet recent trades |
| 43 | GET | /api/v1/hl/smart-wallets/signals | heavy | Aggregated directional signals by coin |
| 44 | GET | /api/v1/hl/pressure/pairs | heavy | Long/short pressure with smart positions |
| 45 | GET | /api/v1/hl/pressure/summary | medium | Pressure summary across all coins |
Meteora (18 endpoints)
| # | Method | Path | Tier | Description |
|---|---|---|---|---|
| 46 | GET | /api/v1/meteora/pools/trending | medium | Trending pools by volume spike |
| 47 | GET | /api/v1/meteora/pools/top | medium | Top pools by volume, fees, or LP count |
| 48 | GET | /api/v1/meteora/pools/search | light | Search pools by address or token name |
| 49 | GET | /api/v1/meteora/pools/detail | medium | Full pool detail |
| 50 | GET | /api/v1/meteora/pools/volume-history | light | Volume time series |
| 51 | GET | /api/v1/meteora/pools/events | light | Chronological event feed |
| 52 | GET | /api/v1/meteora/pools/fee-analysis | medium | Fee claiming analysis |
| 53 | GET | /api/v1/meteora/lps/top | heavy | Top LPs leaderboard |
| 54 | POST | /api/v1/meteora/lps/profile | heavy | Full LP dossier |
| 55 | GET | /api/v1/meteora/lps/whales | medium | Large LP events |
| 56 | POST | /api/v1/meteora/lps/compare | whale | Compare 2-5 LPs |
| 57 | GET | /api/v1/meteora/positions/active | medium | Active LP positions |
| 58 | GET | /api/v1/meteora/positions/history | light | Position event history (DLMM only) |
| 59 | GET | /api/v1/meteora/platform/stats | light | Platform-wide stats |
| 60 | GET | /api/v1/meteora/platform/volume-heatmap | medium | Volume by action/hour |
| 61 | GET | /api/v1/meteora/platform/metengine-share | light | MetEngine routing share |
| 62 | GET | /api/v1/meteora/dca/pressure | medium | DCA accumulation pressure by token |
| 63 | GET | /api/v1/meteora/pools/smart-wallet | heavy | Pools with highest smart wallet LP activity |
Complete Endpoint Reference
Response Envelope
All 200 responses use the format: { "data": <payload> }
All error responses use: { "error": "<message>" } with optional "reason" field.
POLYMARKET
1. GET /api/v1/markets/trending
Trending markets with volume spikes.
Parameters (query string):
| Param | Type | Default | Values | Required |
|---|---|---|---|---|
| timeframe | string | 24h | 1h, 4h, 12h, 24h, 7d | no |
| category | string | – | any valid category | no |
| sort_by | string | volume_spike | volume_spike, trade_count, smart_money_inflow | no |
| limit | integer | 20 | 1-100 | no |
Response schema:
{
"data": [
{
"condition_id": "string",
"question": "string",
"category": "string",
"period_volume_usdc": "number",
"period_trade_count": "number",
"volume_spike_multiplier": "number",
"smart_money_wallets_active": "number",
"smart_money_net_direction": "string",
"buy_sell_ratio": "number",
"leader_price": "number"
}
]
}
2. GET /api/v1/markets/search
Search markets by keyword, category, status. Accepts Polymarket URLs as the query param.
Parameters (query string):
| Param | Type | Default | Values | Required |
|---|---|---|---|---|
| query | string | – | keyword or Polymarket URL | no |
| category | string | – | any valid category | no |
| status | string | active | active, closing_soon, resolved | no |
| has_smart_money_signal | boolean | – | true, false | no |
| sort_by | string | relevance | end_date, volume, relevance | no |
| limit | integer | 20 | 1-100 | no |
Response schema:
{
"data": [
{
"condition_id": "string",
"question": "string",
"category": "string",
"end_date": "string (ISO 8601)",
"status": "string",
"total_volume_usdc": "number",
"smart_money_outcome": "string | null",
"smart_money_wallets": "number",
"has_contrarian_signal": "boolean",
"leader_price": "number"
}
]
}
3. GET /api/v1/markets/categories
List all categories with activity stats.
Parameters (query string):
| Param | Type | Default | Values | Required |
|---|---|---|---|---|
| include_stats | boolean | true | true, false | no |
| timeframe | string | 24h | 24h, 7d | no |
Response schema:
{
"data": [
{
"name": "string",
"active_markets": "number",
"period_volume": "number",
"period_trades": "number",
"unique_traders": "number"
}
]
}
4. GET /api/v1/platform/stats
Platform-wide aggregate stats.
Parameters (query string):
| Param | Type | Default | Values | Required |
|---|---|---|---|---|
| timeframe | string | 24h | 24h, 7d, 30d | no |
Response schema:
{
"data": {
"timeframe": "string",
"total_volume_usdc": "number",
"total_trades": "number",
"active_traders": "number",
"active_markets": "number",
"resolved_markets": "number",
"smart_wallet_count": "number",
"avg_trade_size_usdc": "number"
}
}
5. POST /api/v1/markets/intelligence
Full smart money intelligence report on a specific market.
Request body (JSON):
| Field | Type | Default | Values | Required |
|---|---|---|---|---|
| condition_id | string | – | – | yes |
| top_n_wallets | integer | 10 | 1-50 | no |
Response schema:
{
"data": {
"condition_id": "string",
"question": "string",
"category": "string",
"end_date": "string",
"outcomes": "object",
"smart_money": {
"consensus_outcome": "string",
"consensus_strength": "number",
"by_outcome": {
"<outcome_name>": {
"wallet_count": "number",
"total_usdc": "number",
"percentage": "number",
"top_wallets": [
{
"wallet": "string",
"score": "number",
"tags": ["string"],
"usdc_invested": "number",
"net_position": "number",
"avg_buy_price": "number"
}
]
}
}
},
"dumb_money": {
"consensus_outcome": "string",
"contrarian_to_smart": "boolean",
"by_outcome": "object"
},
"signal_analysis": {
"smart_vs_price_aligned": "boolean",
"contrarian_signal": "boolean",
"signal_summary": "string"
},
"recent_activity": {
"volume_24h": "number",
"trade_count_24h": "number",
"buy_sell_ratio": "number",
"volume_trend": "string"
}
}
}
6. GET /api/v1/markets/price-history
OHLCV price/probability time series.
Parameters (query string):
| Param | Type | Default | Values | Required |
|---|---|---|---|---|
| condition_id | string | – | – | yes |
| timeframe | string | 7d | 1h, 4h, 12h, 24h, 7d, 30d | no |
| bucket_size | string | 1h | 5m, 15m, 1h, 4h, 12h, 1d | no |
Response schema:
{
"data": {
"condition_id": "string",
"question": "string",
"category": "string",
"candles_by_outcome": {
"<outcome_name>": [
{
"bucket": "string (ISO 8601)",
"token_id": "string",
"outcome": "string",
"open": "number",
"high": "number",
"low": "number",
"close": "number",
"volume": "number",
"trade_count": "number",
"vwap": "number"
}
]
}
}
}
7. POST /api/v1/markets/sentiment
Sentiment time series with smart money overlay.
Request body (JSON):
| Field | Type | Default | Values | Required |
|---|---|---|---|---|
| condition_id | string | – | – | yes |
| timeframe | string | 7d | 24h, 7d, 30d | no |
| bucket_size | string | 4h | 1h, 4h, 12h, 1d | no |
Response schema:
{
"data": {
"condition_id": "string",
"question": "string",
"overall_sentiment": "object",
"by_outcome": "object",
"time_series": "array",
"momentum": "object"
}
}
8. POST /api/v1/markets/participants
Participant summary by scoring tier.
Request body (JSON):
| Field | Type | Default | Values | Required |
|---|---|---|---|---|
| condition_id | string | – | – | yes |
Response schema:
{
"data": {
"condition_id": "string",
"question": "string",
"total_wallets": "number",
"total_usdc": "number",
"by_outcome": "object",
"tier_distribution": "object"
}
}
9. POST /api/v1/markets/insiders
Insider pattern detection using 7-signal behavioral scoring.
Request body (JSON):
| Field | Type | Default | Values | Required |
|---|---|---|---|---|
| condition_id | string | – | – | yes |
| limit | integer | 25 | 1-100 | no |
| min_score | integer | 20 | 0-100 | no |
Response schema:
{
"data": {
"condition_id": "string",
"question": "string",
"category": "string",
"insiders": [
{
"wallet": "string",
"insider_score": "number",
"signals": "object",
"outcome": "string",
"net_shares": "number",
"buy_usdc": "number",
"wallet_age_days": "number",
"first_trade_timestamp": "string"
}
],
"summary": "object"
}
}
10. GET /api/v1/markets/trades
Chronological trade feed for a market.
Parameters (query string):
| Param | Type | Default | Values | Required |
|---|---|---|---|---|
| condition_id | string | – | – | yes |
| timeframe | string | 24h | 1h, 4h, 12h, 24h, 7d, 30d | no |
| side | string | – | BUY, SELL | no |
| min_usdc | number | 0 | >= 0 | no |
| smart_money_only | boolean | false | true, false | no |
| limit | integer | 100 | 1-500 | no |
Response schema:
{
"data": {
"condition_id": "string",
"question": "string",
"category": "string",
"trade_count": "number",
"total_volume": "number",
"trades": [
{
"tx_hash": "string",
"wallet": "string",
"token_id": "string",
"outcome": "string",
"side": "string",
"price": "number",
"size": "number",
"usdc_size": "number",
"timestamp": "string",
"wallet_score": "number",
"wallet_tags": ["string"]
}
]
}
}
11. GET /api/v1/markets/similar
Related markets by wallet overlap.
Parameters (query string):
| Param | Type | Default | Values | Required |
|---|---|---|---|---|
| condition_id | string | – | – | yes |
| limit | integer | 10 | 1-50 | no |
Response schema:
{
"data": [
{
"condition_id": "string",
"question": "string",
"category": "string",
"shared_wallet_count": "number",
"wallet_overlap_pct": "number",
"total_volume_usdc": "number"
}
]
}
12. GET /api/v1/markets/opportunities
Markets where smart money disagrees with price.
Parameters (query string):
| Param | Type | Default | Values | Required |
|---|---|---|---|---|
| min_signal_strength | string | moderate | weak, moderate, strong | no |
| category | string | – | any valid category | no |
| closing_within_hours | integer | – | max 720 | no |
| min_smart_wallets | integer | 3 | >= 1 | no |
| limit | integer | 20 | 1-100 | no |
Response schema:
{
"data": [
{
"condition_id": "string",
"question": "string",
"category": "string",
"smart_money_favors": "string",
"smart_money_percentage": "number",
"smart_wallet_count": "number",
"avg_smart_score": "number",
"price_signal_gap": "number",
"signal_direction": "string",
"signal_strength": "string",
"leader_price": "number",
"time_until_close": "string"
}
]
}
13. GET /api/v1/markets/high-conviction
High-conviction smart money bets.
Parameters (query string):
| Param | Type | Default | Values | Required |
|---|---|---|---|---|
| category | string | – | any valid category | no |
| min_smart_wallets | integer | 5 | >= 1 | no |
| min_avg_score | integer | 65 | 0-100 | no |
| limit | integer | 20 | 1-100 | no |
Response schema:
{
"data": [
{
"condition_id": "string",
"question": "string",
"category": "string",
"smart_wallet_count": "number",
"avg_smart_score": "number",
"total_smart_usdc": "number",
"conviction_score": "number",
"favored_outcome": "string",
"favored_outcome_percentage": "number",
"entry_vs_current_gap": "number"
}
]
}
14. GET /api/v1/markets/capital-flow
Capital flow by category (sector rotation).
Parameters (query string):
| Param | Type | Default | Values | Required |
|---|---|---|---|---|
| timeframe | string | 7d | 24h, 7d, 30d | no |
| smart_money_only | boolean | false | true, false | no |
| top_n_categories | integer | 20 | 1-50 | no |
Response schema:
{
"data": {
"timeframe": "string",
"total_net_flow": "number",
"categories": [
{
"category": "string",
"current_buy_volume": "number",
"current_sell_volume": "number",
"current_net_flow": "number",
"previous_buy_volume": "number",
"previous_sell_volume": "number",
"previous_net_flow": "number",
"net_flow_change": "number",
"flow_trend": "string"
}
],
"biggest_inflow": "string",
"biggest_outflow": "string"
}
}
15. GET /api/v1/trades/whales
Large whale trades.
Parameters (query string):
| Param | Type | Default | Values | Required |
|---|---|---|---|---|
| min_usdc | number | 10000 | >= 1 | no |
| timeframe | string | 24h | 1h, 4h, 12h, 24h, 7d, 30d | no |
| condition_id | string | – | – | no |
| category | string | – | any valid category | no |
| side | string | – | BUY, SELL | no |
| smart_money_only | boolean | false | true, false | no |
| limit | integer | 50 | 1-200 | no |
Response schema:
{
"data": [
{
"tx_hash": "string",
"wallet": "string",
"condition_id": "string",
"token_id": "string",
"question": "string",
"outcome": "string",
"category": "string",
"side": "string",
"price": "number",
"size": "number",
"usdc_size": "number",
"timestamp": "string",
"wallet_score": "number",
"win_rate": "number",
"wallet_tags": ["string"]
}
]
}
Note: This endpoint returns REDEEM trades (resolved market payouts) alongside real trades. Filter by side=BUY or side=SELL to exclude them. REDEEMs have price=1.00 and side=REDEEM.
16. GET /api/v1/markets/volume-heatmap
Volume distribution across categories, hours, or days.
Parameters (query string):
| Param | Type | Default | Values | Required |
|---|---|---|---|---|
| timeframe | string | 24h | 24h, 7d, 30d | no |
| group_by | string | category | category, hour_of_day, day_of_week | no |
| smart_money_only | boolean | false | true, false | no |
Response schema:
{
"data": {
"total_volume": "number",
"total_trades": "number",
"breakdown": [
{
"label": "string",
"volume": "number",
"trade_count": "number",
"pct_of_total": "number",
"volume_change_pct": "number",
"trend": "string"
}
],
"biggest_gainer": "string",
"biggest_loser": "string"
}
}
17. POST /api/v1/wallets/profile
Full wallet dossier.
Request body (JSON):
| Field | Type | Default | Values | Required |
|---|---|---|---|---|
| wallet | string | – | lowercase address | yes |
| include_positions | boolean | true | true, false | no |
| include_trades | boolean | true | true, false | no |
| trades_limit | integer | 50 | 1-500 | no |
Response schema:
{
"data": {
"wallet": "string",
"profile": {
"score": "number",
"sharpe": "number",
"win_rate": "number",
"total_pnl": "number",
"total_volume": "number",
"resolved_positions": "number",
"tags": ["string"],
"tier": "string",
"primary_category": "string",
"is_specialist": "boolean"
},
"category_breakdown": "array",
"active_positions": "array",
"recent_trades": "array"
}
}
Note: Wallet addresses MUST be lowercase.
18. POST /api/v1/wallets/activity
Recent trading activity for a wallet.
Request body (JSON):
| Field | Type | Default | Values | Required |
|---|---|---|---|---|
| wallet | string | – | lowercase address | yes |
| timeframe | string | 24h | 1h, 4h, 24h, 7d, 30d | no |
| category | string | – | any valid category | no |
| min_usdc | number | 0 | >= 0 | no |
| limit | integer | 100 | 1-500 | no |
Response schema:
{
"data": {
"wallet": "string",
"wallet_score": "number",
"wallet_tags": ["string"],
"period_summary": "object",
"trades": "array"
}
}
19. POST /api/v1/wallets/pnl-breakdown
Per-market PnL breakdown.
Request body (JSON):
| Field | Type | Default | Values | Required |
|---|---|---|---|---|
| wallet | string | – | lowercase address | yes |
| timeframe | string | 90d | 7d, 30d, 90d, all | no |
| limit | integer | 50 | 1-200 | no |
Response schema:
{
"data": {
"wallet": "string",
"total_realized_pnl": "number",
"total_positions": "number",
"winning_positions": "number",
"losing_positions": "number",
"best_trade": "object",
"worst_trade": "object",
"positions": "array"
}
}
20. POST /api/v1/wallets/compare
Compare 2-5 wallets side-by-side.
Request body (JSON):
| Field | Type | Default | Values | Required |
|---|---|---|---|---|
| wallets | string[] | – | 2-5 lowercase addresses | yes |
| include_shared_positions | boolean | true | true, false | no |
Response schema:
{
"data": {
"wallets": "array of wallet profiles",
"comparison_winners": "object",
"category_overlap": "object",
"shared_positions": "array"
}
}
Pricing note: Cost scales with wallet count: base * wallets.length / 2.
21. POST /api/v1/wallets/copy-traders
Detect wallets copying a target wallet.
Request body (JSON):
| Field | Type | Default | Values | Required |
|---|---|---|---|---|
| wallet | string | – | lowercase address | yes |
| max_lag_minutes | integer | 60 | 1-1440 | no |
| timeframe | string | 7d | 24h, 7d, 30d | no |
| min_overlap_trades | integer | 3 | >= 1 | no |
| limit | integer | 20 | 1-100 | no |
Response schema:
{
"data": [
{
"wallet": "string",
"overlap_trades": "number",
"avg_lag_seconds": "number",
"copied_tokens": "array",
"wallet_score": "number"
}
]
}
22. GET /api/v1/wallets/top-performers
Leaderboard.
Parameters (query string):
| Param | Type | Default | Values | Required |
|---|---|---|---|---|
| timeframe | string | 7d | today, 24h, 7d, 30d, 90d, 365d | no |
| category | string | – | any valid category | no |
| metric | string | pnl | pnl, roi, sharpe, win_rate, volume | no |
| min_trades | integer | 5 | >= 1 | no |
| limit | integer | 25 | 1-100 | no |
Response schema:
{
"data": [
{
"rank": "number",
"wallet": "string",
"period_pnl_usdc": "number",
"period_roi_percent": "number",
"period_trades": "number",
"period_win_rate": "number",
"overall_score": "number",
"sharpe_ratio": "number",
"primary_category": "string",
"tags": ["string"],
"active_positions_count": "number"
}
]
}
Pricing note: Queries without a category filter cost 2x due to full-table scan.
23. GET /api/v1/wallets/niche-experts
Top wallets in a specific category.
Parameters (query string):
| Param | Type | Default | Values | Required |
|---|---|---|---|---|
| category | string | – | any valid category | yes |
| min_category_trades | integer | 10 | >= 1 | no |
| sort_by | string | category_sharpe | category_sharpe, category_pnl, category_volume | no |
| limit | integer | 25 | 1-100 | no |
Response schema:
{
"data": [
{
"wallet": "string",
"category_sharpe": "number",
"category_win_rate": "number",
"category_volume": "number",
"category_pnl": "number",
"category_positions": "number",
"is_specialist": "boolean",
"volume_concentration": "number",
"overall_score": "number",
"tags": ["string"]
}
]
}
24. GET /api/v1/markets/resolutions
Resolved markets with smart money accuracy.
Parameters (query string):
| Param | Type | Default | Values | Required |
|---|---|---|---|---|
| category | string | – | any valid category | no |
| query | string | – | keyword | no |
| sort_by | string | resolved_recently | resolved_recently, volume, smart_money_accuracy | no |
| limit | integer | 25 | 1-100 | no |
Response schema:
{
"data": [
{
"condition_id": "string",
"question": "string",
"category": "string",
"winning_outcome": "string",
"end_date": "string",
"total_volume_usdc": "number",
"smart_money_correct": "number",
"smart_money_wrong": "number",
"smart_money_accuracy": "number"
}
]
}
25. GET /api/v1/wallets/alpha-callers
Wallets that trade early on later-trending markets.
Parameters (query string):
| Param | Type | Default | Values | Required |
|---|---|---|---|---|
| days_back | integer | 30 | 1-90 | no |
| min_days_early | integer | 7 | 1-60 | no |
| min_bet_usdc | number | 100 | >= 0 | no |
| limit | integer | 25 | 1-100 | no |
Response schema:
{
"data": [
{
"wallet": "string",
"market_question": "string",
"condition_id": "string",
"entry_date": "string",
"days_before_resolution": "number",
"bet_size_usdc": "number",
"winning_outcome": "string",
"wallet_score": "number",
"win_rate": "number"
}
]
}
26. GET /api/v1/markets/dumb-money
Low-score trader positions on a market (contrarian indicator).
Parameters (query string):
| Param | Type | Default | Values | Required |
|---|---|---|---|---|
| condition_id | string | – | – | yes |
| max_score | integer | 30 | 0-100 | no |
| min_trades | integer | 5 | >= 1 | no |
| limit | integer | 50 | 1-200 | no |
Response schema:
{
"data": {
"condition_id": "string",
"question": "string",
"category": "string",
"summary": {
"total_wallets": "number",
"total_usdc": "number",
"avg_score": "number",
"consensus_outcome": "string"
},
"positions": "array"
}
}
27. GET /api/v1/wallets/insiders
Global insider candidates by behavioral score.
Parameters (query string):
| Param | Type | Default | Values | Required |
|---|---|---|---|---|
| limit | integer | 50 | 1-200 | no |
| min_score | integer | 50 | 0-100 | no |
| max_wallet_age_days | integer | 60 | 1-90 | no |
Response schema:
{
"data": {
"candidates": [
{
"wallet": "string",
"insider_score": "number",
"wallet_age_days": "number",
"first_trade": "string",
"markets_traded": "number",
"total_buy_usdc": "number",
"category_count": "number",
"categories": ["string"],
"win_count": "number",
"total_resolved": "number",
"win_rate": "number",
"signals": "object"
}
],
"total_candidates": "number"
}
}
HYPERLIQUID
28. GET /api/v1/hl/platform/stats
Platform aggregate stats. No parameters.
Response schema:
{
"data": {
"total_volume_usd": "number",
"total_trades": "number",
"active_traders": "number",
"smart_wallet_count": "number",
"unique_coins": "number"
}
}
29. GET /api/v1/hl/coins/trending
Trending coins by activity.
Parameters (query string):
| Param | Type | Default | Values | Required |
|---|---|---|---|---|
| timeframe | string | 24h | 1h, 4h, 12h, 24h, 7d | no |
| limit | integer | 20 | 1-100 | no |
Response schema:
{
"data": [
{
"coin": "string",
"volume_usd": "number",
"trade_count": "number",
"unique_traders": "number",
"long_short_ratio": "number",
"smart_wallet_count": "number",
"volume_change_pct": "number"
}
]
}
Known issue: timeframe=24h often returns empty. Use timeframe=7d as fallback.
30. GET /api/v1/hl/coins/list
All traded coins with 7d stats.
Parameters (query string):
| Param | Type | Default | Values | Required |
|---|---|---|---|---|
| limit | integer | 100 | 1-500 | no |
Response schema:
{
"data": [
{
"coin": "string",
"volume_usd": "number",
"trade_count": "number",
"unique_traders": "number"
}
]
}
31. GET /api/v1/hl/coins/volume-heatmap
Volume by coin and hour.
Parameters (query string):
| Param | Type | Default | Values | Required |
|---|---|---|---|---|
| timeframe | string | 24h | 24h, 7d | no |
| limit | integer | 20 | 1-50 | no |
Response schema:
{
"data": [
{
"coin": "string",
"bucket": "string",
"volume_usd": "number",
"trade_count": "number",
"smart_volume_usd": "number"
}
]
}
32. GET /api/v1/hl/traders/leaderboard
Ranked trader leaderboard.
Parameters (query string):
| Param | Type | Default | Values | Required |
|---|---|---|---|---|
| timeframe | string | all | 1d, 7d, 30d, all | no |
| sort_by | string | pnl | pnl, roi, win_rate, volume | no |
| sort_order | string | desc | desc, asc | no |
| min_trades | integer | 10 | >= 1 | no |
| limit | integer | 25 | 1-100 | no |
Response schema:
{
"data": [
{
"trader": "string",
"total_pnl": "number",
"total_volume": "number",
"total_trades": "number",
"winning_trades": "number",
"win_rate": "number",
"roi_pct": "number",
"smart_score": "number"
}
]
}
33. POST /api/v1/hl/traders/profile
Full trader dossier.
Request body (JSON):
| Field | Type | Default | Values | Required |
|---|---|---|---|---|
| trader | string | – | 0x address | yes |
| days | integer | 30 | 1-365 | no |
| trades_limit | integer | 50 | 1-500 | no |
Response schema:
{
"data": {
"trader": "string",
"stats": "object",
"coin_breakdown": "array",
"daily_pnl": "array",
"recent_trades": "array"
}
}
Known issue: Intermittent 500 errors. Fallback: use leaderboard + pnl-by-coin.
34. POST /api/v1/hl/traders/compare
Compare 2-5 traders.
Request body (JSON):
| Field | Type | Default | Values | Required |
|---|---|---|---|---|
| traders | string[] | – | 2-5 0x addresses | yes |
Response schema:
{
"data": {
"traders": "array of trader profiles",
"shared_coins": "array",
"comparison_winners": "object"
}
}
Pricing note: Cost scales with trader count: base * traders.length / 2.
35. GET /api/v1/hl/traders/daily-pnl
Daily PnL time series with streaks.
Parameters (query string):
| Param | Type | Default | Values | Required |
|---|---|---|---|---|
| trader | string | – | 0x address | yes |
| days | integer | 30 | 1-365 | no |
Response schema:
{
"data": [
{
"date": "string",
"pnl": "number",
"volume": "number",
"trades": "number",
"cumulative_pnl": "number",
"streak": "number"
}
]
}
36. POST /api/v1/hl/traders/pnl-by-coin
Per-coin PnL breakdown. Shows realized (closed) PnL only.
Request body (JSON):
| Field | Type | Default | Values | Required |
|---|---|---|---|---|
| trader | string | – | 0x address | yes |
| days | integer | 90 | 1-365 | no |
Response schema:
{
"data": [
{
"coin": "string",
"pnl": "number",
"volume": "number",
"trades": "number",
"winning_trades": "number",
"win_rate": "number"
}
]
}
Note: Only realized (closed) PnL. Unrealized PnL from open positions is not available.
37. GET /api/v1/hl/traders/fresh-whales
New high-volume wallets (experienced traders creating new accounts, institutional desks, or insiders).
Parameters (query string):
| Param | Type | Default | Values | Required |
|---|---|---|---|---|
| max_wallet_age_days | integer | 14 | 1-90 | no |
| min_volume | number | 100000 | >= 0 | no |
| min_pnl | number | 0 | any | no |
| limit | integer | 25 | 1-100 | no |
Response schema:
{
"data": [
{
"trader": "string",
"first_trade": "string",
"wallet_age_days": "number",
"total_pnl": "number",
"total_volume": "number",
"total_trades": "number",
"winning_trades": "number"
}
]
}
38. GET /api/v1/hl/trades/whales
Large trades.
Parameters (query string):
| Param | Type | Default | Values | Required |
|---|---|---|---|---|
| min_usd | number | 50000 | >= 1 | no |
| timeframe | string | 24h | 1h, 4h, 12h, 24h, 7d | no |
| coin | string | – | uppercase symbol (e.g. BTC) | no |
| side | string | – | Open Long, Open Short, Close Long, Close Short | no |
| direction | string | – | Long, Short | no |
| smart_money_only | boolean | false | true, false | no |
| limit | integer | 50 | 1-200 | no |
Response schema:
{
"data": [
{
"trader": "string",
"coin": "string",
"side": "string",
"direction": "string",
"price": "number",
"size": "number",
"usd_value": "number",
"closed_pnl": "number",
"timestamp": "string",
"smart_score": "number"
}
]
}
39. GET /api/v1/hl/trades/feed
Chronological trade feed for a coin.
Parameters (query string):
| Param | Type | Default | Values | Required |
|---|---|---|---|---|
| coin | string | – | uppercase symbol | yes |
| limit | integer | 100 | 1-500 | no |
Response schema:
{
"data": [
{
"trader": "string",
"coin": "string",
"side": "string",
"direction": "string",
"price": "number",
"size": "number",
"usd_value": "number",
"closed_pnl": "number",
"timestamp": "string"
}
]
}
40. GET /api/v1/hl/trades/long-short-ratio
Long/short volume ratio time series.
Parameters (query string):
| Param | Type | Default | Values | Required |
|---|---|---|---|---|
| coin | string | – | uppercase symbol | yes |
| timeframe | string | 7d | 24h, 7d, 30d | no |
| bucket_size | string | 4h | 1h, 4h, 12h, 1d | no |
Response schema:
{
"data": [
{
"bucket": "string",
"long_volume": "number",
"short_volume": "number",
"long_short_ratio": "number",
"smart_long_volume": "number",
"smart_short_volume": "number",
"smart_long_short_ratio": "number"
}
]
}
Known issue: May return all zeros. Fallback: reconstruct from /hl/trades/whales by counting long vs short volume.
41. GET /api/v1/hl/smart-wallets/list
Smart wallet list.
Parameters (query string):
| Param | Type | Default | Values | Required |
|---|---|---|---|---|
| sort_by | string | score | score, pnl, volume | no |
| limit | integer | 50 | 1-200 | no |
Response schema:
{
"data": [
{
"trader": "string",
"score": "number",
"total_pnl": "number",
"total_volume": "number",
"total_trades": "number",
"win_rate": "number"
}
]
}
42. GET /api/v1/hl/smart-wallets/activity
Smart wallet recent trades.
Parameters (query string):
| Param | Type | Default | Values | Required |
|---|---|---|---|---|
| timeframe | string | 24h | 1h, 4h, 12h, 24h, 7d | no |
| min_score | integer | 60 | 0-100 | no |
| limit | integer | 100 | 1-500 | no |
Response schema:
{
"data": {
"period_summary": "object",
"trades": "array"
}
}
43. GET /api/v1/hl/smart-wallets/signals
Aggregated directional signals by coin.
Parameters (query string):
| Param | Type | Default | Values | Required |
|---|---|---|---|---|
| timeframe | string | 24h | 6h, 12h, 24h, 7d | no |
| min_score | integer | 60 | 0-100 | no |
| limit | integer | 20 | 1-50 | no |
Response schema:
{
"data": [
{
"coin": "string",
"direction": "string",
"smart_wallet_count": "number",
"total_volume": "number",
"avg_score": "number",
"top_traders": "array"
}
]
}
Known issue: timeframe=24h often returns empty. Use timeframe=7d as fallback.
44. GET /api/v1/hl/pressure/pairs
Long/short pressure with smart positions.
Parameters (query string):
| Param | Type | Default | Values | Required |
|---|---|---|---|---|
| coins | string | – | comma-separated (defaults to top 10) | no |
| trades_limit | integer | 20 | 1-100 | no |
Response schema:
{
"data": {
"coins": [
{
"coin": "string",
"long_pressure": "number",
"short_pressure": "number",
"long_avg_entry": "number",
"short_avg_entry": "number",
"long_smart_count": "number",
"short_smart_count": "number",
"smart_positions": "array"
}
]
}
}
45. GET /api/v1/hl/pressure/summary
Pressure summary across all coins. No parameters.
Response schema:
{
"data": {
"coins": [
{
"coin": "string",
"long_pressure": "number",
"short_pressure": "number",
"long_percent": "number",
"short_percent": "number",
"long_avg_entry": "number",
"short_avg_entry": "number"
}
]
}
}
METEORA
46. GET /api/v1/meteora/pools/trending
Trending pools by volume spike.
Parameters (query string):
| Param | Type | Default | Values | Required |
|---|---|---|---|---|
| pool_type | string | all | dlmm, damm_v2, all | no |
| timeframe | string | 24h | 24h, 7d | no |
| limit | integer | 20 | 1-100 | no |
Response schema:
{
"data": [
{
"pool_address": "string",
"pool_type": "string",
"token_x": "string",
"token_y": "string",
"volume_usd": "number",
"event_count": "number",
"unique_lps": "number",
"volume_change_pct": "number"
}
]
}
Known issue: May contain duplicate entries. Deduplicate by pool_address.
47. GET /api/v1/meteora/pools/top
Top pools by volume, fees, or LP count.
Parameters (query string):
| Param | Type | Default | Values | Required |
|---|---|---|---|---|
| pool_type | string | all | dlmm, damm_v2, all | no |
| sort_by | string | volume | volume, lp_count, events, fees | no |
| timeframe | string | 7d | 24h, 7d, 30d | no |
| limit | integer | 20 | 1-100 | no |
Response schema:
{
"data": [
{
"pool_address": "string",
"pool_type": "string",
"token_x": "string",
"token_y": "string",
"volume_usd": "number",
"event_count": "number",
"unique_lps": "number",
"total_fees_usd": "number"
}
]
}
48. GET /api/v1/meteora/pools/search
Search pools by address or token name.
Parameters (query string):
| Param | Type | Default | Values | Required |
|---|---|---|---|---|
| query | string | – | pool address or token name | yes |
| pool_type | string | all | dlmm, damm_v2, all | no |
| limit | integer | 10 | 1-50 | no |
Response schema:
{
"data": [
{
"pool_address": "string",
"pool_type": "string",
"token_x": "string",
"token_y": "string",
"volume_usd": "number",
"event_count": "number",
"unique_lps": "number"
}
]
}
49. GET /api/v1/meteora/pools/detail
Full pool detail.
Parameters (query string):
| Param | Type | Default | Values | Required |
|---|---|---|---|---|
| pool_address | string | – | Solana pubkey | yes |
| pool_type | string | – | dlmm, damm_v2 (auto-detected if omitted) | no |
Response schema:
{
"data": {
"pool_address": "string",
"pool_type": "string",
"token_x": "string",
"token_y": "string",
"total_volume_usd": "number",
"total_events": "number",
"unique_lps": "number",
"volume_by_action": "object",
"net_liquidity_usd": "number"
}
}
50. GET /api/v1/meteora/pools/volume-history
Volume time series.
Parameters (query string):
| Param | Type | Default | Values | Required |
|---|---|---|---|---|
| pool_address | string | – | Solana pubkey | yes |
| pool_type | string | – | dlmm, damm_v2 (auto-detected if omitted) | no |
| timeframe | string | 7d | 24h, 7d, 30d | no |
| bucket_size | string | 4h | 1h, 4h, 1d | no |
Response schema:
{
"data": [
{
"bucket": "string",
"volume_usd": "number",
"event_count": "number",
"action_breakdown": "object"
}
]
}
51. GET /api/v1/meteora/pools/events
Chronological event feed.
Parameters (query string):
| Param | Type | Default | Values | Required |
|---|---|---|---|---|
| pool_address | string | – | Solana pubkey | yes |
| pool_type | string | – | dlmm, damm_v2 (auto-detected if omitted) | no |
| limit | integer | 100 | 1-500 | no |
Response schema:
{
"data": [
{
"owner": "string",
"pool_address": "string",
"event_type": "string",
"usd_total": "number",
"timestamp": "string",
"tx_id": "string"
}
]
}
52. GET /api/v1/meteora/pools/fee-analysis
Fee claiming analysis.
Parameters (query string):
| Param | Type | Default | Values | Required |
|---|---|---|---|---|
| pool_address | string | – | Solana pubkey | yes |
| pool_type | string | – | dlmm, damm_v2 (auto-detected if omitted) | no |
| timeframe | string | 7d | 24h, 7d, 30d | no |
Response schema:
{
"data": {
"pool_address": "string",
"total_fees_claimed": "number",
"unique_claimers": "number",
"time_series": "array",
"top_claimers": "array"
}
}
53. GET /api/v1/meteora/lps/top
Top LPs leaderboard.
Parameters (query string):
| Param | Type | Default | Values | Required |
|---|---|---|---|---|
| pool_type | string | all | dlmm, damm_v2, all | no |
| sort_by | string | volume | volume, pool_count, events | no |
| timeframe | string | 30d | 7d, 30d | no |
| limit | integer | 25 | 1-100 | no |
Response schema:
{
"data": [
{
"owner": "string",
"total_volume_usd": "number",
"pool_count": "number",
"event_count": "number",
"pool_types": ["string"]
}
]
}
Known issue: sort_by=fees may return 500. Use sort_by=volume as fallback.
54. POST /api/v1/meteora/lps/profile
Full LP dossier.
Request body (JSON):
| Field | Type | Default | Values | Required |
|---|---|---|---|---|
| owner | string | – | Solana pubkey | yes |
| pool_type | string | all | dlmm, damm_v2, all | no |
| events_limit | integer | 50 | 1-500 | no |
Response schema:
{
"data": {
"owner": "string",
"summary": "object",
"pool_breakdown": "array",
"recent_events": "array"
}
}
55. GET /api/v1/meteora/lps/whales
Large LP events.
Parameters (query string):
| Param | Type | Default | Values | Required |
|---|---|---|---|---|
| pool_type | string | all | dlmm, damm_v2, all | no |
| min_usd | number | 10000 | >= 1 | no |
| timeframe | string | 24h | 24h, 7d, 30d | no |
| limit | integer | 50 | 1-200 | no |
Response schema:
{
"data": [
{
"owner": "string",
"pool_address": "string",
"pool_type": "string",
"event_type": "string",
"usd_total": "number",
"timestamp": "string"
}
]
}
56. POST /api/v1/meteora/lps/compare
Compare 2-5 LPs.
Request body (JSON):
| Field | Type | Default | Values | Required |
|---|---|---|---|---|
| owners | string[] | – | 2-5 Solana pubkeys | yes |
| pool_type | string | all | dlmm, damm_v2, all | no |
Response schema:
{
"data": {
"lps": "array of LP profiles",
"shared_pools": "array",
"comparison_winners": "object"
}
}
Pricing note: Cost scales with LP count: base * owners.length / 2.
57. GET /api/v1/meteora/positions/active
Active LP positions.
Parameters (query string):
| Param | Type | Default | Values | Required |
|---|---|---|---|---|
| pool_address | string | – | Solana pubkey | no |
| owner | string | – | Solana pubkey | no |
| pool_type | string | all | dlmm, damm_v2, all | no |
| limit | integer | 50 | 1-200 | no |
Response schema:
{
"data": [
{
"owner": "string",
"pool_address": "string",
"pool_type": "string",
"position_address": "string",
"deposited_usd": "number",
"withdrawn_usd": "number",
"net_value_usd": "number",
"event_count": "number"
}
]
}
58. GET /api/v1/meteora/positions/history
Position event history (DLMM only).
Parameters (query string):
| Param | Type | Default | Values | Required |
|---|---|---|---|---|
| position_address | string | – | – | yes |
Response schema:
{
"data": {
"position_address": "string",
"events": [
{
"event_type": "string",
"usd_total": "number",
"timestamp": "string",
"tx_id": "string"
}
]
}
}
59. GET /api/v1/meteora/platform/stats
Platform-wide stats.
Parameters (query string):
| Param | Type | Default | Values | Required |
|---|---|---|---|---|
| pool_type | string | all | dlmm, damm_v2, all | no |
Response schema:
{
"data": {
"total_volume_usd": "number",
"total_events": "number",
"active_lps": "number",
"active_pools": "number",
"by_pool_type": "object"
}
}
60. GET /api/v1/meteora/platform/volume-heatmap
Volume by action/hour.
Parameters (query string):
| Param | Type | Default | Values | Required |
|---|---|---|---|---|
| pool_type | string | all | dlmm, damm_v2, all | no |
| timeframe | string | 24h | 24h, 7d | no |
Response schema:
{
"data": [
{
"action": "string",
"bucket": "string",
"pool_type": "string",
"volume_usd": "number",
"event_count": "number"
}
]
}
61. GET /api/v1/meteora/platform/metengine-share
MetEngine routing share.
Parameters (query string):
| Param | Type | Default | Values | Required |
|---|---|---|---|---|
| pool_type | string | all | dlmm, damm_v2, all | no |
| timeframe | string | 7d | 24h, 7d, 30d | no |
Response schema:
{
"data": {
"total_events": "number",
"metengine_events": "number",
"metengine_share_pct": "number",
"total_volume_usd": "number",
"metengine_volume_usd": "number"
}
}
62. GET /api/v1/meteora/dca/pressure
DCA accumulation pressure by token.
Parameters (query string):
| Param | Type | Default | Values | Required |
|---|---|---|---|---|
| token | string | – | specific mint address | no |
| timeframe | string | 1h | 1m, 5m, 30m, 1h, 6h, 24h | no |
Response schema (single token):
{
"data": {
"tokenMint": "string",
"timeframe": "string",
"buyVolume": "number",
"sellVolume": "number",
"netPressure": "number",
"score": "number"
}
}
Response schema (all tokens, when token omitted):
{
"data": {
"timeframe": "string",
"tokens": "array",
"lastUpdated": "string"
}
}
63. GET /api/v1/meteora/pools/smart-wallet
Pools with highest smart wallet LP activity.
Parameters (query string):
| Param | Type | Default | Values | Required |
|---|---|---|---|---|
| pool_type | string | all | dlmm, damm_v2, all | no |
| limit | integer | 20 | 1-100 | no |
| timeframe | string | 7d | 24h, 7d, 30d | no |
Response schema:
{
"data": {
"pools": [
{
"pool_address": "string",
"pool_type": "string",
"token_a": "string",
"token_b": "string",
"smart_lp_count": "number",
"total_volume_usd": "number",
"smart_volume_usd": "number",
"smart_share_pct": "number"
}
]
}
}
Comparison to Self-Computation
Why call this API instead of computing it yourself
1. Proprietary scored dataset. MetEngine maintains wallet scoring models across all three platforms (Polymarket 0-100 composite score, Hyperliquid 0-100 smart score, Meteora LP smart score). These scores are computed from billions of historical trades, resolved positions, and behavioral patterns. An agent would need to: (a) index 574M+ Polymarket trades, (b) build and maintain a scoring pipeline, (c) store and update scores for millions of wallets. Self-computation cost: weeks of engineering + ongoing infrastructure.
2. Pre-aggregated materialized views. Queries that would require scanning 574M+ trade rows (capital flow by category, top performers, insider detection) run against pre-aggregated SummingMergeTree tables. A raw ClickHouse scan of the trades table would take 30-60 seconds and cost $0.50-2.00 in compute. The API returns results in 1-5 seconds for $0.01-0.08.
3. Cross-platform intelligence. Insider detection uses a 7-signal behavioral scoring system. Smart money consensus compares scored wallets against market prices. Capital flow tracks sector rotation across all categories. Building this from raw on-chain data requires indexing multiple chains, maintaining market metadata, and running continuous scoring pipelines.
4. Real-time on-chain data. The API indexes Polymarket (Polygon), Hyperliquid (L1), and Meteora (Solana) trade data with sub-minute latency. An agent would need RPC nodes on 3 chains, event parsing, and database infrastructure.
Cost comparison for a typical workflow (analyze a Polymarket market):
| Step | Self-Computation | MetEngine API |
|---|---|---|
| Find market | Scrape Polymarket frontend | GET /markets/search ($0.01) |
| Get smart money consensus | Index all trades, score wallets, aggregate | POST /markets/intelligence ($0.05) |
| Get price history | Parse on-chain events, build OHLCV | GET /markets/price-history ($0.01) |
| Find insider patterns | Build 7-signal detection pipeline | POST /markets/insiders ($0.05) |
| Total | Hours of compute + infra | $0.12, ~10 seconds |
Performance
| Metric | Value |
|---|---|
| p50 latency | 800ms |
| p95 latency | 3s |
| p99 latency | 8s |
| Handler timeout | 60s (no payment charged on timeout) |
| Max concurrent paid requests | 50 |
| Payment verification timeout | 5s |
| Rate limit (unpaid 402 requests) | IP-based, generous |
Data Freshness
| Platform | Freshness |
|---|---|
| Polymarket trades | Sub-minute (continuous indexing) |
| Polymarket wallet scores | Daily recompute |
| Hyperliquid trades | Sub-minute |
| Hyperliquid smart scores | Continuous (formula-based) |
| Meteora events | Sub-minute |
| Meteora LP scores | Daily recompute |
Error Handling
HTTP Status Codes
| Code | Meaning | Agent Action |
|---|---|---|
| 200 | Success. Data in { "data": ... }. Settlement proof in PAYMENT-RESPONSE header. |
Process data |
| 400 | Bad request (invalid params, malformed payment header) | Fix request params |
| 402 | Payment required (first request) or payment verification failed | Sign and re-send with payment, or check payment validity |
| 404 | Endpoint not found | Verify endpoint path against this document |
| 429 | Rate limit exceeded | Back off and retry |
| 500 | Internal server error | Retry once, then try fallback endpoint |
| 502 | Payment verification failed (facilitator error) | Retry |
| 503 | Server at capacity or payment service unavailable | Check Retry-After header, retry after delay |
| 504 | Query execution timeout. No payment charged. | Retry with narrower params or use fallback endpoint |
Error Response Format
{
"error": "Human-readable error message",
"reason": "Optional machine-readable reason (on 402 verification failures)"
}
Settlement Edge Cases
| Header | Meaning |
|---|---|
X-Payment-Settlement: failed |
Query succeeded but settlement failed. Data returned, no charge. Rare edge case. |
No PAYMENT-RESPONSE header on 200 |
Settlement was not attempted (should not happen in normal flow). |
Fallback Strategies
When an endpoint fails, use these alternatives:
| Failed Endpoint | Fallback |
|---|---|
| /markets/opportunities (504) | /markets/high-conviction |
| /wallets/top-performers (503 on 7d) | Try timeframe=24h |
| /markets/insiders (timeout) | /markets/trades with market filter |
| /hl/coins/trending (empty on 24h) | Use timeframe=7d |
| /hl/smart-wallets/signals (empty on 24h) | Use timeframe=7d |
| /hl/trades/long-short-ratio (all zeros) | Reconstruct from /hl/trades/whales by side |
| /hl/traders/profile (500) | /hl/traders/leaderboard + /hl/traders/pnl-by-coin |
| /meteora/lps/top?sort_by=fees (500) | Use sort_by=volume |
| /meteora/lps/profile (500) | /meteora/pools/fee-analysis for claimer data |
Health Check
GET https://agent.metengine.xyz/health
Free. No payment required. Returns:
{
"status": "ok | degraded",
"service": "data-agent",
"auth_mode": "x402",
"clickhouse": { "status": "ok | down" },
"postgres": { "status": "ok | down" },
"redis": { "status": "ok | down" },
"semaphore": {
"active": "number",
"waiting": "number",
"max": 250,
"timeouts_1m": "number"
},
"queries_1m": "object",
"cache_1m": "object",
"top_errors": "object",
"facilitator": "boolean",
"network": "mainnet"
}
status: "ok"means all backends are healthy.status: "degraded"means at least one backend is down. Check individual component statuses.facilitator: truemeans x402 payment processing is operational.semaphore.activenearsemaphore.maxmeans server is under heavy load (expect 503s).
Limitations
What this API does NOT do:
- No trade execution. Read-only analytics. Cannot place orders on any platform.
- No real-time streaming. Request/response only. No WebSocket feeds.
- No historical backfill on demand. Data starts from when MetEngine began indexing each platform.
- No unrealized PnL for Hyperliquid. Only closed (realized) PnL is available.
- No mark-to-market for Meteora positions. Net value is deposits minus withdrawals, not current market value.
- No Polymarket order book data. Trades only, not open orders or liquidity depth.
- No custom scoring models. Wallet scores use MetEngine’s proprietary models. Cannot be customized per agent.
- No cross-platform wallet linking. A Polygon address on Polymarket is not linked to a Solana address on Meteora even if controlled by the same entity.
- No token price feeds. This is not a price oracle. Market prices on Polymarket are implied probabilities (0-1).
- 63 endpoints only. If a path is not listed in this document, it does not exist.
Known Quirks
Polymarket
/markets/opportunitiesfrequently times out (504) under load. Use/markets/high-convictionas fallback./wallets/top-performers?timeframe=7dmay 503. Trytimeframe=24hbut note the narrower window./trades/whalesreturns REDEEM trades (resolved market payouts) alongside real trades. Filter byside=BUYorside=SELLto exclude. REDEEMs haveprice=1.00, side=REDEEM./markets/insiderssometimes times out. Use/markets/tradesfiltered to the market as fallback.- Wallet addresses MUST be lowercase.
condition_ididentifies a market. One condition_id maps to multipletoken_idvalues (one per outcome).- Price = implied probability (0 to 1). A price of 0.73 = 73% probability.
Hyperliquid
/hl/coins/trending?timeframe=24hand/hl/smart-wallets/signals?timeframe=24hoften return empty arrays. Default totimeframe=7d./hl/trades/long-short-ratiomay return all zeros. Reconstruct directional bias from/hl/trades/whales./hl/traders/profileintermittently 500s. Use leaderboard + pnl-by-coin as fallback./hl/traders/pnl-by-coinshows realized (closed) PnL only. Unrealized PnL is not available.- Coin symbols are uppercase base only:
BTC, notBTC-USDC. - Trader addresses are 0x-prefixed hex (case-insensitive).
closed_pnlis only non-zero on closing trades. Opening trades always haveclosed_pnl = 0.- Smart wallet threshold: score >= 85 (stricter than Polymarket’s 60).
Meteora
- DAMM v2 pools frequently show implausible fee rates (30-50% of volume). This is an artifact of the anti-sniper fee scheduler on new token launches. Separate DAMM v2 from DLMM results and flag anomalies.
/meteora/pools/trendingmay have duplicate entries. Deduplicate bypool_address./meteora/lps/top?sort_by=feesmay 500. Usesort_by=volumeas fallback.- Some token mints show as “???” (unresolved). Check pair context for identification.
- Addresses are Solana pubkeys (base58, case-sensitive).
- DLMM uses
token_x/token_yand PascalCase event types (AddLiquidity,RemoveLiquidity,Swap,ClaimFee). - DAMM v2 uses
token_a/token_band snake_case event types (add_liquidity,remove_liquidity,swap,claim_fee). - Position addresses only exist for DLMM, not DAMM v2.
Address Conventions
| Platform | Format | Case Sensitivity |
|---|---|---|
| Polymarket | 0x hex (Polygon) | Must be lowercase |
| Hyperliquid | 0x hex | Case-insensitive |
| Meteora | Base58 (Solana pubkey) | Case-sensitive |
Scoring Systems
Polymarket Wallet Scores (0-100)
| Tier | Score | Meaning |
|---|---|---|
| Elite | >= 80 | Top-tier historically profitable |
| Smart | 60-79 | Consistently profitable, signal-worthy |
| Average | 40-59 | Mixed track record |
| Novice | < 40 | New or losing traders |
Smart money threshold: score >= 60. Dumb money threshold: score < 30.
Hyperliquid Smart Scores (0-100)
score = min(log2(trade_count + 1) * 4, 40) // Activity (max 40)
+ (winning_trades / max(closing_trades, 1)) * 40 // Win rate (max 40)
+ min(if(pnl > 0, log10(pnl + 1) * 4, 0), 20) // Profitability (max 20)
Smart threshold: score >= 85.
Meteora LP Smart Scores (0-100)
win_ratio (0-35 pts) + volume (0-25 pts, log10-scaled) + avg_pnl% (0-30 pts) + experience (0-10 pts)
Minimum 3 closed positions required.