CSI·PicksCommon Sense Investors

Developers

API

Every pick on this site is public. The endpoints below let you pull the leaderboard, read any investor's pick history, or fetch their performance — JSON, no auth, just curl.

Base URL

https://api.csipicks.com

Format

JSON · UTF-8

Rate limit

100 req/min · burst 200

Auth

None for the routes below

GET/leaderboard

Stack-ranked investors plus the S&P 500 benchmark row

Returns the precomputed leaderboard. Score is the sum of every pick's return since its entry date. Each entry includes the user's slug (use that to query the per-user endpoints), plus three diversification descriptors: hitRatePct, sectorCount, and hhi (0–10,000 Herfindahl-Hirschman concentration). The current #1 (non-benchmark) carries a daysInFirst field counting consecutive days holding the top spot. The S&P 500 appears as a row with isBenchmark: true. Rebuilt every 5 minutes.

Request

curl -s https://api.csipicks.com/leaderboard | jq

Sample response

{
  "generatedAt": "2026-04-25T12:03:32Z",
  "spCurrent": 713.94,
  "firstPlaceUserId": "a12b05f0-5051-709e-358c-c9d0b6c5113b",
  "firstPlaceSince": "2026-04-22T12:03:32Z",
  "entries": [
    {
      "rank": 1,
      "userId": "a12b05f0-5051-709e-358c-c9d0b6c5113b",
      "slug": "todd",
      "displayName": "Todd",
      "pickCount": 4,
      "totalReturnPct": 18.42,
      "vsSP500Pct": 7.11,
      "hitRatePct": 75,
      "sectorCount": 3,
      "hhi": 3750,
      "daysInFirst": 3
    },
    {
      "rank": 2,
      "userId": "benchmark-sp500",
      "displayName": "S&P 500",
      "pickCount": null,
      "totalReturnPct": 11.31,
      "vsSP500Pct": 0,
      "isBenchmark": true
    }
  ]
}
GET/u/{slug}

A user’s public profile and full pick list

Replace {slug} with the slug from a leaderboard entry (a URL-safe form of the display name, like todd). Returns the user's display name, plus every pick (active and closed) with its symbol, sector, rating, entry/current price, and entry date. The endpoint also accepts the raw userId for backwards compatibility.

Request

curl -s https://api.csipicks.com/u/todd | jq

Sample response

{
  "user": {
    "userId": "a12b05f0-...",
    "slug": "todd",
    "displayName": "Todd",
    "createdAt": "2026-04-25T..."
  },
  "picks": [
    {
      "pickId": "9f4b...",
      "symbol": "TSLA",
      "companyName": "Tesla, Inc",
      "sector": "Automotive",
      "logo": "https://...",
      "rating": "Buy",
      "entryPrice": 252.31,
      "currentPrice": 268.49,
      "entryDate": "2026-04-25T13:14:00Z",
      "status": "active",
      "notes": "EV demand inflection",
      "returnPct": 6.41
    }
  ]
}
GET/u/{slug}/performance

A user’s aggregated performance

Sum of pick returns, sum of vs-S&P deltas, total pick count, and active pick count. Cheap, single-shot summary. Same lookup semantics as /u/{slug}.

Request

curl -s https://api.csipicks.com/u/todd/performance | jq

Sample response

{
  "user": { "userId": "a12b05f0-...", "slug": "todd", "displayName": "Todd" },
  "totalReturnPct": 18.42,
  "vsSP500Pct": 7.11,
  "pickCount": 4,
  "activeCount": 3
}

Scoring rule

A user's total return is the sum of each individual pick's return since the date it was added — not the average, and not a portfolio-weighted return. More picks contribute more, so picking activity counts as much as accuracy. The vs S&P 500 figure is the same sum, with each pick's return netted against SPY's return over the same window.

Authenticated endpoints

Endpoints under /picks, /me, /admin, and /symbol-search require a Cognito-issued ID token in the Authorization: Bearer <token> header. Sign in via /auth/login to obtain one. These aren't intended for third-party use.

Caveats

  • Quotes refresh every ~5 minutes during US market hours and once an hour outside; the API is not real-time and is unsuitable for trading.
  • For educational purposes only. Not investment advice. Past performance is no guarantee of future results.
  • CORS is open on the public endpoints. Hotlinking from a browser is supported.