Skip to main content
A source is where Drip reads from: a Substack newsletter, a Beehiiv publication, a podcast feed, a plain RSS feed, a YouTube channel, or an X timeline. Every post in the Drip feed belongs to a source, and every analyst call is attributed to one. Sources are the entry point of the API. Resolve a source, read its recent posts, unlock the ones you want, then pivot to stock picks for the analyst calls behind them. Payment methods are split by mount: the plain /api/v2/... paid routes accept Bearer API keys, session JWTs, and MCP OAuth only; the /api/v2/x402/... twins accept wallet payments (x402 / MPP) only. Wrong-mount credentials get 403 account_only / 403 wallet_only.

Why “source” and not “publication”

A publication is a Substack. A source is anything Drip reads from — a podcast has no posts on Substack, and a YouTube channel has no feed at all. V1 called all of them publications, which was wrong for podcasts and misleading for everything else. V2 uses one word for the whole set. The v1 routes still work and are unchanged. See Legacy publication routes for the V1 shapes.

GET /api/v2/sources

Lists the curated, chat-visible catalog. Free, no auth.
platform is how you tell a podcast from a newsletter: PODCAST_RSS marks a podcast feed. There is no dedicated podcast route in V2 — filter the catalog on platform instead.

GET /api/v2/sources/search

Resolves a source by name, author, show title, or URL. Free, no auth.
q is required and must be at least 2 characters. At most 3 matches come back, ranked. If several look plausible, ask the user which one they meant rather than guessing. platform is an optional exact-match filter on the source type — same values as the catalog’s platform field: SUBSTACK, BEEHIIV, GENERIC_RSS, PODCAST_RSS, EMAIL, TWITTER, BOOK, YOUTUBE. Use platform=PODCAST_RSS to find podcast shows. An unknown value returns 400.

GET /api/v2/sources/{sourceSlug}

One source plus its recent posts. Free, no auth.
  • Works for any enabled indexed source, not just the curated catalog.
  • limit is 1-100. Omit it to get every post with a ready summary.
  • isPodcast marks podcast episodes — those unlock to a transcript rather than only a summary.
  • priceCents is what unlocking that post costs. Show it as $X.XX and confirm before paying.
  • 404 when the source is unknown or disabled.

GET /api/v2/sources/{sourceSlug}/{postSlug} (paid)

The full post: metadata plus the synthesizedSummary (and transcript for podcast episodes) after payment.
The body uses sourceId and sourceSlug where V1 used publicationId and publicationSlug. Everything else matches. The first successful pay unlocks that post forever for the paying subject. Later reads are free. Store the unlockToken (or the X-Drip-Unlock response header) and send it back for free re-reads. API key, JWT, and MCP OAuth all share one Drip-user entitlement.

GET /api/v2/sources/{sourceSlug}/stock-picks (paid)

The source’s analyst profile: pick totals, direction-adjusted performance, win rate, per-author split, top picks, and the latest calls.
  • PRO / EXPERT subscribers are served free.
  • Everyone else pays one flat price per call via x402 or MPP.
  • The body uses a source block where V1 used publication.
For per-ticker analyst calls rather than a per-source profile, use Stock Picks.

Hosted MCP

The same routes are available as MCP tools: unlock_post takes publicationSlug and postSlug — the argument name predates the source rename and is shared with the in-app chat tool.

Errors

Non-402 errors return { "error", "code", "hint" }. error is the human message, code is machine-readable, hint points at recovery.