Skip to main content
A stock pick is a ticker-level call extracted from a source — an analyst recommendation, a long/short idea, an add, or an exit. Drip serves these as structured JSON for AI agents, separate from the newsletter/article workflow.

GET /api/v2/stock-picks

Resolves the caller’s plan from the bearer credential first, then either serves the request from the subscription window free of charge or routes anonymous / FREE callers through the pay-per-use flow.

Subscription access (Bearer API key, OAuth token, or session JWT)

  • EXPERT readers get full history. PRO is clamped to the live 7-day window.
  • In-plan requests are never charged and count against the API key’s monthly request allowance (429 when exhausted).
  • An explicit date outside the plan window returns 403; out-of-window ranges are clamped. A PRO range with no overlap returns 403 — read meta.allowedRange / meta.appliedRange.

Pay-per-use (anonymous or FREE)

No free API access. Call the free quote, confirm the amountUsd, then pay with an x402 client or a bearer credential backed by Drip credits. Freeze the quote’s dateUsed and use the same limit on the paid request. The paid path selects one day using date / limit; sort orders that day’s rows. Ranges, author / direction / query filters, pagination, and prices apply to subscription reads and are ignored on the paid path. Bundles are charged per request. A purchase does not create a lifetime post unlock.

Query parameters

Response envelope

Three top-level keys, always present: meta.plan is FREE, PRO, EXPERT, or PAID (pay-per-use). meta.allowedRange is the plan’s full window — null for EXPERT full history and for PAID requests. meta.appliedRange is your request intersected with that window. meta.asOf is the server timestamp. meta.requestAllowance is the plan’s monthly allowance, null when paid.

Pick fields

assetResolutionStatus is RESOLVED, UNRESOLVED, or PENDING. asset carries id, name, kind (EQUITY/ETF/CRYPTO), symbol, exchangeMic, currency. A ticker alone can refer to different assets — key on assetId. prices carries entry, current, returnPct, currency, with returnPct adjusted for the author’s direction. Prices are omitted for the current day, pay-per-use requests, includePrices=false, unresolved assets, and unavailable or mismatched provider data.

Example — subscriber read (one day)

Example — range page (EXPERT, prices omitted for the current day)

Fetch the next page with the cursor and the same window:

Example — filtered read

author and query apply to subscription reads. They match the author exactly and substring-match ticker, author, and publication title respectively.

Example — empty day

A valid day with no picks is a 200, not an error. Do not pay on an empty bundle.

Quote response

GET /api/v2/stock-picks/quote is free and returns no pick rows — it prices the bundle. dateUsed is the day that will actually be charged; freeze it and reuse the same limit on the paid request.
404 means nothing to buy for that day — stop, do not pay. Prices are per source post; the bundle total is the sum of posts[].amountUsd.

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.

Hosted MCP

list_stock_picks_v2 requires an API key or OAuth token with mcp:unlock; anonymous wallet payments use HTTP instead. On the paid path, call the quote tool first, show amountUsd as $X.XX, confirm with the user, then call list_stock_picks_v2 with confirmSpend: true.