NuroPicks.com

/ RECORD / API / v1

Public Record API.

Formal specification for the public pick ledger. Code examples in curl, Python, and JavaScript. No auth required. CORS open. CC BY 4.0. Versioned by URL path; future schema versions land at /record/export.v2.json.

GET export.jsonGET export.csvGET rss.xmlSchema docDataset landing

Endpoints

GET/record/export.jsonapplication/json
GET/record/export.csvtext/csv
GET/record/rss.xmlapplication/rss+xml

Query parameters

since

ISO 8601 timestamp · default (none)

Filter to picks posted on or after this timestamp.

sport

string (lowercase) · default (none)

Filter to a single sport key (nba, nfl, mlb, nhl, ncaaf, ncaab, wnba, mma, soccer, tennis).

limit

integer 1 to 5000 · default 1000

Maximum rows returned. Capped at 5000.

curl

bash
curl -s 'https://nuropicks.com/record/export.json?since=2026-04-01&sport=nba&limit=500' \
  -H 'Accept: application/json'

Python

python
import requests

resp = requests.get(
    "https://nuropicks.com/record/export.json",
    params={"since": "2026-04-01", "sport": "nba", "limit": 500},
    timeout=30,
)
resp.raise_for_status()
data = resp.json()

print(f"{data['count']} picks since {data['filters']['since']}")
for pick in data["picks"][:5]:
    print(pick["id"], pick["sport"], pick["pick"], pick["clv_bps"])

JavaScript

javascript
const url = new URL("https://nuropicks.com/record/export.json");
url.searchParams.set("since", "2026-04-01");
url.searchParams.set("sport", "nba");
url.searchParams.set("limit", "500");

const resp = await fetch(url, { headers: { Accept: "application/json" } });
if (!resp.ok) throw new Error(`HTTP ${resp.status}`);
const data = await resp.json();

console.log(`${data.count} picks since ${data.filters.since}`);
for (const pick of data.picks.slice(0, 5)) {
  console.log(pick.id, pick.sport, pick.pick, pick.clv_bps);
}

Response shape

JSON response is an envelope with metadata fields plus a picks array. CSV response is a header row followed by data rows; same field set as the JSON pick objects, no envelope.

json
{
  "schema": "https://nuropicks.com/docs/RECORD_EXPORT",
  "generated_at": "2026-04-25T23:50:12.034Z",
  "filters": { "since": "2026-04-01", "sport": "nba", "limit": 500 },
  "row_cap": 5000,
  "count": 142,
  "db_reachable": true,
  "contract": "Append-only public ledger. Rows locked at post-time. No retroactive edits or deletes. NuroPicks LLC, Wyoming.",
  "picks": [
    {
      "id": 8214,
      "sport": "NBA",
      "game": "BOS @ NYK",
      "market": "spread",
      "pick": "BOS -3.5",
      "odds_american": -110,
      "stake_units": 1,
      "result": "win",
      "posted_at": "2026-04-24T22:14:01.000Z",
      "graded_at": "2026-04-25T02:48:18.000Z",
      "closing_odds": -120,
      "clv_bps": 191,
      "source": "ai-sharp",
      "permalink": "https://nuropicks.com/record/8214"
    }
  ]
}

Error responses

The endpoint never returns 4xx or 5xx HTTP codes for filter or query issues. If the database is unreachable, the response sets db_reachable: false and returns an emptypicks array with all envelope fields populated. CSV equivalent emits a comment row after the header. This is intentional; downstream audit scripts should treat missing rows as an availability signal, not a failure code.

json
{
  "schema": "https://nuropicks.com/docs/RECORD_EXPORT",
  "generated_at": "2026-04-25T23:50:12.034Z",
  "filters": { "since": null, "sport": null, "limit": 1000 },
  "row_cap": 5000,
  "count": 0,
  "db_reachable": false,
  "contract": "Append-only public ledger. Rows locked at post-time. No retroactive edits or deletes. NuroPicks LLC, Wyoming.",
  "picks": []
}

Cache + rate limits

Cache-Controlpublic, s-maxage=900, stale-while-revalidate=3600
CORSAccess-Control-Allow-Origin: * (browser-based audit tools work without a proxy)
Rate limitNone enforced today. Reviewers polling every 15 minutes hit cached responses; do not poll faster than once per minute.
RobotsX-Robots-Tag: noindex on the raw payload; the dataset landing at /record/export is indexable

Versioning policy

The endpoint and its schema are versioned by URL path. We will never make a breaking change to /record/export.json or /record/export.csv. Future schema versions land at /record/export.v2.json.

New columns will be appended at the end of the field list so existing scripts keep working. Existing column semantics never change. Existing rows are append-only and locked at post time by a Postgres trigger; we do not retroactively edit or delete settled picks.

Changelog

v1.0.02026-04-25
  • Initial public release of /record/export.json and /record/export.csv
  • Schema columns: id, sport, game, market, pick, odds_american, closing_odds_american, clv_bps, stake_units, result, posted_at, graded_at, permalink (CSV); + source on JSON
  • Cache-Control public, s-maxage=900, stale-while-revalidate=3600
  • CORS open (*); X-Robots-Tag noindex on the raw payload (page surface is indexable)
  • Append-only contract enforced by Postgres trigger

21+. NuroPicks is entertainment and education, not financial advice. Past CLV does not predict future results. Questions about the API: partners@nuropicks.com.

Must be 21+. Gambling problem? Call 1-800-GAMBLER. NJ/PA: 1-800-GAMBLER · MI: 1-800-270-7117 · VA: 1-888-532-3500 · CO: 1-800-522-4700 · NY: 877-846-7369 (HOPENY).

NuroPicks LLC · 30 N Gould St Ste R, Sheridan, WY 82801