Search insights
Authentication
Bearer authentication of the form Bearer <token>, where token is your auth token.
Request
Natural-language query, up to 2000 characters. When present, embedded and used for vector ANN ranking unless rank_by overrides. Whitespace-only is treated as absent.
Coarse: insight has any mention with this sentiment. Set strict_ticker_sentiment_pair=true to enforce that the sentiment is on one of the requested tickers.
Filter to specific insight ids (the id field on each hit, format in-...). Use this for deep-link / refresh round-trips where the FE already knows which insights it wants.
Filter to specific episodes (sonic_ingest_id). Powers the /episode/[id] page.
Filter to all episodes of these podcasts (our minted sonic_podcast_id; the raw podscan_podcast_id is also accepted for back-compat). Resolved at request time via Mongo lookup, then expanded to episode_ids before the TPUF query. Powers the /pod/[id] page.
Results per page, up to 25. Further results are reachable via next_cursor.
Opaque pagination token from a previous response’s next_cursor. When set, every other field is ignored — the original query’s parameters are replayed server-side. Cursors expire after ~15 minutes. Client-tier keys only (internal callers page with top_k).
Attach the verbatim transcript passage to each hit as quote (same rendered text as GET /insights/{id}/quote). Transcripts are fetched from cold storage — expect roughly +0.5-1.5s per 25 results. Quotes are resolved for at most the first 100 hits; a hit whose transcript is unavailable carries quote: null and the search succeeds regardless.
Response
Null while more pages exist. Otherwise why paging stopped: ranking_exhausted = the relevance ranking’s quality boundary (narrow the query for more depth); end_of_results = the browse window is fully paged.