> ## Documentation Index
> Fetch the complete documentation index at: https://docs.dripstack.xyz/llms.txt
> Use this file to discover all available pages before exploring further.

# Access post with credits (paid, same as GET).

> Same unified payment flow as GET. Unauthenticated requests receive a 402 x402/MPP challenge. Authenticated requests (JWT or API key) pay via credits — API keys use purchased balance only, JWT users can use weekly allowance first.



## OpenAPI

````yaml https://dripstack.xyz/openapi.json post /api/v1/publications/{publicationSlug}/{postSlug}
openapi: 3.1.0
info:
  title: Drip
  summary: Premium financial newsletter and podcast API with micropayment access.
  version: 0.1.0
  description: >
    Paid API for searching and browsing Drip's premium financial newsletters and
    podcasts, resolving publications and direct post links, and purchasing
    synthesized post summaries for investing research and market analysis.


    ## Payment Flow


    Paid routes return HTTP 402 with a dual challenge. Use an x402 or MPP
    payment-aware client.


    1. Plain request returns 402 with `WWW-Authenticate` (MPP) and
    `PAYMENT-REQUIRED` (x402) headers.

    2. Retry the same request through a payment-aware client, or manually with
    `Authorization: Payment <credential>` (MPP) or `PAYMENT-SIGNATURE` header
    (x402).

    3. On success (200), response includes `synthesizedSummary` and
    `paymentInfo`.


    **Pricing:** Discovery `x-payment-info.offers[]` is advisory. Runtime 402
    challenge is authoritative. Price may scale with content (e.g. stock-picks
    by source article count).


    **Error codes:** 402 = payment required, do not retry without payment. 503 =
    summary not ready, retry later. 404 = content not found, do not pay.
  contact:
    name: Drip
    email: support@dripstack.com
    url: https://dripstack.xyz
  license:
    name: Proprietary
    url: https://dripstack.xyz/terms
  x-guidance: >
    # Drip API Reference


    ## Discovery


    Prefer `GET /openapi.json` (OpenAPI 3.1) for route shapes, JSON schemas, and
    paid-route `x-payment-info.offers[]` metadata. If OpenAPI is unavailable,
    use `GET /.well-known/x402` for the paid resource list in `METHOD /path`
    form.


    Root `x-discovery.ownershipProofs` is a Drip vendor extension, not part of
    core MPP discovery.


    ## Routes


    ### `GET /api/v1/search`


    Searches imported premium financial newsletters and podcasts by topic. Use
    this as the default discovery route for topic browsing rather than loading
    the whole publication catalog.


    Query parameters:


    - `q` (required): natural-language search query

    - `limit` (optional): number of article results to return, from 1-30; use
    `10` by default

    - `mode` (optional): `hybrid` by default; `fts` is lexical only


    Response includes `items[]`, ranked post candidates with `publicationSlug`,
    `slug`, `title`, `subtitle`, `publishedAt`, `snippet`, `whyMatched`, and
    relevance fields. Use `publicationSlug` + `slug` from a selected item to
    fetch the paid article or podcast post.


    For user-facing search options, render `{title} ({publicationSlug},
    {YYYY-MM-DD})` when `publishedAt` is present, or `{title}
    ({publicationSlug})` when no date is available. Convert ISO timestamps to
    date-only `YYYY-MM-DD`. Do not show `slug`, `subtitle`, `snippet`,
    `whyMatched`, relevance scores, or other internal metadata in user-facing
    menus. Treat search results as candidates, not evidence; answer substantive
    questions only from fetched paid summaries.


    ### `GET /api/v1/publications`


    Lists every indexed newsletter, podcast, and publication with `slug`,
    `title`, `description`, `siteUrl`, and `lastSyncedAt`. Use this only when
    the user explicitly wants to browse the full catalog or asks what
    publications are available.


    ### `GET /api/v1/publications/search`


    Searches indexed publications by slug, title, author, podcast show,
    newsletter, or site URL. Required query parameter: `q` (minimum 2
    characters). Returns up to 3 matches with `publicationSlug`, `title`,
    `author`, and `siteUrl`.


    ### `GET /api/v1/publications/{publicationSlug}`


    Returns publication metadata plus `posts`: post summaries with `slug`,
    `title`, `subtitle`, `publishedAt`, and `priceCents`. Returns `404` if the
    publication is not in the database.


    Optional post-list query parameter: `limit` (1-100).


    ### `GET /api/v1/publications/{publicationSlug}/{postSlug}` (paid)


    Returns post metadata and `synthesizedSummary` after payment. Returns `404`
    if the publication or post is not found, `503` with code `summary_not_ready`
    when the summary is not ready yet (retry later; no payment challenge), and
    `402` if payment is required.


    Unpaid responses include a dual payment challenge: MPP in `WWW-Authenticate:
    Payment ...` and x402 v2 in `PAYMENT-REQUIRED`. Retry the same request with
    `Authorization: Payment ...` for MPP or `PAYMENT-SIGNATURE` for x402 v2.


    ### `GET /api/v1/stock-picks`


    Returns stock-picker calls for AI-agent consumption after x402/MPP payment.
    This is a specialized paid route for ticker-level picks, analyst calls,
    recommendations, and investment ideas; it is not part of the normal
    newsletter/podcast search, selection, and paid-summary workflow.


    This endpoint always returns one effective UTC calendar day, not a rolling
    date range. By default, it returns the latest day that has stock picks. Pass
    `date=YYYY-MM-DD` to request one effective UTC day. Optional `period=latest`
    is an explicit alias for the default. Do not send `date` and `period`
    together. Optional `limit` is 1-500 and defaults to 200.


    The effective day is based on article `publishedAt`; when publication time
    is missing, the server may use extraction time internally. Returned items do
    not include extraction time, so treat `publishedAt` as source article
    context only and omit date context when it is null.


    Response includes `dateUsed`, `startDate`, `endDate`, `asOf`, `count`, and
    `items[]`. `dateUsed` is the canonical returned day; `startDate` and
    `endDate` are the same as `dateUsed` for this single-day response. Each item
    includes `ticker`, `tickerExchange`, `instrumentType`, `action`,
    `direction`, `authorConviction`, `convictionLabel`, `activePick`,
    `evidenceQuote`, `rationaleSnippet`, `articleTitle`, `articleUrl`, `author`,
    `publishedAt`, `publicationSlug`, and `postSlug`.


    Returns `404` when no stock picks exist for the requested or resolved day —
    do not pay on `404`. Plain requests return `402` only when matching paid
    picks exist. Runtime price is based on the number of distinct attributed
    source articles in the returned picks. After settlement, the server records
    a sale for each distinct attributed source article.


    ## Payment


    Paid post routes return HTTP `402` with a dual challenge: MPP in
    `WWW-Authenticate: Payment ...` and x402 v2 in `PAYMENT-REQUIRED`. Use an
    x402 or MPP payment-aware client. If plain HTTP returns `402`, retry the
    same request through the payment-aware client instead of treating it as a
    final failure.


    Infer the live price from the paid endpoint response or payment challenge.
    OpenAPI `x-payment-info.offers[]` is advisory and may show Base USDC x402,
    Tempo, and Stripe charges or catalog floor prices; per-post pricing comes
    from the runtime challenge. Always trust the live `402` challenge over
    discovery offers.


    ## Agent flows


    ### Topic search


    Use when the user asks a general finance question, asks what writers or
    podcasts are saying, or wants article/podcast post recommendations.


    1. Call `GET /api/v1/search?q={query}&limit=10`.

    2. Present returned `items[]` as candidates using only title, publication
    slug, and date.

    3. Keep each candidate's `publicationSlug` and `slug` for the paid fetch
    URL.

    4. Fetch selected article summaries with `GET
    /api/v1/publications/{publicationSlug}/{postSlug}` through a payment-aware
    client.

    5. Summarize or synthesize only from fetched `synthesizedSummary` text.


    ### Specific publication


    Use when the user names a publication, author, podcast show, newsletter, or
    shares a Substack publication URL.


    1. Call `GET /api/v1/publications/search?q={query}` unless the normalized
    slug is obvious.

    2. If one match is clearly right, call `GET
    /api/v1/publications/{publicationSlug}`.

    3. Present 3-5 recent post titles from `posts[]`.

    4. Fetch selected post summaries through the paid post route.


    ### Browse catalog


    Use when the user asks to see available newsletters, podcasts, or
    publications before choosing one.


    1. Call `GET /api/v1/publications`.

    2. Present publications as `Publication Title (slug) — short description`.

    3. After the user chooses a publication, call `GET
    /api/v1/publications/{publicationSlug}`.

    4. Fetch selected post bodies through the paid post route.


    ### Stock picks


    Use when the user asks for stock-picker calls, stock recommendations, recent
    investment picks, analyst calls, or ticker-level long/short ideas.


    1. Call `GET /api/v1/stock-picks` through an x402 or MPP payment-aware
    client for the latest UTC effective day with picks. Read `dateUsed` and
    `asOf` from the response.

    2. Call `GET /api/v1/stock-picks?date={YYYY-MM-DD}` when the user asks for a
    specific day.

    3. Use `period=latest` only when an explicit latest-period parameter is
    useful; it is equivalent to omitting `date`.

    4. If the response is `404`, no picks exist for that day — do not pay; try
    another date or tell the user none are available.

    5. Present picks with ticker, action, direction, conviction, active/inactive
    status, evidence quote, rationale snippet, article title, source
    publication, and source URL.

    6. Treat `publishedAt` as the article publication time; if it is null, omit
    date context rather than inventing one.

    7. Keep `publicationSlug` and `postSlug` for optional follow-up paid
    article-summary fetches.


    ### Direct article


    Use when the user shares a direct article URL, podcast post URL, or a
    specific post slug.


    1. Resolve `publicationSlug` and `postSlug` from the URL or context.

    2. Probe the paid endpoint first when needed to inspect the live `402`
    challenge and price.

    3. Call `GET /api/v1/publications/{publicationSlug}/{postSlug}` through a
    payment-aware client after the user has clearly asked to read, buy,
    summarize, or use that post.

    4. Return a curated summary by default; include raw/full content only when
    explicitly requested.


    ## Fetched article response handling


    For one fetched article, return a curated summary with synthesis, notable
    claims, caveats, implications, and source context. For multiple fetched
    articles, compare the relevant claims, tensions, mechanisms, caveats, and
    implications across sources.


    Append source references for fetched articles with title, publication, date
    when available, and source URL when available.


    If a paid fetch fails, surface the failure rather than substituting model
    knowledge. If some selected articles succeed and others fail, synthesize
    only from successfully fetched articles and name the failed fetches.


    Runtime pricing note: paid post challenges use the stored per-post USD price
    when present, else at least $0.1.
