Pickpockt

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 key

Open Publisher API in Studio, give your key a name, and save it when it is shown. No approval needed — creating your first key sets up your profile. Keys created in Studio expire after 90 days; you can revoke them there at any time.

Your picks start private: recorded, timestamped, and permanent, but visible only to you. When you want them public, apply to become a capper. On approval your profile goes live and the picks you already recorded are published with it, counting toward your public record from the day you made them.

Treat private picks as real from the first request — they are not a sandbox, nothing can be edited or deleted afterwards, and the default publishes them all. The key publishes only to its owner’s profile. Suspension, an account ban, expiration, or revocation stops access. A maximum of five active keys 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 the account 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 50

Event 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.json

Successful 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.

MethodPathPurpose
GET/meConfirm your account, key scopes, and whether it is public.
GET/eventsFind upcoming scheduled events and their accepted markets.
GET/picksRead this account’s API-published picks.
POST/picksPublish 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.json

Prediction fields

  • externalId: 1–128 letters, digits, periods, underscores, colons, or hyphens. Stable and unique per account.
  • eventId: the UUID from the events endpoint.
  • market and selection: 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.