MetEngine data agent
npx skills add https://raw.githubusercontent.com/sendaifun/skills/main/skills/metengine/SKILL.mdPurpose
Real-time smart money analytics API for Polymarket prediction markets, Hyperliquid perpetual futures, and Meteora Solana LP/AMM pools.
Trusted sources
Execution flow
Recommended flow
- Read the prerequisites and overview sections.
- Follow the setup or quick-start path before attempting protocol writes.
- Validate outputs against the trusted source links before moving to production traffic.
Landing guidance
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 |
Failure handling
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
...
Full guide
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.mdAutomate 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/nullCheck 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.mdAgents 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.mdThis 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 -->// <paste the one-time setup + paidFetch function that worked>
## Endpoint History
<!-- Append after each session. Keep the last 10 entries. -->
| Date | Endpoint | Status | Latency | USDC Cost | Notes |
|------|----------|--------|---------|-----------|-------|
## Fallbacks Learned
<!-- Record which fallbacks were needed -->
| Endpoint | Issue | Fallback Used |
|----------|-------|---------------|
## Quirks Encountered
<!-- Record runtime surprises so future sessions avoid them -->Memory Update Rules
Agents MUST update the memory file:
- After first successful setup -- Record wallet path, public address, installed packages, working bootstrap code
- After every API call -- Append to Endpoint History (keep last 10 rows, prune older)
- When a fallback is used -- Record in Fallbacks Learned
- When a new quirk is discovered -- Record in Quirks Encountered
- At session end -- Update
Last Updatedtimestamp
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:
1. Read memory file
2. 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
3. If wallet or packages NOT set up:
a. Follow the Onboarding Path below
b. Update memory file after setupFirst-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()orfs.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/healthStep 2: Make a paid request
GET https://agent.metengine.xyz/api/v1/markets/trending?timeframe=24h&limit=5First 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)
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/kitPricing
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/pricingReturns 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/healthFree. 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.