Changelog
Track API changes, new features, and deprecations.
October 2026
v2Improved publication status descriptions- Improved publication status descriptions on GET /prospects and GET /prospects/:ticker. The API reference shows the current response shape.
- Existing clients keep working.
October 2026
v2Published generations- GET /prospects returns a
publicationobject for products that use published generations:generation_id,state,update_in_progress,latest_update_failed,previous_settingsandwarnings. Previous results stay listed while an update runs. Other products have nopublicationkey. - Pass
publication.generation_idasgeneration_idon later pages. If results were updated in between, the request returns 409 with reason"generation_unavailable": restart from offset 0 withoutgeneration_id. assessment_statusgains"unavailable"(analysis not available for this company in the current results), on rows and oninclude_childrenchildren. These rows carry null scores, rank after assessed and pending rows and before unassessed rows, and are excluded by a score floor.- GET /excerpts and POST /outreach return 409 with reason
"analysis_unavailable"for those companies, before any credit is charged. GET /prospects/:ticker returns their facts-only shape. - Detail, excerpts and outreach responses carry
publication.generation_idfor products that use published generations. - A product with nothing published yet returns 200 with
publication.state = "no_successful_generation"and unscored rows, not an empty list. - MCP server 2.12.0 supports all of the above.
October 2026
v2Nurture verdict and buying-signal weightaccount_verdicton GET /prospects/:ticker gains the value"nurture": the company fits the product but no current trigger is evidenced. Treat unknown future values as non-actionable rather than failing.deprioritizeis now only used for prospects with a deal score of 1 or 2.- GET /prospects/:ticker adds
group_verdict: the verdict of the group prose whennarrative_scopeis"group"(whereaccount_verdictis null). Same values asaccount_verdict. - A settled buying signal now adds more to the deal score: a potential opening adds 20 points and a strong buying opportunity adds 40 (previously 10 and 20). Scores update as each product is next processed, so
deal_scorecan rise without new evidence.
October 2026
v2Complaint index by line- GET /prospects rows now carry
complaints.by_line_of_business(latest report year, keyed likepremium.by_line_of_business), each withreport_year,total_complaints,complaint_index,complaint_index_status,contributing_entity_countandlow_sample(fewer than 10 complaints). The family index per line is the NAIC formula over members reporting the same year. Top-level fields are unchanged. - New list parameters
complaint_line,min_complaint_indexandmin_complaints.sort_by=complaint_indexuses the selected line (a single supportedlines_of_businessvalue selects it by default); sector roll-ups and statement-only lines retain the all-lines index. Explicit unsupported complaint lines return 400. Per-line requests return 503 until the projection refresh completes. - GET /prospects/:ticker for parents with no NAIC cocode of their own (private parent placeholders, public parents) now returns
complaintswithscope: "family", the family rollup per year and line, and aby_entitybreakdown, whether or not the member carriers are assessed. Observations gainlow_sample.
August 2026
v2.1Facts-only detail- GET /prospects/:ticker and GET /excerpts no longer return
404for companies that have not been assessed for the product. Detail returns the facts-only shape:assessment_status"unassessed", null scores, emptyfindings/excerpts, withcompany_info,premium,complaints, andhierarchypopulated. Excerpts return an empty page (total_count 0). Every ticker visible in a list or hierarchy is now fetchable;404means unknown or ambiguous, never “not analysed yet”.
August 2026
v2Breaking — v1 removed- All endpoints moved to
/api/v2./api/v1has been removed and returns410 Gonewith a JSON body naming the new base path. Update your base URL, and if you use the MCP server, upgrade it to 2.0.0 — 0.2.x targets v1 and stops working. Tool names, authentication, and configuration are unchanged. - Breaking:
framework_categoryhas been removed from the GET /excerpts query parameters and from every excerpt object, including excerpts embedded in prospect detail. Filter withmin_impact_scoreandkeywordinstead. - Breaking:
total_countis removed from GET /prospects; usetotal_groups(corporate families) andtotal_entities(companies inside them). (total_counton GET /excerpts is unrelated and unchanged.) - Breaking: GET /prospects, GET /prospects/:ticker, and GET /excerpts return 503 with
{ error: "projection_unavailable", reason }and aRetry-Afterheader when the product's prospect data is rebuilding (rebuilding) or has not been rebuilt since a keywords edit (stale_keywords). Callers that read an empty v1 list as “nothing matched” must handle the error path. - GET /prospects now lists the full candidate universe, not only assessed companies. Rows carry
assessment_status(assessed,pending_score,unassessed); unassessed rows have nulldeal_score/buying_signal_scoreand rank last under the defaultrelevanceordering. - GET /prospects accepts new filters:
assessment_status,entity_type,ownership,min_premium/max_premium,lines_of_business(any-match),min_licensed_states(0–50),states_licensed_in(all-match),q(name search, matching subsidiary names too), andinclude_children; plussort_by/sort_dirwith nulls-last semantics. Insurance filters are strict — a family with no premium data does not match a premium filter — andexcluded_no_data_groupscounts how many were dropped for lacking the data a filter required. - GET /prospects rows add NAIC premium summaries (with the
report_yearsthat contributed), family complaint summaries withcomplaint_index,lines_of_business,licensed_states,ownership,insurance_entity_types, andentity_count/matched_entity_count. - GET /prospects/:ticker adds
company_infofirmographics, entity-levelpremiumandcomplaints(full per-year, per-line NAIC series, narrowable withreport_year),hierarchywith child tickers you can pass straight back to the endpoint,narrative_scope, andexcerpt_count. Embeddedexcerptsare capped at 20 (highest impact first); use GET /excerpts for the rest. - GET /products and GET /products/:id now return
segment_targeting(allorselected) andtarget_segments: the insurance entity types a product sells to, with ownership, per-line premium bands, and licensed-footprint range. Segments are read-only; product setup stays in the UI. - Subsidiary tickers passed to the DealMap and outreach endpoints now resolve upward to the corporate family's DealMap (the response names the family) instead of failing. A
generatethat resolves to a cached family map is not charged. - PATCH /dealmap/node-top-pick is now documented (body
{ product_id, ticker, node_id, is_top_pick }). It was already implemented; it also gains an MCP tool,set_top_pick.
May 2026
v1Product visibility- GET /products and GET /products/:id now hide disabled products by default. Pass
include_disabled=trueto retrieve disabled product metadata. - Operational endpoints, including prospects, excerpts, outreach, and DealMap routes, continue to reject disabled product IDs.
March 2026
v1Initial release- GET /products and GET /products/:id — list and retrieve active products with keywords, sources, and industries. Disabled product metadata is available only through an explicit opt-in.
- GET /prospects and GET /prospects/:ticker — list ranked prospects and get detailed company analysis.
- GET /excerpts — search and filter evidence excerpts by impact score, framework category, and keywords.
- GET /dealmap, POST /dealmap/generate, PATCH /dealmap/node-role — buying committee DealMap with AI-assigned stakeholder roles and org hierarchy.
- POST /outreach — generate evidence-backed email and LinkedIn outreach messages.
- Bearer token authentication with
readandoutreachscopes. - Per-key rate limiting with dedicated caps for DealMap generation and outreach.
- Monthly credit system with per-plan allowances.