Insurance & InsurTech Research Agent
Insurance is a regulated, cyclical, capital-intensive business where a coverage decision, a rate filing, or an InsurTech bet turns on loss trends, carrier appetite, AM Best ratings, and the trajectory of underwriting technology. This guide builds a Python agent for insurance carriers and underwriters, InsurTech founders and investors, reinsurance analysts, actuarial teams, brokers and MGAs, corporate risk managers, and insurance regulatory compliance teams. It chains all four Superhighway endpoints — /research for the market structure, /search against authoritative insurance trade publications and the InsurTech ecosystem, /scrape for a specific rate filing or analyst report, and /news for catastrophe losses, rate filings, and funding rounds — then uses an LLM to emit a structured insurance brief as JSON.
Overview
The agent takes an insurance line, carrier, InsurTech startup, or market segment — "cyber insurance market 2024 trends", "homeowners insurance California wildfire market" — and produces a structured insurance and InsurTech brief:
- Synthesizes the market structure: key carriers, loss ratio context, regulatory landscape, and technology adoption
- Searches authoritative insurance trade publications — Insurance Journal, Carrier Management, PropertyCasualty360, Business Insurance — for carrier strategy, rate filings, loss trends, market capacity, and regulatory actions
- Searches the InsurTech ecosystem — AI-driven underwriting, claims automation, parametric and embedded insurance, usage-based insurance (UBI/telematics), digital MGAs, reinsurance tech (ILS/cat bonds), and VC funding
- Scrapes one relevant page: a state insurance department rate filing, a carrier 10-K section, an InsurTech analyst report, or a Deloitte/McKinsey insurance outlook
- Pulls recent news: catastrophe loss events, carrier rate filings, market hardening/softening, regulatory actions, InsurTech funding rounds, and insurance M&A
- Uses an LLM to generate a structured brief — market overview, carrier landscape, underwriting and loss trends, regulatory environment, technology, distribution, and funding as JSON
Who it's for: insurance carriers and underwriters, InsurTech startups and their investors, reinsurance analysts, actuarial teams, insurance brokers and MGAs, corporate risk managers, and insurance regulatory compliance teams.
How it works
Five endpoint calls feed one LLM synthesis:
/research— deep synthesis of the market: structure, key carriers, loss ratio context, regulatory landscape, and technology adoption./search(trade publications) — carrier strategy, rate filings, loss trends, market capacity, and regulatory actions scoped to Insurance Journal, Carrier Management, and PropertyCasualty360./search(InsurTech ecosystem,time=year) — AI underwriting, claims automation, parametric and embedded insurance, UBI/telematics, digital MGAs, ILS/cat bonds, and VC funding./scrape— one relevant URL, e.g. a state insurance department rate filing, a carrier 10-K section, an InsurTech analyst report, or a Deloitte/McKinsey insurance outlook./news(time=month) — recent catastrophe losses, carrier rate filings, market hardening/softening, regulatory actions, InsurTech funding rounds, and insurance M&A.
Full example
pip install openai requests python-dotenv
Create a .env file with your two keys:
SUPERHIGHWAY_API_KEY=your_key_here
OPENAI_API_KEY=your_key_here
import requests, os, json
from openai import OpenAI
SUPERHIGHWAY_KEY = os.getenv("SUPERHIGHWAY_API_KEY")
BASE = "https://superhighway.walls.sh"
HEADERS = {"Authorization": f"Bearer {SUPERHIGHWAY_KEY}"}
llm = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
# 1. Deep synthesis of the insurance market structure
def research_market(query: str) -> str:
"""Market structure, key carriers, loss ratio context, regulation, technology."""
r = requests.get(
f"{BASE}/research",
params={"q": f"{query} insurance market underwriting technology"},
headers=HEADERS,
)
data = r.json()
return data.get("summary", "")[:3000]
# 2. Authoritative insurance trade publications
def search_trade(query: str) -> list[dict]:
"""Carrier strategy, rate filings, loss trends, market capacity, regulation."""
r = requests.get(
f"{BASE}/search",
params={
"q": f"{query} site:insurancejournal.com OR site:carriermanagement.com "
f"OR site:propertycasualty360.com insurance underwriting market rate",
},
headers=HEADERS,
)
return r.json().get("results", [])
# 3. InsurTech ecosystem (last year)
def search_insurtech(query: str) -> list[dict]:
"""AI underwriting, claims automation, parametric/embedded insurance, UBI, MGAs."""
r = requests.get(
f"{BASE}/search",
params={
"q": f"{query} insurtech startup innovation AI automation "
f"embedded insurance",
"time": "year",
},
headers=HEADERS,
)
return r.json().get("results", [])
# 4. Scrape one relevant rate filing / 10-K / analyst report / outlook
def scrape_page(url: str) -> dict:
"""Pull a rate filing, carrier 10-K section, analyst report, or outlook piece."""
r = requests.post(
f"{BASE}/scrape",
json={"url": url, "mode": "markdown"},
headers=HEADERS,
)
data = r.json()
return {
"url": url,
"title": data.get("title", ""),
"content": data.get("markdown", data.get("text", ""))[:2500],
}
# 5. Recent insurance news: losses, rate filings, regulation (last month)
def get_news(query: str) -> list[dict]:
"""Catastrophe losses, rate filings, regulatory actions, funding, M&A."""
r = requests.get(
f"{BASE}/news",
params={
"q": f"{query} insurance carrier loss claims catastrophe rate filing "
f"regulatory",
"time": "month",
},
headers=HEADERS,
)
return r.json().get("results", [])
def generate_brief(
query: str,
market: str,
trade: list[dict],
insurtech: list[dict],
scraped: dict | None,
news: list[dict],
) -> dict | None:
"""Generate a structured insurance & InsurTech brief as JSON."""
trade_text = "\n".join(
f"- {r.get('title', '')}: {r.get('snippet', '')} ({r.get('url', '')})"
for r in trade[:6]
)
insurtech_text = "\n".join(
f"- {r.get('title', '')}: {r.get('snippet', '')}"
for r in insurtech[:6]
)
news_text = "\n".join(
f"- {n.get('title', '')}: {n.get('snippet', '')}"
for n in news[:6]
)
scraped_text = ""
if scraped and scraped.get("content"):
scraped_text = f"{scraped['title']}\n{scraped['content']}"
response = llm.chat.completions.create(
model="gpt-4o-mini",
messages=[
{
"role": "system",
"content": (
"You are an insurance and InsurTech analyst. Use ONLY the "
"provided sources. Do not invent loss ratios, premium figures, "
"AM Best ratings, or carrier names — if a detail is not in the "
"sources, say 'not found in sources.' Be precise about market "
"cycle position, loss trends, and regulatory status, and flag "
"when figures may be estimates or sector averages."
),
},
{
"role": "user",
"content": f"""Write an insurance & InsurTech brief for: {query}
Market Structure (synthesis):
{market}
Insurance Trade Publications (Insurance Journal / Carrier Management / PropertyCasualty360):
{trade_text}
InsurTech Ecosystem:
{insurtech_text}
Scraped Rate Filing / 10-K / Analyst Report / Outlook:
{scraped_text}
Recent Insurance News:
{news_text}
Return JSON with ALL of these fields:
- subject: insurance line, carrier, InsurTech startup, or market segment being researched
- insurance_line: "P&C" | "life" | "health" | "cyber" | "specialty" | "marine" | "aviation" | "reinsurance" | "mixed"
- market_segment: "personal-lines" | "commercial-lines" | "SMB" | "enterprise" | "wholesale-E&S" | "public-entity" | "mixed"
- market_overview: premium volume, market capacity, number of carriers, concentration vs. fragmentation, hard vs. soft market cycle position
- carrier_landscape: major carriers by line (e.g., State Farm/Allstate for personal auto; AIG/Chubb/Markel for specialty), market share, AM Best ratings context, mutual vs. stock carriers
- underwriting_and_loss_trends: combined ratio benchmarks, loss ratio trends, catastrophe exposure, reserve development, key peril drivers (wildfire, flood, cyber, liability inflation)
- regulatory_environment: state vs. federal regulation, NAIC model laws, rate filing requirements, key regulatory actions or restrictions (e.g., California non-renewals, Florida market crisis), surplus lines/E&S market role
- technology_landscape: insurtech innovations relevant to this line — telematics/UBI, AI underwriting, claims automation, embedded insurance, parametric products, digital MGAs/coverholder structures, ILS/cat bonds
- distribution_and_channel: agent/broker vs. direct, MGA/wholesale role, digital distribution, affinity/embedded channels, carrier appetite for direct-to-consumer
- investment_and_funding: VC/PE activity in InsurTech relevant to this segment, recent funding rounds, IPOs, carrier M&A, ILS issuance volume
- data_quality: "high" | "medium" | "low" — based on availability of trade publication coverage and public regulatory data
- disclaimer: "Not insurance or financial advice. For research purposes only. Consult a licensed insurance professional for coverage decisions."""",
},
],
response_format={"type": "json_object"},
)
try:
return json.loads(response.choices[0].message.content)
except (json.JSONDecodeError, KeyError):
return None
def research_insurance(query: str) -> dict | None:
"""Run the full insurance & InsurTech research pipeline."""
print(f"Researching insurance: {query}")
print("Synthesizing market structure...")
market = research_market(query)
print("Searching insurance trade publications...")
trade = search_trade(query)
print("Searching InsurTech ecosystem...")
insurtech = search_insurtech(query)
print("Scraping a relevant filing / report / outlook...")
scraped = None
for result in trade + insurtech:
url = result.get("url")
if url:
scraped = scrape_page(url)
if scraped.get("content"):
break
print("Pulling recent insurance news...")
news = get_news(query)
print("Generating insurance brief...")
return generate_brief(query, market, trade, insurtech, scraped, news)
def print_brief(brief: dict):
if not brief:
print("Could not generate brief.")
return
print(f"\n{'='*60}")
print(f"Insurance & InsurTech Brief")
print(f"{'='*60}")
print(f"\nSubject: {brief.get('subject', '')}")
print(f"Insurance Line: {brief.get('insurance_line', '')}")
print(f"Market Segment: {brief.get('market_segment', '')}")
print(f"\nMarket Overview:\n{brief.get('market_overview', '')}")
print(f"\nCarrier Landscape:\n{brief.get('carrier_landscape', '')}")
print(f"\nUnderwriting & Loss Trends:\n{brief.get('underwriting_and_loss_trends', '')}")
print(f"\nRegulatory Environment:\n{brief.get('regulatory_environment', '')}")
print(f"\nTechnology Landscape:\n{brief.get('technology_landscape', '')}")
print(f"\nDistribution & Channel:\n{brief.get('distribution_and_channel', '')}")
print(f"\nInvestment & Funding:\n{brief.get('investment_and_funding', '')}")
print(f"\nData Quality: {brief.get('data_quality', '?')}")
print(f"\nDisclaimer: {brief.get('disclaimer', '')}")
if __name__ == "__main__":
import sys
query = sys.argv[1] if len(sys.argv) > 1 else "cyber insurance market 2024 trends"
brief = research_insurance(query)
print_brief(brief)
Usage examples
- "cyber insurance market 2024 trends" — maps the cyber liability market hardening/softening cycle, profiles key cyber carriers (Coalition, At-Bay, Beazley, AIG), traces ransomware loss trends, surfaces AI-driven underwriting tools and Lloyd's market cyber appetite, and flags parametric cyber products.
- "homeowners insurance California wildfire market" — covers the California non-renewal crisis, FAIR Plan capacity, AB 2855 impact, the admitted vs. E&S market shift, carrier exit strategy, risk-scoring startups (Zesty.ai, Cape Analytics), and rate filing constraints under Prop 103.
- "embedded insurance InsurTech startup ecosystem" — profiles embedded insurance distribution (Grab, Tesla, Cover Genius, Qover), API-first insurance infrastructure, affinity program economics, MGA/coverholder digital structures, the Lloyd's Lab innovation pipeline, and VC investment in embedded insurance.
Getting your API key
Grab a free Superhighway key at /pricing (1,000 calls/month, no credit card). For an agent that provisions its own access, skip the key entirely with x402: it pays $0.002 per call in USDC on Base — no signup, no key management. See the x402 pay-per-call guide for the wallet setup.
See also
The financial research agent uses the same four-endpoint pattern on companies and markets, and the regulatory research agent applies it to compliance and regulatory questions.