Developers

REST API

Build trading bots, market analytics, or anything else. The Kalsshi API is RESTful, JSON, and authenticated with API keys.

Authentication

Generate an API key from your Account & security page, then send it as a Bearer token on every request:

curl https://your-domain/api/positions \
  -H "Authorization: Bearer pred_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Base URL

Use the host you're viewing this page on:

https://your-domain

Endpoints

MethodEndpointDescription
GET/api/eventsList markets. Filters: ?category=, ?featured=1, ?q=
GET/api/events/[slug]Single market with options + price history
GET/api/events/by-slug/[slug]Lightweight lookup (id + title)
GET/api/events/by-slug/[slug]/newsRecent news + AI summary (when keys configured)
GET/api/events/by-slug/[slug]/sponsorSponsor metadata if any
GET/api/orderbook/[optionId]Aggregated bids/asks per side
GET/api/leaderboardTop profit / volume / predictions
POST/api/tradesPlace a market trade { optionId or (eventSlug+optionLabel), side, action, quantity, priceCents }
GET/api/trades?status=open|closedList your trades
POST/api/limit-ordersCreate a limit order { optionId, side, action, quantity, limitPriceCents, expiresInHours? }
GET/api/limit-orders?status=open|historyList your limit orders
DELETE/api/limit-orders/[id]Cancel a limit order
GET/api/positionsCurrent positions + portfolio summary
POST/api/positions/[id]/protectionsSet stop-loss / take-profit { stopLossProbBps?, takeProfitProbBps? }
POST/api/auth/register{ email, password, firstName?, lastName?, referralCode?, inviteCode? }
POST/api/auth/login{ email, password } — also awards daily streak
GET/api/auth/meCurrent user
GET/api/me/streakStreak counter + next bonus
GET/api/me/badgesEarned + locked badges
GET/api/me/referralYour referral code, link, count, total earned
GET/api/me/xpXP + level + progress to next level
GET/api/me/notificationsNotification feed; POST { markAllRead | id }
GET/api/me/trades/exportDownload all trades as CSV
GET/PATCH/api/me/preferencesBio + dark mode
POST/api/me/avatarMultipart upload (jpeg/png/webp/gif, max 2MB)
GET/POST/DELETE/api/me/trade-notesPrivate trading-journal notes
GET/POST/DELETE/api/me/webhooksSubscribe a URL to event payloads (HMAC signed)
GET/POST/DELETE/api/watchlistBookmarked markets
POST/DELETE/api/follow/[userId]Follow / unfollow another user
GET/POST/DELETE/api/copy-traderMirror another trader's trades (scaffolded)
GET/api/users/[username]Public profile + stats
GET/api/posts?eventSlug=...Discussion posts for a market
POST/api/postsCreate a post
POST/api/posts/[id]/likeToggle like
GET/POST/api/posts/[id]/commentsComments thread
POST/api/reportsReport content { targetType: POST|COMMENT|USER, targetId, reason }
GET/api/trending-usersCurrently popular traders
GET/POST/api/challengesHead-to-head challenges
POST/api/challenges/[code]/acceptAccept a challenge by invite code
GET/POST/api/market-suggestionsSuggest a new market for admin review
POST/api/events/[id]/disputeDispute a resolution { reason, evidenceUrl? }
GET/api/tournamentsActive tournaments
GET/api/tournaments/[slug]Tournament + leaderboard
POST/api/tournaments/[slug]/joinJoin a tournament
GET/api/cricket/liveLive cricket matches (when CricketAPI configured)
POST/api/depositsSubmit a deposit (currently disabled — pre-launch)
POST/api/withdrawalsRequest a withdrawal (currently disabled — pre-launch)
GET/api/payment-gateways?mode=depositAvailable payment methods
GET/api/flagsPublic feature-flag map for client-side checks

Example: place a trade

curl -X POST https://your-domain/api/trades \
  -H "Authorization: Bearer pred_..." \
  -H "Content-Type: application/json" \
  -d '{
    "eventSlug": "fed-rate-cut-june",
    "optionLabel": "Yes",
    "side": "YES",
    "action": "BUY",
    "quantity": 10,
    "priceCents": 34
  }'

Rate limit: 60 requests / minute. Errors return JSON with an error field and an appropriate HTTP status (400 for validation, 401 for auth, 402 for insufficient funds, 409 for state conflicts).