servers:
  - url: https://dripstack.xyz
security: []
tags:
  - name: Search
    description: Search premium newsletters and podcasts by topic.
  - name: Publications
    description: List, search, and import newsletters, podcasts, and publications.
  - name: Posts
    description: Fetch, unlock, and list individual article and podcast post content.
  - name: Stock Picks
    description: Daily stock-picker calls, analyst recommendations, and investment ideas.
paths:
  /api/v1/publications/{publicationSlug}/{postSlug}:
    post:
      tags:
        - Posts
      summary: Access post with credits (paid, same as GET).
      description: >-
        Same unified payment flow as GET. Unauthenticated requests receive a 402
        x402/MPP challenge. Authenticated requests (JWT or API key) pay via
        credits — API keys use purchased balance only, JWT users can use weekly
        allowance first.
      operationId: accessPublicationPost
      parameters:
        - name: publicationSlug
          in: path
          required: true
          schema:
            type: string
          description: Publication slug, which is the normalized host.
        - name: postSlug
          in: path
          required: true
          schema:
            type: string
          description: Post slug from the publication feed.
        - name: Authorization
          in: header
          required: false
          schema:
            type: string
          description: >-
            MPP (Payment HTTP Authentication Scheme): after HTTP 402, retry with
            `Authorization: Payment <credential>`.
        - name: PAYMENT-SIGNATURE
          in: header
          required: false
          schema:
            type: string
          description: >-
            x402 v2: after HTTP 402, retry with the encoded payment payload from
            the `PAYMENT-REQUIRED` challenge (same header name as in
            `@x402/core` HTTP transport).
      responses:
        '200':
          description: Synthesized post summary after successful payment.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaidPublicationPost'
        '402':
          description: Payment Required
          headers:
            WWW-Authenticate:
              description: >-
                MPP `Payment` HTTP Authentication Scheme challenge (realm must
                match origin).
              schema:
                type: string
            PAYMENT-REQUIRED:
              description: x402 v2 encoded payment requirements (see x402 seller docs).
              schema:
                type: string
          content:
            application/problem+json:
              schema:
                type: object
                required:
                  - type
                  - title
                  - status
                  - detail
                properties:
                  type:
                    type: string
                    description: Problem type URI.
                  title:
                    type: string
                    description: Short human-readable summary.
                  status:
                    type: integer
                    enum:
                      - 402
                    description: HTTP status code.
                  detail:
                    type: string
                    description: Human-readable explanation of the payment requirement.
                  challengeId:
                    type: string
                    description: Unique challenge id for payment correlation.
        '403':
          description: >-
            Insufficient credits — API key balance too low or JWT weekly
            allowance exhausted.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
        '404':
          description: Publication or post not found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
        '503':
          description: Post exists but synthesized summary is not ready yet.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SummaryNotReadyResponse'
