MetEngine Data Agent API

SkillDatabases & data

Lets your agent pull real-time smart-money analytics for Polymarket, Hyperliquid, and Meteora trading markets.

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the MetEngine Data Agent API skill

About this capability

Real-time smart money analytics API for Polymarket prediction markets, Hyperliquid perpetual futures, and Meteora Solana LP/AMM pools. 63 endpoints. Pay-per-request via x402 on Solana Mainnet USDC. No API keys.

What this skill tells your AI

The instructions your AI receives, as published by internet-court/internet-court-skill in vendored/sendaifun/metengine/SKILL.md and read by ahel’s review.

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, not 0x6127...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:

  1. Wallet configuration -- path to the Solana keypair, public address, whether SOL/USDC balances were verified
  2. Package status -- whether @x402/core, @x402/svm, @solana/kit are already installed and where
  3. Client bootstrap -- a working code snippet from the last successful query (copy-paste ready)
  4. Endpoint learnings -- which endpoints worked, which timed out, which fallbacks were used
  5. 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

DateEndpointStatusLatencyUSDC CostNotes

Fallbacks Learned

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

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

TierBase Cost (USDC)Description
light$0.01Simple lookups, searches, feeds
medium$0.02Aggregated analytics, trending data
heavy$0.05Computed intelligence, leaderboards, scoring
whale$0.08Multi-entity comparisons, complex scans

Price Modifiers

Timeframe multiplier (applied to base cost):

TimeframeMultiplier
1h0.5x
4h0.7x
12h0.9x
24h / today1.0x
7d2.0x
30d3.0x
90d4.0x
365d / all5.0x

Limit multiplier: price *= max(1, requested_limit / default_limit)

Filter discounts (reduce scan cost):

FilterDiscountApplicable Endpoints
category0.7xtrending, top-performers, whales, capital-flow, high-conviction, opportunities
condition_id0.5xwhales, sentiment, participants, wallet activity
smart_money_only=true0.7xwhales, capital-flow, volume-heatmap (Polymarket + HL)
coin/coins0.7xHL whales, long-short-ratio, pressure/pairs
pool_type (not "all")0.7xAll Meteora endpoints with pool_type param
pool_address0.5xpool detail, volume-history, events, fee-analysis, positions/active

Special rules:

  • wallets/compare: price *= wallets.length / 2
  • hl/traders/compare: price *= traders.length / 2
  • meteora/lps/compare: price *= owners.length / 2
  • wallets/profile: both includes=1.0x, one include=0.7x, neither=0.4x
  • wallets/top-performers without 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)

#MethodPathTierDescription
1GET/api/v1/markets/trendingmediumTrending markets with volume spikes
2GET/api/v1/markets/searchlightSearch markets by keyword, category, status, or Polymarket URL
3GET/api/v1/markets/categorieslightAll categories with activity stats
4GET/api/v1/platform/statslightPlatform-wide aggregate stats
5POST/api/v1/markets/intelligenceheavyFull smart money intelligence report for a market
6GET/api/v1/markets/price-historylightOHLCV price/probability time series
7POST/api/v1/markets/sentimentmediumSentiment time series with smart money overlay
8POST/api/v1/markets/participantsmediumParticipant summary by scoring tier
9POST/api/v1/markets/insidersheavyInsider pattern detection (7-signal behavioral scoring)
10GET/api/v1/markets/tradeslightChronological trade feed for a market
11GET/api/v1/markets/similarwhaleRelated markets by wallet overlap
12GET/api/v1/markets/opportunitieswhaleMarkets where smart money disagrees with price
13GET/api/v1/markets/high-convictionheavyHigh-conviction smart money bets
14GET/api/v1/markets/capital-flowmediumCapital flow by category (sector rotation)
15GET/api/v1/trades/whalesmediumLarge whale trades
16GET/api/v1/markets/volume-heatmapmediumVolume distribution across categories/hours/days
17POST/api/v1/wallets/profileheavyFull wallet dossier with score, positions, trades
18POST/api/v1/wallets/activitymediumRecent trading activity for a wallet
19POST/api/v1/wallets/pnl-breakdownmediumPer-market PnL breakdown
20POST/api/v1/wallets/comparewhaleCompare 2-5 wallets side-by-side
21POST/api/v1/wallets/copy-traderswhaleDetect wallets copying a target wallet
22GET/api/v1/wallets/top-performersheavyLeaderboard by PnL, ROI, Sharpe, win rate, volume
23GET/api/v1/wallets/niche-expertsheavyTop wallets in a specific category
24GET/api/v1/markets/resolutionslightResolved markets with smart money accuracy
25GET/api/v1/wallets/alpha-callersheavyWallets that trade early on later-trending markets
26GET/api/v1/markets/dumb-moneymediumLow-score trader positions (contrarian indicator)
27GET/api/v1/wallets/insidersheavyGlobal insider candidates by behavioral score

