On this page
Platform volume
GET /v1/me/platform-volume answers a single question: how much trading
volume did my platform route over this window? It rolls up every fill that
went through a builder you registered — across Hyperliquid and Polymarket —
into a total plus a per-venue split, including the builder fee the venue
credited you (your platform's revenue).
Unlike /v1/me/stats, which ranks your wallets
individually, this endpoint is a platform-level rollup: it's always
attribution-scoped, so the numbers describe your platform's turnover, not one
trader's activity. Use /me/stats for a per-wallet leaderboard; use
/me/platform-volume for the one-line "what did my platform do" figure.
When to use this
- Platform turnover dashboard. Show total volume routed this day / week / month, with the Hyperliquid vs Polymarket split.
- Revenue tracking.
builderFeeUsdis the fee the venue credited your builder — your platform's earned revenue on that volume (Hyperliquid). - Reporting. A single windowed call instead of summing
/me/statsrows yourself.
Request
bash# Platform turnover over a window
curl -H "Authorization: Bearer art_live_<your-key>" \
"https://api.artery.questflow.ai/v1/me/platform-volume?from=2026-06-01T00:00:00Z&to=2026-06-16T00:00:00Z"Query parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
from | string | no | ISO-8601 window start (inclusive). Omit for all-time. |
to | string | no | ISO-8601 window end (exclusive). Omit for "until now". |
from/to are validated as ISO-8601; from > to is 400 validation_failed.
This endpoint is always platform-scoped — every fill is attributed through a
builder you registered (portal → Wallets → Platform Attributions, or
POST /v1/me/platform-attributions). With no builder registered it returns
400 no_platform_attribution rather than an all-zero body you might misread as
"no activity".
Response
jsonc{
"window": { "from": "2026-06-01T00:00:00.000Z", "to": "2026-06-16T00:00:00.000Z" },
"total": {
"volumeUsd": 24891.5,
"tradeCount": 318,
"builderFeeUsd": 3.73
},
"byVenue": [
{
"venue": "hyperliquid",
"volumeUsd": 21452.1,
"tradeCount": 290,
"builderFeeUsd": 3.73,
"walletCount": 12
},
{
"venue": "polymarket",
"volumeUsd": 3439.4,
"tradeCount": 28,
"builderFeeUsd": null,
"walletCount": 4
}
]
}Field semantics
volumeUsd— traded notional in USD attributed to your platform over[from, to). For Hyperliquid it isΣ(px × sz)from HL's authoritative per-builder export; for Polymarket it isΣ(price × qty)over on-chain fills whose order-level builder matches yours.builderFeeUsd— the fee the venue credited your builder on that volume — your platform's revenue. Hyperliquid only; Polymarket per-fill fees aren't tracked, so it isnullfor that venue (and excluded fromtotal.builderFeeUsd).tradeCount— number of attributed fills over the window.walletCount— how many of your registered wallets of that venue had at least one attributed fill in the window.
total is the additive sum across venues. A venue row appears only when your org
has at least one registered wallet of that venue.
Freshness
- Hyperliquid numbers come from HL's authoritative per-builder export, which publishes on a ~1–2 day lag — so very recent HL volume may not be reflected yet. This is the same authoritative source HL itself uses to pay builder rewards, so the figures reconcile exactly once published.
- Polymarket numbers come from on-chain fills ingested in real time.
Caching
Responses carry cache-control: private, max-age=15, stale-while-revalidate=30.
Error responses
| HTTP | error.code | When |
|---|---|---|
| 400 | validation_failed | Bad from/to (not ISO-8601, or from > to). |
| 400 | no_platform_attribution | No builder registered for any of your wallets' venues. |
| 401 | unauthenticated | Missing / invalid Authorization header. |
| 403 | insufficient_scope | Key lacks the read scope. |
| 429 | quota_exceeded | Over the pnl.read SKU quota. |
Quota
Metered under the pnl.read SKU — each successful response counts as 1 unit.
Per-tier caps live on the rate limits page.