---
title: "Get the Pick of the Day track record"
method: GET
path: "/api/v1/pick-of-the-day/archive"
tags: ["Pick of the Day"]
---

# Get the Pick of the Day track record

`GET /api/v1/pick-of-the-day/archive`

Every published Pick of the Day with its real outcome, plus the rolling hit rate (wins / decided; void and pending excluded). Resolved picks are public; a still-pending pick's backed side is included for the authenticated Pro key.

## Headers

- `If-None-Match` string

## Response `200`

Pick of the Day track record

- object
  - `object` 'pick_of_the_day_archive', required
  - `data` PickOfTheDayArchive, required
    - `picks` PickOfTheDayArchiveEntry[], required — Every published Pick of the Day, newest first by pick_date.
      - `pick_date` string, date, required — The pick's local publication date (YYYY-MM-DD).
      - `matchup` string, required — Human-readable matchup (e.g. "Portugal vs. Uzbekistan").
      - `category` string, required — Frozen canonical calibration/report bucket (e.g. "Basketball", "MMA", or "Soccer"). Existing semantics are unchanged; presentation consumers should prefer display_category when present.
      - `display_category` string — Frozen public presentation category. For supported Polymarket sports this is the exact verified official event league (e.g. "WNBA" or "UFC"); otherwise it equals category. Additive and optional for mixed-version client compatibility.
      - `image_url` string — Provider (Polymarket Gamma) market thumbnail URL (markets.image); omitted (not null) when the market has no image. Public regardless of the backed-side gate, so present for pending rows too.
      - `pick_outcome_label` string, nullable — The backed side's outcome label. Omitted for a still-pending pick when the request is not from an authenticated Pro key.
      - `top_grade` string, nullable — Best (highest) grade among the PROVEN smart-money (S/A-graded) wallets on the backed side. Scoped to S and A only: a backing whose graded holders are all sub-S/A (B) reports null, so a grade is never shown next to a zero proven-wallet count. null when no S/A wallet backs the pick, when a pending legacy proof has not yet upgraded, or when the stored holder policy is unknown-future or structurally invalid. Resolved legacy history remains supported.
      - `outcome` 'pending' | 'win' | 'loss' | 'void', required — Settlement outcome of the backed side; 'pending' until the market resolves.
      - `outcome_display` string — Pre-formatted settlement status for display: "Win" / "Loss" / "Void" / "Pending" -- the outcome enum above as a label, from the same formatter the pick payload's outcome_display uses. Convenience only; outcome is the source value.
      - `return_per_100` number — Gross return on a $100 stake on this resolved pick: a win returns 100 / backed_price, a loss returns 0, a void refunds 100. A loss always returns 0 (the whole stake is lost regardless of price). Omitted (not null) only for a still-pending pick or a resolved WIN with no frozen price (a win's payout needs the price); mirrors the backend skip-when-absent behavior and the route-client optional (non-nullable) schema.
      - `payout_display` string — Pre-formatted return_per_100 as USD with cents: "$200.00". Present exactly when return_per_100 is -- it is formatted from that already-gated value -- so it is omitted for a still-pending pick, an unpriced win, and any pick whose backed side is withheld. Convenience only; return_per_100 is the source value.
    - `hit_rate` PickOfTheDayHitRate, required
      - `wins` integer, required — Number of decided picks that won.
      - `losses` integer, required — Number of decided picks that lost.
      - `decided` integer, required — Number of decided picks (wins + losses); excludes void and pending.
      - `pct` number, required — Rolling hit rate as a percentage (wins / decided * 100, to 1 decimal); 0 when none are decided.
      - `void` integer, required — Number of picks that resolved void (excluded from the hit rate).
      - `pending` integer, required — Number of picks still pending resolution (excluded from the hit rate).
      - `net_profit_usd` number, required — Cumulative profit (USD) of a $100/pick strategy over decided picks with a valuation: a win pays 100/backed_price - 100, a loss pays -100 (always, price-independent), a void pays 0. Only a resolved WIN with no frozen price is excluded (its payout is unknowable); a priceless loss still books -100.
      - `staked_usd` number, required — Total staked (USD) = 100 * count of decided picks with a valuation: every loss (always) plus every priced win. Void (refunds the stake) and a priceless win (unknowable payout) are excluded.
      - `roi_pct` number, required — Return on the staked amount as a percentage (net_profit_usd / staked_usd * 100, to 1 decimal); 0 when nothing is staked.
      - `net_profit_display` string, required — Pre-formatted net profit for display, e.g. "+$100" / "-$40". Whole dollars, signed, round-then-signed so a rounds-to-zero record reads "+$0" (never "-$0"). Convenience only; net_profit_usd is the source value.
      - `roi_display` string, required — Pre-formatted ROI for display, e.g. "+8.3%" / "-20.0%". One decimal, signed, round-then-signed so a rounds-to-zero record reads "+0.0%" (never "-0.0%"). Convenience only; roi_pct is the source value.
      - `win_rate_display` string, required — Pre-formatted win rate for display, e.g. "92.3%". One decimal, unsigned. Convenience only; pct is the source value.
      - `series` object[] — Cumulative track-record series, one point per decided (win/loss) pick in ascending pick_date order (void and pending add no point). The last point's net_profit_usd and hit_rate_pct equal the headline net_profit_usd and pct by construction. Empty when nothing is decided.
        - `date` string, date, required — The decided pick's publish date (YYYY-MM-DD).
        - `net_profit_usd` number, required — Running cumulative $100/pick profit (USD) through this pick (every loss and every priced win are booked; only an unpriced WIN carries it forward unchanged).
        - `hit_rate_pct` number, required — Running rolling hit rate (wins / decided * 100, to 1 decimal) through this pick.
  - `meta` ResponseMeta, required
    - `request_id` string, required — Unique request ID (req_ prefix).
    - `cached` boolean, required
    - `cache_age_s` integer, nullable — Cache age in seconds, null if not cached.
    - `cost` integer, required — Advisory request weight (relative compute cost). 1 for simple reads; higher for heavier endpoints. Not a credit/price.
    - `directional_source` 'live' | 'degraded' — Which path produced the team-directional read on this response. Only present on endpoints that compute one (today: GET /api/v1/sports-edge-signals). "live" means the read RAN. "degraded" means it FAILED, so nothing was measured and the ranking fell back to raw conviction. The flag describes the READ, not its consequence: a read that ran and found nothing groupable also leaves the directional fields null, and that is honestly "live" -- the per-signal nulls already say "nothing to enrich here", so this snapshot-level flag carries only what they cannot, namely whether the read ran at all. A degraded response is cached on the shorter degraded TTL so it self-heals. Reported SEPARATELY from ranking_source because the two degradations are independent -- a smart-money DB miss weakens the ranking DATA, a directional failure removes a ranking WEIGHT -- and a consumer down-weighting a degraded response needs to know which input it lost. Omitted on endpoints that compute no directional read.
    - `ranking_source` 'live' | 'db_only' — Which ranking-data path produced this response. Only present on endpoints that can degrade a ranking (today: GET /api/v1/sports-edge-signals). "live" is the normal path (the current holder pile from the provider batch); "db_only" is the degraded fallback (a truthful but weaker trader_markets ranking) served when the live sharp-money ranking batch is unavailable (a smart-money DB read failure, not a Polymarket outage) and cached on a shorter TTL, so a consumer can down-weight or skip it. Omitted on endpoints that never degrade.
    - `category_skill_source` 'live' | 'partial' | 'degraded' | 'unavailable' — Whole filtered snapshot category-evidence status before pagination. Operational live always remains partial source coverage.
    - `category_skill_model_version` string
    - `category_skill_taxonomy_version` string
    - `category_skill_platform` 'polymarket'
    - `category_skill_scope` 'observed_goldsky_primary_taker_fill'
    - `category_skill_source_coverage` 'partial_whale_threshold_fills'
    - `category_skill_observation_started_at` string, date-time
    - `category_skill_model_operationally_degraded` boolean — Whole-model operational readiness captured with the category model snapshot. Present on category-enriched responses even when the filtered signal slate is empty. When true, category_skill_source is degraded and sports-edge-signals uses the shorter degraded cache TTL.
    - `category_skill_status_counts` object
      - `live` integer, required
      - `insufficient` integer, required
      - `stale` integer, required
      - `unknown` integer, required
      - `degraded` integer, required
    - `category_skill_base_payload_hash` string — SHA-256 of the funded signal membership/order/rank/cursor vector immediately before category-skill enrichment. Sports-edge-signals only.
    - `category_skill_enriched_base_payload_hash` string — Independent SHA-256 recomputation over the same base fields immediately after category-skill enrichment. Equality with category_skill_base_payload_hash proves shadow enrichment did not change funded inputs. Sports-edge-signals only.

## Other responses

- `304` — Not Modified. Returned when If-None-Match matches the current Pick of the Day archive payload.
- `401` — Missing or invalid API key
- `402` — Active Pro subscription required
- `403` — Account access denied
- `408` — Request exceeded the server's 30-second transport timeout. The timeout response has an empty body because it is generated before handler-level JSON error shaping.
- `423` — Account is locked
- `429` — Rate limit exceeded. Two independent budgets. (1) 100 requests/minute per user (sliding window), on every authenticated route. (2) On the BATCH routes only: 2500 batch item units/minute per user, reserved before any item is executed. A batch with N requested items costs N item units, including duplicate and invalid items. 2500 = 100 requests x 25 items per batch, which is the most item work a key can buy through the request limiter at all: a caller may spend their entire 100-request minute on full 25-item batches without the item budget being what stops them. The REQUEST budget is the effective ceiling, and batching is never the more expensive choice. The item budget can still deny at a sliding-window boundary (both counters carry the previous window forward with a floor, and the item counter runs 25x the request counter), so honor a 429 from either. Over-quota batches return 429 with Retry-After before any item work is done.
- `503` — Redis-backed authenticated rate limiter unavailable; retry after the per-process outage cooldown

---

[API](https://skmtc.net/0xinsider/apis/0xinsider-api.md) · [All operations](https://skmtc.net/0xinsider/apis/0xinsider-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/0xinsider/0xinsider-api/revisions/918e082b045a/schema)