components:
  schemas:
    PaidPublicationPost:
      type: object
      additionalProperties: false
      required:
        - id
        - publicationId
        - publicationSlug
        - guid
        - slug
        - title
        - subtitle
        - description
        - url
        - author
        - imageUrl
        - publishedAt
        - synthesizedSummary
        - createdAt
        - updatedAt
      properties:
        id:
          type: string
          description: Internal post id.
        publicationId:
          type: string
          description: Publication id.
        publicationSlug:
          type: string
          description: Publication slug.
        guid:
          type: string
          description: Feed-level globally unique identifier.
        slug:
          type: string
          description: Post slug.
        title:
          type: string
          description: Post title.
        subtitle:
          type:
            - string
            - 'null'
          description: Post subtitle.
        description:
          type:
            - string
            - 'null'
          description: Short description from the feed.
        url:
          type: string
          description: Original post URL.
        author:
          type:
            - string
            - 'null'
          description: Post author.
        imageUrl:
          type:
            - string
            - 'null'
          description: Post hero or thumbnail image URL.
        publishedAt:
          type:
            - string
            - 'null'
          description: ISO publication timestamp.
        synthesizedSummary:
          type: string
          description: AI-synthesized post summary (returned after payment).
        createdAt:
          type: string
          description: ISO timestamp when the post was first imported.
        updatedAt:
          type: string
          description: ISO timestamp of the last update.
        paymentInfo:
          $ref: '#/components/schemas/PaymentInfo'
      example:
        id: post_xyz789
        publicationId: pub_abc123
        publicationSlug: stratechery
        guid: https://stratechery.com/p/the-ai-infrastructure-boom
        slug: the-ai-infrastructure-boom
        title: The AI Infrastructure Boom
        subtitle: Why hyperscalers are spending billions on GPU clusters
        description: A deep dive into the capex cycle driving AI infrastructure buildout.
        url: https://stratechery.com/2026/the-ai-infrastructure-boom
        author: Ben Thompson
        imageUrl: https://substackcdn.com/image/fetch/w_1200/ai-infra.jpg
        publishedAt: '2026-06-14T12:00:00Z'
        synthesizedSummary: >-
          Nvidia reported $26B in datacenter revenue last quarter, up 427% YoY,
          as hyperscalers race to build GPU clusters for AI training and
          inference. The article argues this capex cycle differs from past
          infrastructure booms because demand is driven by revenue-generating
          workloads (LLM inference for paying customers) rather than speculative
          capacity. Key risks include: (1) GPU utilization rates declining as
          supply catches up, (2) inference costs dropping faster than revenue
          grows, (3) custom silicon from Google (TPU) and Amazon (Trainium)
          eroding Nvidia's moat. The author remains bullish on picks-and-shovels
          plays through 2027.
        createdAt: '2026-06-14T12:05:00Z'
        updatedAt: '2026-06-15T08:00:00Z'
        paymentInfo:
          amountUsd: '0.50'
          protocol: x402
    ErrorMessage:
      type: object
      additionalProperties: false
      required:
        - error
      properties:
        error:
          type: string
          description: Human-readable error message.
    SummaryNotReadyResponse:
      type: object
      additionalProperties: false
      required:
        - error
        - code
      properties:
        error:
          type: string
          description: Human-readable error message.
        code:
          type: string
          enum:
            - summary_not_ready
          description: Machine-readable error code for programmatic handling.
    PaymentInfo:
      type: object
      additionalProperties: false
      required:
        - amountUsd
        - protocol
      properties:
        amountUsd:
          type: string
          description: Amount paid in USD.
        protocol:
          type: string
          enum:
            - x402
            - mpp
            - credits
            - privileged
          description: Payment protocol used.
        spendSource:
          type: string
          description: Spend source for credit payments (e.g. 'sponsored', 'purchased').

````