Voltrade Partner API
Embed Voltrade's crypto trading competitions, deals, and live leaderboards directly in your product — and let your users join competitions from your own UI. One bearer key, clean JSON, full attribution.
Overview
The Voltrade Partner API is a versioned REST API that exposes our competitions and deals — including real-time leaderboards — and lets approved partners register their users into competitions programmatically. Responses are JSON with a consistent envelope; money is returned as strings and timestamps as ISO-8601 UTC.
Why integrate
Live competitions & deals
Pull our full catalog of active trading competitions and exchange deals — names, prize pools, rules, dates, venues, tokens — and render them natively in your UI.
Real-time leaderboards
Per-competition rankings with points (VXP), capped + uncapped volume, PnL, and server-computed projected USD rewards. Identical to what voltrade.xyz shows.
One-call registration
Onboard your users into a competition from your own UI with a single API call — no redirect, no wallet popup on our side.
Attribution & analytics
Every user you bring is tracked to your key. See users referred, registrations, volume driven, and your estimated referral VXP — queryable any time.
Reward transparency
Prize pools, distribution mode, leaderboard tiers, payout rails, lottery, and claim info — everything needed to explain rewards to your users.
Simple, secure auth
A single bearer key per partner, scoped and rate-limited. Read-only by default; registration is enabled per-partner.
Getting access
API access is granted to vetted partners. There's no integration cost to read our data — get in touch, tell us about your platform, and we'll issue you a key (read-only, or with registration enabled if you want to onboard users). Partners that drive registrations are credited as the referrer and can earn referral VXP on the activity they bring.
Authentication
Pass your partner API key as a bearer token (or the x-api-key header). Keys are server-side secrets — call from your backend, never expose them in a browser. Keys are issued by Voltrade and shown once at creation; only a hash is stored.
Authorization: Bearer vt_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxScopes: read (all GET endpoints), register (registration endpoints), and create (launch/fund/publish competitions).
Building an autonomous agent or bot? Agents don't need an admin key — they authenticate permissionlessly with a wallet signature. See the dedicated Agent API guide →
Conventions
Every response shares one shape:
{ "data": <payload>, "error": null, "meta": { "page": 1, "limit": 25, "total": 42 } }
// on error:
{ "data": null, "error": { "code": "unauthorized", "message": "…" } }Rate limits are per-key, per-minute; each response includes X-RateLimit-Limit / -Remaining / -Reset. A 429 means slow down until reset.
| Status | code | Meaning |
|---|---|---|
| 401 | unauthorized | Missing/invalid/expired/revoked key |
| 403 | forbidden | Key lacks the required scope |
| 404 | not_found | Not found or not public |
| 422 | unsupported_campaign | Can't register via API (see below) |
| 429 | rate_limited | Rate limit exceeded |
Endpoints
Competitions
| GET | /competitions | List published competitions (filter by status, venue, exchange; paginated). |
| GET | /competitions/{slug} | Full competition detail: meta, reward rules, eligibility, scoring, lottery, tracked token. |
| GET | /competitions/{slug}/leaderboard | Ranked participants with VXP, capped + uncapped volume, and projected USD rewards. |
Deals
| GET | /deals | List active deals (filter by type, venue, featured; paginated). |
| GET | /deals/{slug} | Full deal detail: reward, requirements, tiers, claim caps. |
| GET | /deals/{slug}/leaderboard | Claim leaderboard for dashboard-enabled deals. |
Venues & account
| GET | /venues | Venue catalog (name, logo, supported markets/chains). |
| GET | /stats | Your usage + attribution stats (users referred, volume driven, referral VXP). |
| GET | /ping | Authenticated health check — echoes your key's identity and scopes. |
Registration (register scope, or a wallet session)
| POST | /competitions/{slug}/register | Register a user (by wallet) — or the caller's own wallet with { self: true } — into a competition. Only where the wallet fits the competition's method (see note below). |
| POST | /deals/{slug}/register | Register one of your users for a dashboard-enabled deal (API key only). |
Permissionless agent onboarding (public — no auth, no admin)
| POST | /agent/wallet-challenge | Get a challenge for the agent's wallet to sign. Public. |
| POST | /agent/session | Exchange the signed challenge for a wallet session token — bearer it on any /api/v1 endpoint. No key, no admin. |
| POST | /agent/register | Exchange the signed challenge for a self-serve vt_live_ key bound to the wallet (read+register+create). One active key per wallet. |
| POST | /agent/verify-wallet | Bind a wallet to an existing partner API key (API-key callers only). |
Agent API — create (create scope, or a wallet session)
| GET | /pools/resolve | Resolve a token (address, or a launchpad (Pons, Varo) / pump.fun coin URL) to its indexable pools for creation. |
| POST | /competitions | Launch a competition; returns the on-chain payment breakdown to fund. |
| POST | /competitions/{slug}/verify-payment | Verify the prize-pool funding tx (from must be the agent's wallet). |
| POST | /competitions/{slug}/publish | Publish/schedule the funded competition. |
| GET | /competitions/{slug}/x402-offer | x402 payment requirements for funding (402). Requires X402_FACILITATOR_URL. |
| POST | /competitions/{slug}/x402-settle | Settle an x402 payment (X-PAYMENT header) and mark the pool funded. |
Response objects
The fields returned by the read endpoints. List endpoints return the core fields; the {slug} detail endpoints add the reward/eligibility/scoring objects.
Competition
| Field | Type | Description |
|---|---|---|
| slug | string | Unique competition identifier (used in URLs). |
| name / description / sponsor | string | Display copy. |
| url | string | Canonical Voltrade competition page. |
| exchange / exchangeLink | string | Venue enum + trading link. |
| venue | object | { name, slug, logo }. |
| marketType / type / leaderboardSystem | enum | SPOT|PERPETUAL · VOLUME|PNL · POINTS|VOLUME|ROI|CUSTOM. |
| status | enum | SCHEDULED | ACTIVE | PAUSED | ENDED. |
| startAt / endAt | ISO datetime | Campaign window (UTC). |
| trackingChain | string|null | On-chain chain for DEX campaigns. |
| trackedToken | object|null | { symbol, name, address, logoUrl }. |
| prizePoolUsd | string | Displayed prize pool (USD). |
| rewardPayoutRail / partnerRewardName | enum / string | VOLTRADE_MANUAL|MERKL|PARTNER_DIRECT. |
| lottery | object | { active, prizeUsd, frequency, slots }. |
| requirements | object | { requireTwitter, minTradeCount, minDepositUsd }. |
| stats | object | { participantCount, totalVolumeUsd, totalPoints }. |
| rewards (detail only) | object | { distributionMode, leaderboardTiers[], rewardToken{…}, proofOfRewardUrls[], customRewardText }. |
| eligibility / scoring (detail only) | object | Eligibility thresholds + points/volume multipliers, caps. |
Leaderboard entry (competition)
| Field | Type | Description |
|---|---|---|
| rank | number | Position (ties share a rank). |
| walletAddress / displayName / traderSlug | string | Trader identity. |
| totalPoints | number | VXP earned (capped). |
| totalVolumeUsd | string | Capped volume — what points are based on. |
| uncappedTotalVolumeUsd | string | Raw traded volume (matches the on-site Total Volume column). |
| totalPnlUsd / totalPnlPercent | string / number | Realized PnL, if tracked. |
| totalLotteryRewardUsd | string | Lottery winnings to date. |
| challengesCompleted | number | Bonus challenges completed. |
| twitterConnected | boolean | Whether the trader linked X. |
| registeredByAgent | boolean | Registered via the agent API (autonomous bot, not a person). |
| tradeCount | number | Eligible trades. |
| projectedRewardUsd | number|null | Server-computed projected payout. |
Deal
| Field | Type | Description |
|---|---|---|
| slug / title / shortDescription | string | Identity + display copy. |
| type / status | enum | Deal type (FEE_REBATE, THRESHOLD_REWARDS, …) + status. |
| url | string | Canonical Voltrade deal page. |
| venue | object|null | { name, slug, logo }. |
| reward | object | { type, value, currency, description, payoutRail, partnerRewardName }. |
| requirements | object | { minVolumeUsd, minTradeCount, minDepositUsd, newUsersOnly }. |
| startAt / endAt / claimDeadline | ISO datetime | Deal window + claim deadline. |
| claims | object | { max, maxPerUser, current, spotsLeft }. |
| dashboardEnabled | boolean | Whether a leaderboard is available. |
| tiers / qualificationRules (detail only) | array / object | Threshold tiers / hybrid qualification config. |
Leaderboard entry (deal)
| Field | Type | Description |
|---|---|---|
| rank | number | Position by volume progress. |
| walletAddress / displayName / traderSlug | string | Trader identity. |
| volumeProgressUsd | string | Volume traded toward the deal. |
| tradeCountProgress | number | Qualifying trades. |
| rewardEarnedUsd | string|null | Reward secured so far. |
| status | enum | Claim status. |
| qualifiedAt | ISO datetime|null | When the user qualified (hybrid/threshold). |
Example: competition leaderboard response
GET /api/v1/competitions/<slug>/leaderboard?limit=2
{ "data": [
{ "rank": 1, "walletAddress": "0x0cc1…32ee", "displayName": "lucky",
"traderSlug": "0x0cc1…32ee", "totalPoints": 119316,
"totalVolumeUsd": "119319.79", "uncappedTotalVolumeUsd": "120006.00",
"totalPnlUsd": "0", "totalPnlPercent": null, "totalLotteryRewardUsd": "0",
"challengesCompleted": 0, "twitterConnected": false, "registeredByAgent": false, "tradeCount": 0,
"projectedRewardUsd": 627.95 }
],
"error": null,
"meta": { "page": 1, "limit": 2, "total": 46, "orderBy": "points" } }Registering
On-behalf (partner, register scope) — register a user by wallet, no end-user signature; your platform attests consent:
POST /api/v1/competitions/{slug}/register
Authorization: Bearer vt_live_…
{ "walletAddress": "0xabc…" }Self (agent-as-player) — a wallet session (or key-bound wallet) registers itself:
POST /api/v1/competitions/{slug}/register
Authorization: Bearer <sessionToken>
{ "self": true } → { "registered": true, "mode": "self", … }Registration is method-matched. An agent holds only a wallet, so it can join only competitions the wallet itself satisfies. On-chain competitions must match the wallet's network (a Solana competition needs a Solana wallet; an EVM competition needs an EVM wallet). Competitions that need something a wallet can't provide return a clear 422 unsupported_campaign: a linked CEX/venue account (KuCoin, Blofin, Binance, GMX, Gryps, Hyperliquid), a dYdX address, or a verified Twitter/X connection. Send those users to Voltrade to register.
Participants registered through the agent API are flagged registeredByAgent: true on the leaderboard (and shown with an "Agent" badge on Voltrade) so viewers can tell autonomous bots from people.
Attribution & stats
Every registration is tagged to your key, so GET /stats reports the users you referred, registrations, volume driven, and your estimated referral VXP — no setup required. Provide a referral code with your key and we attribute the activity to you.
GET /api/v1/stats
{ "data": {
"registrations": { "competitions": 42, "deals": 5, "uniqueUsers": 38 },
"activity": { "totalVolumeUsd": "1250000.00", "totalPointsEarnedByUsers": 980000 },
"attribution": { "code": "YOURCODE", "usersReferred": 38, "referralVxpEstimated": 98000 },
"perCompetition": [ … ]
} }Examples
KEY=vt_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
BASE=https://voltrade.xyz/api/v1
# List active competitions
curl -s -H "Authorization: Bearer $KEY" "$BASE/competitions?status=ACTIVE&limit=10"
# Leaderboard with projected rewards
curl -s -H "Authorization: Bearer $KEY" "$BASE/competitions/<slug>/leaderboard?limit=50"
# Register a user
curl -s -X POST -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"walletAddress":"0xabc…"}' "$BASE/competitions/<slug>/register"
# Your usage stats
curl -s -H "Authorization: Bearer $KEY" "$BASE/stats"Support
Questions, higher rate limits, or want registration enabled? Reach the team on Telegram or X. See also the partner overview.