GET /api/v1/search is the default discovery route. Use it when the question is
a topic (“what are writers saying about AI capex?”) rather than a ticker,
person, or named publication.
Free, no auth. Results are candidates — ranked post cards with
priceCents. The synthesizedSummary still comes from the
paid publication-post route.
MCP: search_posts.
Request
q is required (minimum 2 characters). Default limit is 10.
Do not combine a
platform that conflicts with source (for example
platform=podcast with source=newsletter) — that returns 400.
publishedAfter must not be later than publishedBefore.
Search starts with publications curated for chat and can fall back to other
indexed publications when the initial matches are weak. publicationSlug
restricts the search to that publication. Disabled publications are excluded
from returned items.
Response
matchConfidence is strong, weak, or none. Present each item as
{title} ({publicationSlug}, YYYY-MM-DD) — $X.XX when priceCents is known.
Keep publicationSlug + slug for the paid fetch.
searchTierUsed is scoped or non_scoped. timeWindow describes a date
window inferred from the query, or is null; freshnessCoverage reports
coverage of that window and whether older results were used as a fallback.
count is the number of returned items. totalCount is the number of ranked
candidates before the response limit and disabled-publication filter, not a
count of every matching article in the catalog.
isPodcast is true for episodes — the paid post response then includes a
transcript when ready.
Invalid params return 400. Unexpected failures return 500 with
error: "Search failed. Please retry.", code: "internal_error", and a
recovery hint.

