- Date: when the change was announced or shipped
- Status:
Announcement(heads-up only),Deprecated(still works, will be removed),Shipped(now live), orSunset(removed) - Affected: the endpoint, response field, or parameter that changed
- Migration: what consumers need to do, when there is something to do
- Announcement: change announced; old behavior still works
- Soft sunset: old behavior continues but with deprecation headers / nulled fields
- Hard cutover: old behavior removed
2026-10-10
Themes and entity theme distributions restricted to the 12 canonical labels Status: Shipped · Affected:GET /v1/themes; value_chain_distribution and market_force_distribution on entities; MCP get_themes and list_entities
A handful of signals carried shorthand tag labels (C&I, R&L, T&L, T&SI, FM) alongside the real ones. They surfaced as extra themes and stray distribution keys. The API now serves only the 12 canonical labels on both axes. Those signals are being relabeled upstream, so their counts return under the full labels on the next refresh.
Migration: none. Consumers that keyed on the full labels see no change.
2026-10-10
Trend window drops the in-progress week; entityscale recalibrated
Status: Shipped · Affected: trend.current_week and trend.prior_week on entities and themes; scale on entities; MCP list_entities and get_entity_profile
Two fixes to the stats behind the interpretation labels. Shapes are unchanged.
The rolling 12-week window now ends on the last complete Monday-to-Sunday week. It used to include the week in progress, so on a Wednesday current_week held three days of signals and every entity and theme looked like it was dipping. current_week is now the last full week and prior_week the one before it. Week-over-week comparisons are now like for like.
Entity scale percentiles are now ranked over entities with 8 or more signals, the same set that gets direction, confidence, stability, and notability. They were ranked over every entity ever seen, most of which had no recent coverage, which pushed the Large threshold down to two mentions a month. Roughly one in three listed entities read as Large. Expect about 10% Large, 25% Medium, and the rest Small among trended entities, and Small for everything below 8 signals.
Migration: none. Consumers filtering on scale=Large will see a much shorter, more meaningful list.
2026-09-12
Entity list defaults to reviewed entities: newmin_signals parameter
Status: Shipped · Affected: GET /v1/entities (new min_signals query parameter, default 2); MCP list_entities (same parameter)
Entity coverage follows a power law, and human review is spent where the reach is: an entity is reviewed by a person when it appears in a second signal, and on every flagged signal after that. An entity on a single signal has not been reviewed. GET /v1/entities now reflects that boundary with min_signals (integer, minimum 1, default 2). By default the list returns entities with signal_count >= 2, the reviewed set. Pass min_signals=1 to get the previous behavior, including single-signal entities.
GET /v1/entities/{name_or_id} is unchanged and resolves any known ID or name regardless of signal count. The entities arrays nested on signals are unchanged.
Migration: consumers that listed every entity, including single-signal ones, should pass min_signals=1. Consumers already filtering on signal_count client-side can drop that filter.
2026-08-15
Podcast sources: every high-signal segment is now its own signal Status: Shipped · Affected: podcast-sourced signals everywhere they appear (citation.url, card title, signal volume)
Previously, each podcast episode contributed a single signal: the one highest-signal segment. Now every segment that clears the quality gates becomes its own signal. Segments from the same episode differ by URL and title:
citation.urlcarries the exact audio span:?t=<start>&end=<end>in integer seconds, e.g....watch?v=abc&t=1372&end=1818. The URL is self-describing: this signal’s source is seconds 1372 to 1818 of this episode. On YouTube-hosted episodes, opening the link seeks playback to the span’s start.- Titles are
Episode — Chapter(e.g. “Tokens Are the New Dollars | Stripe with a16z — Agentic Commerce: The Missing Primitives”), so sibling segments are distinguishable in listings. - Verification pattern: fetch the public audio and listen from
t. The span bounds are the evidence locator, complementingevidence_preview.
2026-08-13
related_entities capped at top 25
Status: Shipped · Affected: related_entities[] in GET /v1/entities/{name_or_id}
Entity profiles now return the top 25 co-occurring entities by co_occurrence_count instead of the full list. Broad entities co-occur with most of the corpus: the largest profiles carried 500+ related entities and tens of KB of long tail that says little and blows the context budget of agent clients reading profiles over MCP. The entry shape is unchanged.
2026-08-11
evidence → evidence_preview
Status: Shipped · Affected: unit.evidence in GET /v1/signals/{id} and GET /v1/search
The unit field evidence is renamed evidence_preview, and the per-snippet preview cap drops from 100 to 50 characters. Same shape inside (snippets[] of { text, truncated }). The rename says what the field is: a short verbatim locator into the source, deliberately not the full stored passage. Verification runs through citation.url.
2026-06-18
Response v2: flat units, role axis, semantic naming Status: Shipped · Affected:GET /v1/signals, GET /v1/signals/{id}, GET /v1/search, entity content_type_mix
A single redesign of the /v1 response shapes. This is the /v1 contract going forward.
- Signal detail is a flat
units[]. The nesteddecompositiontree (thesis/arguments/claims buckets, nestedsentences[], theunitwrapper) is gone. Each unit is{ id, role, text, argument_id?, entities?, verification?, evidence? }. roleaxis replacesunit.type:thesis | synopsis | argument | claim. Reconstruct prose by role; groupargumentunits byargument_id. List position is the order (no index field).content_typevalues are nowanalysis|event(wasfactual_event); entitycontent_type_mixkeys follow.- Card carries the central statement whole as
thesis(analysis) /synopsis(event). The olddevelopmentfield and theargument_count/argument_headlinespreviews are removed. domainis now a flat field (wassource: { domain }).verified_text_unit_count→verified_unit_count(equalslen(units)).- Evidence is returned by default on signal detail; the
?include=evidenceparameter is removed. - Search hits nest the byte-identical unit object:
{ unit, citation, relevance_score }, withverification/evidenceinsideunit,unit.type → role, and inline evidencesnippets(thesnippet_countfield and thediagnosticsblock are gone). The search filter is nowrole=(wastype=sentence|claim). - SDK bumped to 0.8.0 for the new shapes.
2026-06-14
Better rate-limit signals (additive) Status: Shipped · Affected: all endpoints (429 responses + rate-limit headers) Non-breaking improvements so clients can pace and back off accurately:X-RateLimit-Reset-Minute/X-RateLimit-Reset-Monthlyheaders added to every authenticated response (unix epoch seconds until each window resets).429responses now carry the fullX-RateLimit-*header set (previously onlyRetry-After), so a throttled client can see which window was hit and when it clears.Retry-Afteris now computed from the actual window reset instead of a fixed value: the per-minute value ranges 1-60s, and the monthly value reflects the real reset rather than a misleading constant.retry_afterandresetare echoed into the429JSON body, so clients that only parse the body (not headers) can still back off correctly.
2026-06-12
List text filters renamed; searchentity accepts names
Status: Shipped · Affected: GET /v1/signals, GET /v1/entities, GET /v1/search
Two consistency changes so a parameter name always means one thing:
qis now reserved for semantic search. On the list endpoints the literal text filter has been renamed to match what it does:GET /v1/signalsuseskeyword(wasq),GET /v1/entitiesusesname(wasq).qcontinues to mean a natural-language semantic query, and onlyGET /v1/searchhas it. The SDK and MCP tools follow the same rename (signals.list(keyword=…),entities.list(name=…)).GET /v1/search?entity=now accepts a display name in addition to agld:/…public ID, matching the signals filter. Names resolve to the family-level canonical entity; pass the public ID when you need guaranteed precision.
GET /v1/signals?q= → ?keyword= and GET /v1/entities?q= → ?name= (and the matching SDK/MCP keyword args). The old q parameter on these two endpoints is no longer read; requests still succeed but the filter is silently ignored, so check any list call that relied on q. No change required for GET /v1/search.
2026-04-28
Improved analysis extraction (v4) Status: Shipped · Affected: Analysis signals (content_type=analysis). Event signals are unaffected.
Analysis articles ingested from this date forward use a refreshed extraction pipeline:
- Each article now decomposes into 3-6 atomic supporting arguments (vs. 1 broader argument previously)
- Claims are extracted at the article level rather than under a single argument, removing the constraint that previously limited claim count