Insurance & InsurTech Research Agent

Superhighway guides

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:

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.

Not insurance or financial advice. This agent surfaces market intelligence for research purposes only — not underwriting guidance, coverage recommendations, or actuarial opinions. Consult a licensed insurance professional or actuary for coverage decisions.

How it works

Five endpoint calls feed one LLM synthesis:

  1. /research — deep synthesis of the market: structure, key carriers, loss ratio context, regulatory landscape, and technology adoption.
  2. /search (trade publications) — carrier strategy, rate filings, loss trends, market capacity, and regulatory actions scoped to Insurance Journal, Carrier Management, and PropertyCasualty360.
  3. /search (InsurTech ecosystem, time=year) — AI underwriting, claims automation, parametric and embedded insurance, UBI/telematics, digital MGAs, ILS/cat bonds, and VC funding.
  4. /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.
  5. /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

Research use only. Insurance market data and loss trends change rapidly with catastrophe events and regulatory actions. Verify carrier ratings, rate filings, and regulatory status through official sources (AM Best, NAIC, state insurance departments) before making underwriting or coverage decisions.

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.