{"openapi":"3.1.0","info":{"title":"Drip","version":"0.1.0","description":"Paid API for listing publications and purchasing full Substack post content.","x-guidance":"# Drip API Reference\n\n## Discovery\n\nPrefer `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.\n\nRoot `x-discovery.ownershipProofs` is a Drip vendor extension, not part of core MPP discovery.\n\n## Routes\n\n### `GET /api/v1/search`\n\nSearches imported articles by topic. Use this as the default discovery route for topic browsing rather than loading the whole publication catalog.\n\nQuery parameters:\n\n- `q` (required): natural-language search query\n- `limit` (optional): number of article results to return, from 1-10; use `10` by default\n- `mode` (optional): `hybrid` by default; `fts` is lexical only\n\nResponse includes `items[]`, ranked article candidates with `publicationSlug`, `slug`, `title`, `subtitle`, `publishedAt`, `snippet`, `whyMatched`, and relevance fields. Use `publicationSlug` + `slug` from a selected item to fetch the paid article.\n\nFor 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`. Treat search results as candidates, not article evidence; answer substantive questions from fetched article summaries.\n\n### `GET /api/v1/publications`\n\nLists every indexed publication with `slug`, `title`, `description`, `siteUrl`, and `lastSyncedAt`. Use this when the user explicitly wants to browse the full catalog of publications.\n\n### `GET /api/v1/publications/{publicationSlug}`\n\nReturns publication metadata plus `posts`: post summaries with `slug`, `title`, and `subtitle`. The server may import on demand if the publication is not already stored. Returns `404` when not found.\n\n### `POST /api/v1/publications/{publicationSlug}`\n\nImports or refreshes a publication. Optional JSON body: `{ \"forceRefresh\": true }`. Returns publication metadata and `postCount`.\n\n### `GET /api/v1/publications/{publicationSlug}/{postSlug}` (paid)\n\nReturns 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.\n\nUnpaid 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.\n\n### `GET /api/v1/stock-picks`\n\nReturns extracted stock-picker calls for AI-agent consumption after x402/MPP payment. By default, this route returns picks extracted during the past five UTC calendar days. Pass `date=YYYY-MM-DD` to request one UTC extraction date. Optional `limit` is 1-500 and defaults to 200.\n\nResponse includes `date`, `startDate`, `endDate`, `asOf`, `count`, and `items[]`. Each item includes ticker, action, direction, author conviction, evidence quote, rationale snippet, article URL, publication slug, post slug, publication timestamp, and extraction timestamp.\n\nRuntime price is based on the number of distinct attributed source articles in the returned picks, with at least the server default. After settlement, the server records a sale for each distinct attributed source article.\n\n### `GET /api/publications/posts`\n\nResolves a publication by `publicationId` or `publicationTitle` and returns paginated posts. `publicationTitle` is a case-insensitive substring and must match exactly one publication. This route is useful for dashboard-style post lists; for public agent flows, prefer `/api/v1/publications/{publicationSlug}` when you already have a slug.\n\n## Payment\n\nPaid 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.\n\nInfer the live price from the paid endpoint response or payment challenge. OpenAPI `x-payment-info.offers[]` is advisory and may show Tempo, Stripe, and Solana charges or catalog floor prices; per-post pricing comes from the runtime challenge. Always trust the live `402` challenge over discovery offers.\n\n## Agent flows\n\n### Topic search\n\nUse when the user asks a general question or wants article recommendations.\n\n1. Call `GET /api/v1/search?q={query}&limit=10`.\n2. Present returned `items[]` as article candidates using title, publication slug, and date.\n3. Keep each candidate's `publicationSlug` and `slug` for the paid fetch URL.\n4. Fetch selected article summaries with `GET /api/v1/publications/{publicationSlug}/{postSlug}` through a payment-aware client.\n5. Summarize or synthesize only from fetched `synthesizedSummary` text.\n\n### Specific publication\n\nUse when the user names a publication or shares a Substack publication URL.\n\n1. Resolve the normalized `publicationSlug`.\n2. Call `GET /api/v1/publications/{publicationSlug}`.\n3. Present recent post titles from `posts[]`.\n4. Fetch selected post bodies through the paid post route.\n\n### Browse catalog\n\nUse when the user asks to see available publications before choosing one.\n\n1. Call `GET /api/v1/publications`.\n2. Present publications as `Publication Title (slug) — short description`.\n3. After the user chooses a publication, call `GET /api/v1/publications/{publicationSlug}`.\n4. Fetch selected post bodies through the paid post route.\n\n### Stock picks\n\nUse when the user asks for stock-picker calls or recent investment picks.\n\n1. Call `GET /api/v1/stock-picks` through an x402 or MPP payment-aware client for the default past five UTC extraction days.\n2. Call `GET /api/v1/stock-picks?date={YYYY-MM-DD}` through an x402 or MPP payment-aware client when the user asks for a specific date.\n3. Present picks with ticker, action, direction, conviction, evidence quote, rationale snippet, article title, source publication, and source URL.\n4. Treat `publishedAt` as the article publication time and `extractedAt` as the stock-picker ingestion time.\n\n### Direct article\n\nUse when the user shares a direct article URL or a specific post slug.\n\n1. Resolve `publicationSlug` and `postSlug` from the URL or context.\n2. Call `GET /api/v1/publications/{publicationSlug}/{postSlug}` through a payment-aware client.\n3. Return a curated summary by default; include raw/full content only when explicitly requested.\n\n## Fetched article response handling\n\nFor 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.\n\nAppend source references for fetched articles with title, publication, date when available, and source URL when available.\n\nIf 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.\n\nRuntime pricing note: paid post challenges use the stored per-post USD price when present, else at least $0.1.\n"},"security":[],"x-service-info":{"categories":["media","newsletters","micropayments"],"docs":{"homepage":"/","apiReference":"/openapi.json","llms":"/llms.txt"}},"x-discovery":{"ownershipProofs":["did:pkh:eip155:8453:0xBF22b6DdB5A08c823856A779f1004eEa60C5aB92"]},"paths":{"/api/v1/search":{"get":{"operationId":"searchByTopic","summary":"Search imported posts by topic.","tags":["Search"],"security":[],"x-payment-info":{"authMode":"none"},"parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2},"description":"Natural-language query string."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":10,"default":10},"description":"Maximum number of items returned (1-10)."},{"name":"mode","in":"query","required":false,"schema":{"type":"string","enum":["fts","hybrid"],"default":"hybrid"},"description":"Search mode. `fts` is lexical only; `hybrid` blends lexical and semantic."}],"responses":{"200":{"description":"Search results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopicSearchResponse"}}}},"400":{"description":"Invalid query params.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopicSearchInvalidQueryResponse"}}}},"500":{"description":"Search failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}}}},"/api/v1/publications":{"get":{"operationId":"listPublications","summary":"List publications.","tags":["Publications"],"security":[],"x-payment-info":{"authMode":"none"},"responses":{"200":{"description":"List of publications.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListPublicationsResponse"}}}}}}},"/api/v1/publications/{publicationSlug}":{"get":{"operationId":"getPublication","summary":"Get one publication.","tags":["Publications"],"security":[],"x-payment-info":{"authMode":"none"},"parameters":[{"name":"publicationSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Publication slug, which is the normalized host."}],"responses":{"200":{"description":"Publication details and post titles.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicationDetail"}}}},"404":{"description":"Publication not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}}},"post":{"operationId":"importPublication","summary":"Import one publication.","tags":["Publications"],"security":[],"x-payment-info":{"authMode":"none"},"parameters":[{"name":"publicationSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Publication slug, which is the normalized host."}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"forceRefresh":{"type":"boolean","description":"When true, re-fetches publication feed even if records exist."}}}}}},"responses":{"200":{"description":"Publication imported successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportPublicationResponse"}}}},"404":{"description":"Publication not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}}}},"/api/v1/publications/{publicationSlug}/{postSlug}":{"get":{"operationId":"getPublicationPostBySlug","summary":"Get synthesized post summary (paid).","description":"Resolves the post. Returns HTTP 503 with code `summary_not_ready` until a synthesized summary exists. Then returns HTTP 402 until the client pays via MPP and/or x402 (WWW-Authenticate + PAYMENT-REQUIRED). The challenge amount is the stored per-post price in USD, or at least $0.1 when the post has no source price. Discovery `x-payment-info.offers[]` is advisory; runtime 402 is authoritative.","tags":["Posts"],"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)."}],"x-payment-info":{"authMode":"required","protocols":["x402","mpp"],"minPrice":"0.1","maxPrice":"10.00","price":{"min":"0.1","max":"10.00","currency":"USD"},"offers":[{"amount":"100000","currency":"0x20C000000000000000000000b9537d11c60E8b50","description":"Tempo TIP-20 charge in token smallest units (floor in discovery); per-post USD follows the live 402 challenge.","intent":"charge","method":"tempo","recipient":"0xBF22b6DdB5A08c823856A779f1004eEa60C5aB92"},{"amount":"50","currency":"usd","description":"Card payment via Stripe (fixed list price for this route in discovery).","intent":"charge","method":"stripe","recipient":"profile_61Umz1FUfXxChDA5oA6Umz1EM7SQ1AjJpNQxiSGWWUSe","methodDetails":{"networkId":"profile_61Umz1FUfXxChDA5oA6Umz1EM7SQ1AjJpNQxiSGWWUSe","paymentMethodTypes":["card","link"]}},{"amount":"100000","currency":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","description":"SPL USDC-style charge in smallest units; discovery shows the catalog floor — actual per-post amount follows the live 402 challenge.","intent":"charge","method":"solana","recipient":"ANUF2xniKdbNZsNpjfFo6v2Cfn5PGAr2T1vq3ELpeapi"},{"amount":"50","currency":"usd","description":"Card payment via Stripe (fixed list price for this route in discovery).","intent":"charge","method":"stripe","recipient":"profile_61Umz1FUfXxChDA5oA6Umz1EM7SQ1AjJpNQxiSGWWUSe"}]},"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"},"title":{"type":"string"},"status":{"type":"integer","enum":[402]},"detail":{"type":"string"},"challengeId":{"type":"string"}}}}}},"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"}}}}}}},"/api/v1/stock-picks":{"get":{"operationId":"listStockPicks","summary":"List stock-picker calls (paid).","description":"Returns extracted stock-picker calls for AI-agent consumption after x402/MPP payment. Defaults to the past five UTC extraction days; pass `date=YYYY-MM-DD` to request one extraction date. Runtime price is based on distinct attributed source posts returned, with at least the server default.","tags":["Stock Picks"],"x-payment-info":{"authMode":"required","protocols":["x402","mpp"],"minPrice":"0.1","maxPrice":"10.00","price":{"min":"0.1","max":"10.00","currency":"USD"},"offers":[{"amount":"100000","currency":"0x20C000000000000000000000b9537d11c60E8b50","description":"Tempo TIP-20 charge in token smallest units (floor in discovery); per-post USD follows the live 402 challenge.","intent":"charge","method":"tempo","recipient":"0xBF22b6DdB5A08c823856A779f1004eEa60C5aB92"},{"amount":"50","currency":"usd","description":"Card payment via Stripe (fixed list price for this route in discovery).","intent":"charge","method":"stripe","recipient":"profile_61Umz1FUfXxChDA5oA6Umz1EM7SQ1AjJpNQxiSGWWUSe","methodDetails":{"networkId":"profile_61Umz1FUfXxChDA5oA6Umz1EM7SQ1AjJpNQxiSGWWUSe","paymentMethodTypes":["card","link"]}},{"amount":"100000","currency":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","description":"SPL USDC-style charge in smallest units; discovery shows the catalog floor — actual per-post amount follows the live 402 challenge.","intent":"charge","method":"solana","recipient":"ANUF2xniKdbNZsNpjfFo6v2Cfn5PGAr2T1vq3ELpeapi"},{"amount":"50","currency":"usd","description":"Card payment via Stripe (fixed list price for this route in discovery).","intent":"charge","method":"stripe","recipient":"profile_61Umz1FUfXxChDA5oA6Umz1EM7SQ1AjJpNQxiSGWWUSe"}]},"parameters":[{"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)."},{"name":"date","in":"query","required":false,"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"description":"UTC extraction date to return. When omitted, the response covers the past five UTC extraction days."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":500,"default":200},"description":"Maximum number of stock-pick calls returned."}],"responses":{"200":{"description":"Stock-picker calls after successful payment.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicStockPicksResponse"}}}},"400":{"description":"Invalid query params.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicStockPicksInvalidQueryResponse"}}}},"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"},"title":{"type":"string"},"status":{"type":"integer","enum":[402]},"detail":{"type":"string"},"challengeId":{"type":"string"}}}}}},"500":{"description":"Stock picks failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}}}},"/api/publications/posts":{"get":{"operationId":"listPublicationPosts","summary":"List posts for a publication.","tags":["Posts"],"security":[],"x-payment-info":{"authMode":"none"},"parameters":[{"name":"publicationId","in":"query","required":false,"schema":{"type":"string"},"description":"Publication id (exact). Use this or publicationTitle."},{"name":"publicationTitle","in":"query","required":false,"schema":{"type":"string"},"description":"Case-insensitive substring; must match exactly one publication."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":20}}],"responses":{"200":{"description":"Paginated posts for the resolved publication.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListPublicationPostsResponse"}}}},"400":{"description":"Missing or ambiguous publication selector.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"Publication not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}}}}},"components":{"securitySchemes":{"siwx":{"type":"http","scheme":"bearer","bearerFormat":"SIWX","description":"SIWX wallet identity for identity-gated operations. No operation in this spec requires SIWX yet; paid routes use x402 / MPP only."}},"schemas":{"ErrorMessage":{"type":"object","additionalProperties":false,"required":["error"],"properties":{"error":{"type":"string"}}},"PublicationListItem":{"type":"object","additionalProperties":false,"required":["slug","siteUrl"],"properties":{"slug":{"type":"string"},"title":{"type":["string","null"]},"description":{"type":["string","null"]},"siteUrl":{"type":"string"},"lastSyncedAt":{"type":["string","null"]}}},"ListPublicationsResponse":{"type":"object","additionalProperties":false,"required":["publications"],"properties":{"publications":{"type":"array","items":{"$ref":"#/components/schemas/PublicationListItem"}}}},"PostSummary":{"type":"object","additionalProperties":false,"required":["slug","title"],"properties":{"slug":{"type":"string"},"title":{"type":"string"},"subtitle":{"type":["string","null"]}}},"PublicationCore":{"type":"object","additionalProperties":false,"required":["slug","title","description","siteUrl","imageUrl","language","authorName","authorEmail","copyright","lastSyncedAt"],"properties":{"slug":{"type":"string"},"title":{"type":["string","null"]},"description":{"type":["string","null"]},"siteUrl":{"type":"string"},"imageUrl":{"type":["string","null"]},"language":{"type":["string","null"]},"authorName":{"type":["string","null"]},"authorEmail":{"type":["string","null"]},"copyright":{"type":["string","null"]},"lastSyncedAt":{"type":["string","null"]}}},"PublicationDetail":{"allOf":[{"$ref":"#/components/schemas/PublicationCore"},{"type":"object","additionalProperties":false,"required":["posts"],"properties":{"posts":{"type":"array","items":{"$ref":"#/components/schemas/PostSummary"}}}}]},"ImportPublicationResponse":{"allOf":[{"$ref":"#/components/schemas/PublicationCore"},{"type":"object","additionalProperties":false,"required":["postCount"],"properties":{"postCount":{"type":"integer","minimum":0}}}]},"PublicationPostListItem":{"type":"object","additionalProperties":false,"required":["id","title","createdAt"],"properties":{"id":{"type":"string"},"title":{"type":"string"},"subtitle":{"type":["string","null"]},"description":{"type":["string","null"]},"author":{"type":["string","null"]},"createdAt":{"type":"string"}}},"ListPublicationPostsResponse":{"type":"object","additionalProperties":false,"required":["publicationId","items","page","limit","total","totalPages","hasNextPage","hasPreviousPage"],"properties":{"publicationId":{"type":"string"},"items":{"type":"array","items":{"$ref":"#/components/schemas/PublicationPostListItem"}},"page":{"type":"integer","minimum":1},"limit":{"type":"integer","minimum":1},"total":{"type":"integer","minimum":0},"totalPages":{"type":"integer","minimum":1},"hasNextPage":{"type":"boolean"},"hasPreviousPage":{"type":"boolean"}}},"TopicSearchTimeWindow":{"type":"object","additionalProperties":false,"required":["label","startIso","endIso","days"],"properties":{"label":{"type":"string","enum":["this_week","last_week","last_n_days","last_n_weeks","this_month","past_month","last_month","today","yesterday","latest_recent"]},"startIso":{"type":"string"},"endIso":{"type":"string"},"days":{"type":"integer","minimum":1}}},"TopicSearchFreshnessCoverage":{"type":"object","additionalProperties":false,"required":["requestedWindow","rankedInWindow","researchCandidatesInWindow","staleFallbackMode"],"properties":{"requestedWindow":{"$ref":"#/components/schemas/TopicSearchTimeWindow"},"rankedInWindow":{"type":"integer","minimum":0},"researchCandidatesInWindow":{"type":"integer","minimum":0},"staleFallbackMode":{"type":"boolean"}}},"TopicSearchPostItem":{"type":"object","additionalProperties":false,"required":["publicationSlug","slug","title","subtitle","isScopedPublisher","relevanceScore","matchedTokenCount","totalTokenCount","whyMatched","publishedAt"],"properties":{"publicationSlug":{"type":"string"},"slug":{"type":"string"},"title":{"type":"string"},"subtitle":{"type":["string","null"]},"isScopedPublisher":{"type":"boolean"},"relevanceScore":{"type":"number"},"matchedTokenCount":{"type":"integer","minimum":0},"totalTokenCount":{"type":"integer","minimum":0},"topicCoverageRatio":{"type":"number"},"whyMatched":{"type":"array","items":{"type":"string"}},"publishedAt":{"type":["string","null"]},"isInTimeWindow":{"type":"boolean"},"snippet":{"type":["string","null"]}}},"TopicSearchResponse":{"type":"object","additionalProperties":false,"required":["mode","asOf","query","normalizedQuery","matchConfidence","searchTierUsed","timeWindow","freshnessCoverage","totalCount","count","items"],"properties":{"mode":{"type":"string","enum":["fts","hybrid"]},"asOf":{"type":"string"},"query":{"type":"string"},"normalizedQuery":{"type":"string"},"matchConfidence":{"type":"string","enum":["strong","weak","none"]},"searchTierUsed":{"type":"string","enum":["scoped","non_scoped"]},"timeWindow":{"anyOf":[{"$ref":"#/components/schemas/TopicSearchTimeWindow"},{"type":"null"}]},"freshnessCoverage":{"anyOf":[{"$ref":"#/components/schemas/TopicSearchFreshnessCoverage"},{"type":"null"}]},"totalCount":{"type":"integer","minimum":0},"count":{"type":"integer","minimum":0},"items":{"type":"array","items":{"$ref":"#/components/schemas/TopicSearchPostItem"}}}},"TopicSearchInvalidQueryResponse":{"type":"object","required":["error","issues"],"properties":{"error":{"type":"string"},"issues":{"type":"object"}}},"PublicStockPickItem":{"type":"object","additionalProperties":false,"required":["id","callId","author","articleTitle","articleUrl","publishedAt","ticker","tickerExchange","instrumentType","action","direction","authorConviction","convictionLabel","activePick","evidenceQuote","rationaleSnippet","extractedAt","publicationSlug","postSlug"],"properties":{"id":{"type":"string"},"callId":{"type":"string"},"author":{"type":"string"},"articleTitle":{"type":"string"},"articleUrl":{"type":"string"},"publishedAt":{"type":["string","null"]},"ticker":{"type":"string"},"tickerExchange":{"type":["string","null"]},"instrumentType":{"type":"string","enum":["EQUITY","ETF","OPTION","OTHER"]},"action":{"type":"string","enum":["NEW_POSITION","ADD","HOLD","RECOMMENDATION","REDUCE","EXIT"]},"direction":{"type":"string","enum":["LONG","SHORT"]},"authorConviction":{"type":"integer","minimum":0,"maximum":5},"convictionLabel":{"type":"string"},"activePick":{"type":"boolean"},"evidenceQuote":{"type":"string"},"rationaleSnippet":{"type":["string","null"]},"extractedAt":{"type":"string"},"publicationSlug":{"type":["string","null"]},"postSlug":{"type":["string","null"]}}},"PublicStockPicksResponse":{"type":"object","additionalProperties":false,"required":["date","startDate","endDate","asOf","count","items"],"properties":{"date":{"type":["string","null"],"description":"Requested single date when `date` is provided, otherwise null."},"startDate":{"type":"string"},"endDate":{"type":"string"},"asOf":{"type":"string"},"count":{"type":"integer","minimum":0},"items":{"type":"array","items":{"$ref":"#/components/schemas/PublicStockPickItem"}}}},"PublicStockPicksInvalidQueryResponse":{"type":"object","required":["error","issues"],"properties":{"error":{"type":"string"},"issues":{"type":"object"}}},"SummaryNotReadyResponse":{"type":"object","additionalProperties":false,"required":["error","code"],"properties":{"error":{"type":"string"},"code":{"type":"string","enum":["summary_not_ready"]}}},"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"},"publicationId":{"type":"string"},"publicationSlug":{"type":"string"},"guid":{"type":"string"},"slug":{"type":"string"},"title":{"type":"string"},"subtitle":{"type":["string","null"]},"description":{"type":["string","null"]},"url":{"type":"string"},"author":{"type":["string","null"]},"imageUrl":{"type":["string","null"]},"publishedAt":{"type":["string","null"]},"synthesizedSummary":{"type":"string"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}}}}}}