API reference
The v1 API, kept for existing integrations. New work should use v2.
v1 is frozen
v1 is deprecated and stops answering on April 16, 2027. Every v1 response carries Deprecation and Sunset headers. Move to v2 before then.
Migrating from v1 maps every v1 route to its v2 successor and lists what changed. Base URL: https://polywhaler.com/api/v1.
Trades#
Polymarket trades from $2,000 and Kalshi trades from $5,000 ($10,000 for sports and 15-minute or hourly markets), with insider scores on Polymarket buys and full market context.
GET /trades#
/api/v1/tradesList whale trades
Paginated list of whale trades. Cursor-based pagination using the last item's timestamp. Covers both venues: Polymarket (default) and Kalshi (venue=kalshi or venue=all). Kalshi rows carry venue: "kalshi", the Kalshi trade id as transactionHash, and the trader's Kalshi identity as proxyWallet; they have no insider scores. Polymarket SELL trades are not scored either (insiderScore is null). There is no size floor beyond what is stored: Polymarket trades from $2,000; Kalshi trades from $5,000, or $10,000 for sports and for 15-minute and hourly markets. wallet, min_insider_score, and the trader-quality filters are Polymarket-only: with venue=all they silently narrow results to Polymarket, and with venue=kalshi they 400.
- limitinteger · query
Default 100, max 500.
- cursorstring · query
Unix-seconds timestamp from a prior
nextCursor. - frominteger | ISO 8601 · query
Inclusive lower bound on
timestamp. - tointeger | ISO 8601 · query
Inclusive upper bound on
timestamp. - venuestring · query
polymarket(default),kalshi, orall(merged, newest first). - walletstring · query
Filter by proxy wallet address (case-insensitive). Polymarket only.
- categorystring · query
Market category, comma-separated for multiple (e.g.
crypto,politics). - sportsstring · query
include(default),exclude(hide sports/esports, matching the dashboard), oronly. - sidestring · query
BUYorSELL. - min_amountnumber · query
Minimum trade USD value. No default; Kalshi rows never go below their $5,000 floor.
- min_insider_scorenumber · query
Minimum insider score (0-100). Polymarket only.
- max_probabilitynumber · query
Only trades entered strictly below this price (0-1 exclusive) — the longshot filter.
- min_smart_moneynumber · query
Minimum smoothed smart-money score (0-100) of the trading wallet. Polymarket only.
- min_win_ratenumber · query
Minimum smoothed win rate (0-100) of the trading wallet. Polymarket only.
- max_rankinteger · query
Only wallets at or above this leaderboard rank (e.g.
100= Top 100). Polymarket only. - includestring · query
Comma-separated.
trader_qualityattaches the wallet's smart-money score, win rate, rank, and tier to each Polymarket trade (attached automatically when a quality filter is set). - event_slugstring · query
Polymarket event slug (Kalshi: matches the ticker).
- market_slugstring · query
Polymarket market slug (Kalshi: matches the ticker).
GET /trades/{hash}#
/api/v1/trades/{hash}Get a single trade
Returns one Polymarket trade with the full insider-score breakdown (total plus a factors array, each factor with its points out of maxPoints; null for unscored trades), any LLM context score, and, once the market has resolved, a resolution object with win/loss, P&L, ROI, and the vindication flag. resolution is null while the market is open.
- hashstring · pathRequired
Polygon transaction hash.
Outcomes#
Resolved trade results — win/loss, P&L, ROI, vindication. The backtesting surface.
GET /outcomes#
/api/v1/outcomesList resolved trade outcomes
Polymarket whale trades whose markets have resolved, with entry/exit price, dollar P&L, ROI, hold duration, and the vindication flag (a suspicious low-probability trade that won). Each row embeds the originating trade's market context. Cursor-paginated on trade timestamp, newest first.
- limitinteger · query
Default 100, max 500.
- cursorstring · query
Unix-seconds trade timestamp from a prior
nextCursor. - frominteger | ISO 8601 · query
Inclusive lower bound on trade timestamp.
- tointeger | ISO 8601 · query
Inclusive upper bound on trade timestamp.
- walletstring · query
Filter by wallet address (case-insensitive).
- event_slugstring · query
Polymarket event slug.
- statusstring · query
win,loss,pending,cancelled, orinvalid. - vindicatedboolean · query
true= only vindicated trades (the Calls feed),false= exclude them. - min_roinumber · query
Minimum ROI percent.
Wallets#
Whale profiles, trade history, and coordinated-trading cluster detection.
GET /wallets/{addr}#
/api/v1/wallets/{addr}Get a wallet profile
Aggregated stats, global leaderboard rank, category breakdown, trading patterns, and risk profile. smartMoneyScore is the smoothed value shown on the dashboard; smartMoneyScoreRaw is the un-smoothed daily value. The rank is computed against smoothed_smart_money_score with a realized-P&L tiebreaker, matching the leaderboard UI. winRate is a percentage (0-100) of decisive closed positions won; recentProfitLoss is realized P&L on positions closed in the last 90 days (the board's 90d P&L). Pass include=… to opt into extra data.
- addrstring · pathRequired
Wallet address (case-insensitive).
- includestring · query
Comma-separated.
portfolioadds live Polymarket portfolio summary (~300ms).walletAgeadds on-chain wallet age via Polygonscan (~200ms; cached).snapshotsaddsrankHistory(last 180 days) andscoreHistory(last 30 days) from the daily snapshot table.
GET /wallets/{addr}/positions#
/api/v1/wallets/{addr}/positionsGet live Polymarket positions
Live current + closed positions for a wallet, fetched directly from Polymarket. Includes aggregated portfolio summary (value, unrealized + realized P&L, win/loss counts). On closed positions, totalBought is shares (as Polymarket reports it) and costUsd is what the position cost in dollars; avgRoiPercent is realized P&L over the summed costUsd.
- addrstring · pathRequired
Wallet address (case-insensitive).
- statusstring · query
current,closed, orall(default). - limitinteger · query
Override Polymarket page size. Default 1000 current / 2000 closed.
GET /wallets/{addr}/trades#
/api/v1/wallets/{addr}/tradesList a wallet's trades
Paginated trade history for one wallet.
- addrstring · pathRequired
Wallet address (case-insensitive).
- limitinteger · query
Default 100, max 500.
- cursorstring · query
Unix-seconds timestamp from a prior
nextCursor. - frominteger | ISO 8601 · query
Inclusive lower bound on
timestamp. - tointeger | ISO 8601 · query
Inclusive upper bound on
timestamp. - sidestring · query
BUYorSELL.
GET /wallets/{addr}/cluster#
/api/v1/wallets/{addr}/clusterGet coordinated clusters
Detected coordinated trading groups (clusters) that include this wallet.
- addrstring · pathRequired
Wallet address (case-insensitive).
Leaderboard#
Smart-money rankings across all tracked wallets.
GET /leaderboard#
/api/v1/leaderboardList top traders
Offset-paginated, ranked by smoothed smart-money score (matches the dashboard). smartMoneyScore is the smoothed display value and smartMoneyScoreRaw the un-smoothed daily value. winRate (a percentage, 0-100), totalProfitLoss (lifetime realized) and recentProfitLoss (realized over the last 90 days) are raw, the same figures the dashboard and /wallets/{addr} show. isProvisional=true flags wallets with fewer than 10 resolved trades, where the score is still stabilizing. Sports whales are excluded by default so ranks line up with the dashboard board and the leaderboardRank from /wallets/{addr}; pass exclude_sports=false to rank across every tracked wallet.
- limitinteger · query
Default 50, max 200.
- offsetinteger · query
Default 0.
- sort_bystring · query
smart_money_score(default; sorts on smoothed),win_rate,total_profit_loss,recent_profit_loss,avg_insider_score,total_trades. - sort_dirstring · query
ascordesc(default). - exclude_sportsboolean · query
Default
true(matches the dashboard).falseincludes sports whales; the response'ssportsExcludedfield reports what was applied. - includestring · query
Comma-separated.
snapshotsaddsprevRank(yesterday's rank) andscoreHistory(last 30 days) per entry.
Positions#
Aggregated positions rolled up across multiple trades.
GET /positions/aggregated#
/api/v1/positions/aggregatedList aggregated positions
Wallets that have built up sizable positions across many small trades. Cursor-paginated.
- limitinteger · query
Default 100, max 500.
- cursorstring · query
Unix-seconds timestamp from a prior
nextCursor. - frominteger | ISO 8601 · query
Lower bound on most-recent trade timestamp.
- tointeger | ISO 8601 · query
Upper bound on most-recent trade timestamp.
- walletstring · query
Filter by proxy wallet.
- categorystring · query
Market category.
- sidestring · query
BUYorSELL. - min_insider_scorenumber · query
Minimum aggregated insider score.
- min_valuenumber · query
Minimum total USD value.
Signals & Analytics#
Aggregated market intelligence: insider-risk events, capital flow, whale volume, and consensus.
GET /suspicious-events#
/api/v1/suspicious-eventsList insider-risk events
Events ranked by aggregated insider risk: high-insider-score BUY volume rolled up per event, with the concentrated outcomes and the top whales behind them. Same computation as the site's Suspicious Events feed. Sports are excluded unless requested via category.
- timestring · query
1h,6h,24h,7d(default), or30d. - categorystring · query
One category,
sports, ormarkets(everything except crypto). Default: all non-sports. - limitinteger · query
Default 50, max 100.
GET /smart-money-flow#
/api/v1/smart-money-flowGet net whale capital flow
Net whale capital in/out by category over the window (buys positive, sells negative), split into all-whale flow vs smart-money-only flow (wallets with smoothed smart-money score >= 60), plus the markets smart money is accumulating. Sports excluded.
- rangestring · query
24h,7d(default), or30d.
GET /markets#
/api/v1/marketsList markets by whale volume
Per-event whale-activity roll-up: total whale volume, buy/sell split, net flow, unique wallets, and volume-weighted insider score. Sorted by whale volume — where whale money is concentrating right now.
- timestring · query
1h,6h,24h(default),7d, or30d. - categorystring · query
Market category, comma-separated for multiple.
- sportsstring · query
include(default),exclude, oronly. - min_volumenumber · query
Minimum whale volume (USD) to include an event.
- limitinteger · query
Default 25, max 100.
GET /consensus#
/api/v1/consensusGet watchlist consensus positions
Positions where N or more whales on YOUR watchlist bought (or sold) the same outcome in the same market. Driven by the authenticated account's watchlist — manage it via /watchlist or the dashboard.
- timestring · query
Lookback window, e.g.
24h,7d(default),30d. - mininteger · query
Minimum whales converging on the position. Default 3, minimum 2.
- sidestring · query
BUY(default) orSELL.
Clusters#
Coordinated-trading (sybil) cluster detection across all tracked wallets.
GET /clusters#
/api/v1/clustersList detected clusters
Every detected coordinated-trading cluster, highest confidence first. Complements /wallets/{addr}/cluster (single-wallet lookup). Offset-paginated.
- limitinteger · query
Default 50, max 200.
- offsetinteger · query
Default 0.
- activestring · query
true(default),false, orall. - min_confidencenumber · query
Minimum confidence score (0-1).
- min_sizeinteger · query
Minimum member count.
- methodstring · query
Filter by detection method:
timing_correlation,outcome_correlation,funding_source,multi_factor, orsybil_farm. - flaggedboolean · query
Only clusters flagged (or not flagged) for review.
Watchlist#
Manage the wallets you follow — the same list that powers /consensus and the trade.followed_wallet webhook.
GET /watchlist#
/api/v1/watchlistList followed wallets
All wallets on your watchlist, newest first.
POST /watchlist#
/api/v1/watchlistFollow a wallet
Adds a wallet to your watchlist (idempotent upsert). Maximum 1,000 entries per account.
DELETE /watchlist#
/api/v1/watchlistUnfollow a wallet
Removes a wallet from your watchlist. Pass the wallet as a query parameter: ?wallet=0x….
- walletstring · queryRequired
Wallet address to unfollow.
Oracle#
The Prophet — daily newspaper-style market predictions.
GET /oracle#
/api/v1/oracleList Oracle editions
Daily editions of The Prophet, newest first.
- limitinteger · query
Default 30, max 90.
- beforeISO 8601 · query
Editions strictly before this date.
- afterISO 8601 · query
Editions strictly after this date.
Black Swan#
Geopolitical and macro risk-anomaly radar.
GET /black-swan#
/api/v1/black-swanGet latest radar snapshot
The most recent cached Black Swan radar snapshot. Returns 503 if no snapshot has been generated yet.
Bitcoin Forecast#
Prediction-market-implied Bitcoin price distributions: hourly model runs over every open Polymarket + Kalshi BTC price market, with per-market weights and a rolling year of run history for backtesting. Every payload carries modelVersion so model changes are detectable in your data; the full specification and version history are in the Developer portal for Quant subscribers (polywhaler.com/developer/methodology#bitcoin-forecast). btc-forecast/1.1.0 changed the fit (markets on a common time scale, near-certain prices left out), spreadPct, the platform prior and the insight types, so segment backtests by modelVersion.
GET /btc-forecast#
/api/v1/btc-forecastGet the latest forecast
The most recent model run: spot price, overall confidence, the full 1w/1m/3m/6m/1y horizon ladder (median, mean, 50/80/95% intervals, Bear/Base/Bull scenarios, implied vol, key-level probabilities), plus computed insights and consistency flags. Horizons with synthetic: true have no markets expiring nearby and are interpolated from the fitted maturities around them; their confidence is discounted accordingly. Density grids and the daily fan path are opt-in via include.
- horizonsstring · query
Comma-separated subset of
1w,1m,3m,6m,1y. Default: all. - includestring · query
Comma-separated extras:
density(120-point probability density per horizon),fan(daily median + quantile bands out to 1y).
GET /btc-forecast/history#
/api/v1/btc-forecast/historyList past forecast runs
Hourly model runs, newest first, with compact per-horizon summaries (no density grids or key levels). Runs are kept for 365 days. Built for backtesting: join each run's intervals against realized prices to score calibration. Use nextCursor as before for the next (older) page.
- limitinteger · query
Default 24, max 168 (one week of hourly runs).
- beforestring · query
ISO 8601: only runs strictly before this time.
- afterstring · query
ISO 8601: only runs strictly after this time.
- horizonsstring · query
Comma-separated subset of
1w,1m,3m,6m,1y. Default: all.
GET /btc-forecast/markets#
/api/v1/btc-forecast/marketsList supporting markets
Every market feeding the latest run, ordered by model weight descending, with the full weight-factor breakdown (liquidity, volume, spread, freshness, open interest, kind penalty, platform prior, cluster haircut, consistency penalty). spreadPct is the bid-ask spread relative to the price of the cheaper side of the book, and a tighter spread earns a higher spreadScore. derived: true marks touch markets converted to an ending-price estimate; flagged: true marks markets penalized by consistency checks. Markets priced as near-certain either way are left out of the fit and do not appear. Directional up-or-down dailies appear with weight 0 (insights side-channel only).
- platformstring · query
polymarketorkalshi. Default: both. - horizonstring · query
One of
1w,1m,3m,6m,1y. Default: all.
Exports#
Bulk CSV / JSON / Parquet exports of trade + outcome data, processed asynchronously.
GET /exports#
/api/v1/exportsList your export jobs
Most recent first.
- limitinteger · query
Default 20, max 100.
POST /exports#
/api/v1/exportsQueue a new export
Returns 202 with a job ID. Limit 3 concurrent queued/processing jobs per user. format is csv (default), json, or parquet. dataset selects what to export: trades (default; filters: from, to, wallet, category, side, min_amount, min_insider_score, event_slug, market_slug) or outcomes (resolved trade results; filters: from, to, wallet, event_slug, status, vindicated). Exports cover Polymarket data, up to 100,000 rows per job. Subscribe to the export.completed webhook to get the download link pushed instead of polling.
GET /exports/{id}#
/api/v1/exports/{id}Poll export job status
Polling-friendly. Once status is completed, fileUrl is a download link and expiresAt its expiry time, 7 days after the job finished. Download the file before then.
- idstring · pathRequired
Export job ID returned from POST.
Webhooks#
Manage outbound webhook subscriptions programmatically.
GET /webhooks#
/api/v1/webhooksList webhook subscriptions
All webhook subscriptions for your account.
POST /webhooks#
/api/v1/webhooksCreate a webhook subscription
Returns the signing secret in the response — store it immediately, it's never returned again. Optional filters narrow trade.* deliveries server-side: min_amount (USD floor), categories (allowlist), min_insider_score (0-100). Non-trade events ignore filters. Update or clear them later via PATCH.
GET /webhooks/{id}#
/api/v1/webhooks/{id}Get a subscription + delivery log
Returns the subscription with its 20 most recent delivery attempts.
- idstring · pathRequired
Webhook subscription ID.
PATCH /webhooks/{id}#
/api/v1/webhooks/{id}Update a webhook subscription
All fields optional; provide at least one. filters: null (or {}) clears delivery filters.
- idstring · pathRequired
Webhook subscription ID.
POST /webhooks/{id}/test#
/api/v1/webhooks/{id}/testSend a test delivery
Fires a signed sample payload at the subscription's endpoint so you can verify wiring and signature handling before going live. The body carries test: true and the request an X-Polywhaler-Test: true header. Not recorded in the delivery log and never retried.
- idstring · pathRequired
Webhook subscription ID.
DELETE /webhooks/{id}#
/api/v1/webhooks/{id}Delete a webhook subscription
Permanent. Delivery history is retained for audit.
- idstring · pathRequired
Webhook subscription ID.
Meta#
Account introspection and machine-readable API metadata.
GET /usage#
/api/v1/usageGet quota + account usage
Your current daily quota usage, the authenticated key's details, and account-level counts (active keys, webhooks, pending exports). This endpoint does NOT count against your quota, so it's safe to poll.
GET /openapi.json#
/api/v1/openapi.jsonGet the OpenAPI 3.1 spec
Machine-readable OpenAPI 3.1 document covering every endpoint and webhook event, generated from the same catalog as this reference. Served without authentication so SDK generators and API tooling can consume it directly.