/api/v1.
V2 — GET /api/v2/stock-picks
The recommended endpoint. It resolves the caller’s plan from the bearer
credential first, then either serves the request from the subscription window
free of charge, serves the Free tier’s delayed window free, or routes
anonymous callers through the same pay-per-use flow as V1.
Subscription access (Bearer API key, OAuth token, or session JWT)
- EXPERT readers get the full archive. PRO is clamped to a 90-day rolling window.
- In-plan requests are never charged and count against the API key’s
monthly request allowance — Personal 100,000/month, Enterprise
1,000,000/month (
429when exhausted). - An explicit
dateoutside the plan window returns403; out-of-window ranges are clamped to the allowed window. A PRO range with no overlap returns403— readmeta.allowedRange/meta.appliedRange.
Free tier (Bearer, no paid plan)
Served free with delayed data: a 7-day delay, showing a 30-day window ending 7 days ago. No charge, no quote, no confirmation flag.Pay-per-use (anonymous)
No free API access without a credential. Call the free quote, confirm theamountUsd, then pay with
an x402 client or a bearer credential backed by Drip credits. Pricing is a
flat day rate per UTC day served; a from/to range costs the day rate ×
charged days (empty days are skipped, max 30 days per request). Freeze the
quote’s dateUsed for a single day and use the same limit on the paid
request; for a range, pass the same from/to. Author / direction / query
filters, pagination, and prices apply to subscription reads and are ignored on
the paid path.
Stock-pick bundles are charged per request. A purchase does not create a
lifetime post unlock.
V2 query parameters
Each
picks[] item includes date, ticker, direction, action, author,
publicationSlug, publicationTitle, articleUrl (Drip’s sellable URL when a
post is attributed), conviction, convictionLabel, evidenceQuote,
rationaleSnippet, publishedAt, tickerExchange, instrumentType,
assetId, assetResolutionStatus, and asset.
assetResolutionStatus is RESOLVED, UNRESOLVED, or PENDING. Use assetId
and asset (id, name, kind, symbol, exchangeMic, currency) for
identity; a ticker alone can refer to different assets. asset and assetId
are null until resolved. instrumentType is the legacy extraction type;
asset.kind identifies resolved equities, ETFs, or crypto.
Historical subscription reads may also include prices (entry, current,
returnPct, currency). Returns are direction-adjusted. Prices are omitted
for the current day, pay-per-use requests, includePrices=false, unresolved
assets, and unavailable or mismatched provider data.
A successful subscription query can return picks: []. On the paid path,
no matching picks returns 404. Free quote responses include dateUsed
(null on multi-day quotes), startDate, endDate, asOf, dayCount,
count, attributedPostCount, amountUsd (day rate × dayCount), and
days[] with the per-day amountUsd; quotes do not expose post slugs or pick
rows.
V2 errors: 400 invalid query, 401 bad bearer, 402 payment required,
403 outside the plan window or insufficient credits, 404 no picks (paid path),
429 request allowance exhausted.
V1 — GET /api/v1/stock-picks (legacy, still available)
The original endpoint. It always returns one effective UTC calendar day —
the latest day with picks by default, or date=YYYY-MM-DD for a specific day.
Pricing is a flat day rate for the one charged day, whatever the number of
attributed source articles; call GET /api/v1/stock-picks/quote for the exact
total, then pass the quoted dateUsed on the paid request. A 404 means no
picks exist for that day — do not pay.
dateUsed, startDate, endDate, asOf, count, and items[]
with ticker, tickerExchange, instrumentType, action, direction,
authorConviction, convictionLabel, activePick, evidenceQuote,
rationaleSnippet, articleTitle, articleUrl, author, publishedAt,
publicationSlug, postSlug, assetId, assetResolutionStatus, and asset.
Migrating from V1 to V2
- Switch URLs —
/api/v1/stock-picks→/api/v2/stock-picksand/api/v1/stock-picks/quote→/api/v2/stock-picks/quote. Single-day callers can keep passingdate=YYYY-MM-DDunchanged. - Authenticate — if the caller has a PRO or EXPERT plan (Bearer API key, OAuth, or JWT), in-window reads become free, no quote or payment needed. The paid path for everyone else stays quote → confirm → pay.
- Adapt the response —
items[]becomespicks[],dateUsed/startDate/endDatebecomemeta+ adateon each pick, and the item fields change:
- Pagination — for ranges use
limitDays+cursor; the response’spagination.nextCursorcontinues older. Previously impossible beyond one day. - Errors — keep treating
404as “no picks, do not pay”. New:403for an explicit out-of-windowdate,429for an exhausted API-key allowance. - MCP — prefer
quote_stock_picks_v2/list_stock_picks_v2(confirmSpend: trueon the paid path only). The V1 tools (quote_stock_picks/list_stock_picks) remain available.
Hosted MCP
The four stock-picks tools map 1:1 to these routes:
Use V2 explicitly (
list_stock_picks_v2). Both list tools require an API key or
OAuth token with mcp:unlock; anonymous wallet payments use HTTP instead. On
the paid path, always call the
matching quote tool first, show amountUsd as $X.XX, confirm with the user,
then call with confirmSpend: true.