Hyperliquid (18 endpoints)

#MethodPathTierDescription
28GET/api/v1/hl/platform/statslightPlatform aggregate stats
29GET/api/v1/hl/coins/trendingmediumTrending coins by activity
30GET/api/v1/hl/coins/listlightAll traded coins with 7d stats
31GET/api/v1/hl/coins/volume-heatmapmediumVolume by coin and hour
32GET/api/v1/hl/traders/leaderboardheavyRanked trader leaderboard
33POST/api/v1/hl/traders/profileheavyFull trader dossier
34POST/api/v1/hl/traders/comparewhaleCompare 2-5 traders
35GET/api/v1/hl/traders/daily-pnlmediumDaily PnL time series with streaks
36POST/api/v1/hl/traders/pnl-by-coinmediumPer-coin PnL breakdown (closed PnL only)
37GET/api/v1/hl/traders/fresh-whalesheavyNew high-volume wallets
38GET/api/v1/hl/trades/whalesmediumLarge trades
39GET/api/v1/hl/trades/feedlightChronological trade feed for a coin
40GET/api/v1/hl/trades/long-short-ratiomediumLong/short volume ratio time series
41GET/api/v1/hl/smart-wallets/listlightSmart wallet list with scores
42GET/api/v1/hl/smart-wallets/activitymediumSmart wallet recent trades
43GET/api/v1/hl/smart-wallets/signalsheavyAggregated directional signals by coin
44GET/api/v1/hl/pressure/pairsheavyLong/short pressure with smart positions
45GET/api/v1/hl/pressure/summarymediumPressure summary across all coins

Meteora (18 endpoints)

#MethodPathTierDescription
46GET/api/v1/meteora/pools/trendingmediumTrending pools by volume spike
47GET/api/v1/meteora/pools/topmediumTop pools by volume, fees, or LP count
48GET/api/v1/meteora/pools/searchlightSearch pools by address or token name
49GET/api/v1/meteora/pools/detailmediumFull pool detail
50GET/api/v1/meteora/pools/volume-historylightVolume time series
51GET/api/v1/meteora/pools/eventslightChronological event feed
52GET/api/v1/meteora/pools/fee-analysismediumFee claiming analysis
53GET/api/v1/meteora/lps/topheavyTop LPs leaderboard
54POST/api/v1/meteora/lps/profileheavyFull LP dossier
55GET/api/v1/meteora/lps/whalesmediumLarge LP events
56POST/api/v1/meteora/lps/comparewhaleCompare 2-5 LPs
57GET/api/v1/meteora/positions/activemediumActive LP positions
58GET/api/v1/meteora/positions/historylightPosition event history (DLMM only)
59GET/api/v1/meteora/platform/statslightPlatform-wide stats
60GET/api/v1/meteora/platform/volume-heatmapmediumVolume by action/hour
61GET/api/v1/meteora/platform/metengine-sharelightMetEngine routing share
62GET/api/v1/meteora/dca/pressuremediumDCA accumulation pressure by token
63GET/api/v1/meteora/pools/smart-walletheavyPools 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):

ParamTypeDefaultValuesRequired
timeframestring24h1h, 4h, 12h, 24h, 7dno
categorystring-any valid categoryno
sort_bystringvolume_spikevolume_spike, trade_count, smart_money_inflowno
limitinteger201-100no

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

ParamTypeDefaultValuesRequired
querystring-keyword or Polymarket URLno
categorystring-any valid categoryno
statusstringactiveactive, closing_soon, resolvedno
has_smart_money_signalboolean-true, falseno
sort_bystringrelevanceend_date, volume, relevanceno
limitinteger201-100no

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

ParamTypeDefaultValuesRequired
include_statsbooleantruetrue, falseno
timeframestring24h24h, 7dno

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

ParamTypeDefaultValuesRequired
timeframestring24h24h, 7d, 30dno

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

FieldTypeDefaultValuesRequired
condition_idstring--yes
top_n_walletsinteger101-50no

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"
    }
  }
}

Shortened here. Read the whole file on GitHub.

Signals

GitHub stars
6k
Forks
104
Last commit
Aug 2026

Others that do the same job

Advanced
Catalog kind
skill
Gateway key
metengine-data-agent
Source
github.com/internet-court/internet-court-skill