Pickpockt for builders / v1
Your model. Your picks.
Your record, on your terms.
Record predictions from a scheduled pipeline, a script, or an AI assistant — private to start, public whenever you choose. Your model and training data stay in your environment.
1. Create a model and a key
In Studio, pick a model at the top or create one with New model. An account can hold many — an NFL spreads model, an NFL moneyline model, a v2 beside a v1 — and each has its own record, keys, public page and place on the leaderboards. Give a model a league and a market and any pick outside them is refused with OUT_OF_SCOPE, so its record is exactly what its name says. The scope cannot be changed later.
Then open Publisher API, give the key a name, and save it when it is shown. A key belongs to one model and publishes only to it. There is no approval. Keys created in Studio expire after 90 days; you can revoke them there at any time.
A model starts private: recorded, timestamped, and permanent, but visible only to you. When you want it public, flip that model's switch in Studio from Private to Public. It goes live with every pick it already recorded, each dated from the day it was made, and ranks on the overall leaderboard and on its own league and market — and the same switch makes it private again. Your other models are not affected.
Treat private picks as real from the first request — they are not a sandbox, nothing can be edited or deleted afterwards, and going public publishes them all. Suspension, an account ban, expiration, or revocation stops access. A maximum of five active keys per model lets you rotate credentials without stopping your pipeline.
2. Connect your pipeline
Use Node.js 22 or later for the dependency-free CLI. Set the key through your environment or secret manager, then confirm which model the key publishes to — me shows its scope — before publishing.
export PICKPOCKT_BASE_URL="https://pickpockt.com"
# Set PICKPOCKT_API_KEY using your secret manager.
node pickpockt.mjs me
node pickpockt.mjs events --sport nfl --limit 50Event results contain Pickpockt event IDs, external references, allowed markets, and each side resolved as homeCompetitor/awayCompetitor with a name, short name, and abbreviation. Match your model’s output on those plus startsAt — the event name is upstream display text and its shape varies by feed, so it is not safe to parse. Pagination uses limit, offset, and the returned nextOffset. Events also accept from (inclusive) and to (exclusive) as ISO timestamps with a timezone.
3. Publish predictions
Save a file named picks.json. Replace the example event ID with one returned by the events endpoint. Give every prediction a stable external ID from your pipeline.
{
"picks": [
{
"externalId": "my-model-v1-nfl-game-001",
"eventId": "REPLACE_WITH_EVENT_ID",
"market": "moneyline",
"selection": "home",
"predictedPrice": -150,
"confidence": 60,
"isPick": true
}
]
}node pickpockt.mjs publish --file picks.jsonSuccessful creation returns HTTP 201 with each prediction ID and publication time. An identical retry returns the existing receipt, including after the event starts. Reusing an external ID with different values returns HTTP 409. IDs belong to the account, so rotating a key does not break retries.
Use the REST API directly
All routes use the base path /api/publisher/v1 and an Authorization: Bearer header. The CLI uses these same routes; any HTTP-capable pipeline or AI tool can call them.
| Method | Path | Purpose |
|---|---|---|
| GET | /me | Confirm the key's model, its league / market scope, and whether it is public. |
| GET | /events | Find upcoming scheduled events and their accepted markets. |
| GET | /picks | Read this model’s API-published picks. |
| POST | /picks | Publish a batch of 1–100 predictions atomically. |
curl --fail-with-body "https://pickpockt.com/api/publisher/v1/picks" \
-H "Authorization: Bearer $PICKPOCKT_API_KEY" \
-H "Content-Type: application/json" \
--data-binary @picks.jsonPrediction fields
externalId: 1–128 letters, digits, periods, underscores, colons, or hyphens. Stable and unique per account.eventId: the UUID from the events endpoint.marketandselection: moneyline/spread use home or away; totals use over or under; goes_the_distance uses yes or no. Accepted markets vary by sport.predictedPrice: your model’s fair American odds, at most −100 or at least +100. This is not a sportsbook price. It is required.line: required for spreads and totals; omit it for moneyline and goes_the_distance. Totals must be positive.competitorId: required only for total_games and must be one of the event’s competitors.confidence: optional integer from 0 to 100.isPick: whether to feature the prediction; defaults to true.
Publishing rules
- New predictions require an upcoming event with scheduled status. The server sets the publication time.
- API-published predictions are final: neither the API nor Studio can edit or delete them, whether your record is private or public. Check your model output before submitting.
- All picks in a batch succeed together. If any pick fails, none of the new picks in that request are published.
- Limits: 100 picks and 128 KiB per request; 60 requests per minute per key. HTTP 429 includes a Retry-After header.
- Errors return
{ "error": { "code": "…", "message": "…" } }. HTTP 401 means key/account access is unavailable; 422 means validation failed; 409 means a conflict or event cutoff. Retry network errors and HTTP 500 using the same payload and external IDs. - Publication does not imply a settled result or complete price history. Grading and price-based metrics depend on the event’s available settlement and sportsbook data. Per-player tennis total_games is not currently graded.
Wiring this up with an AI assistant
If you build your model with Claude Code, Codex, Cursor, or any similar tool, you should not have to relay this page to it. Point it at the machine-readable guide and ask for what you want:
Read https://pickpockt.com/developers/llms.txt and update my
pipeline so it also publishes its picks to Pickpockt.That file is written for coding agents rather than people: it states the full contract, the idempotency rules, every error code and whether retrying it can help, a reference implementation, and a checklist to verify against before reporting back. There is an OpenAPI 3.1 spec at /developers/openapi.json for tools that consume specs, and /llms.txt points to both. API error responses carry the guide URL in a docs field and a Link header, so an assistant that hits a rejection can find its own way out.
The first release supports REST and this CLI. A dedicated MCP server is planned; today an assistant with HTTP or shell access has everything it needs.