Inspiration
Traditional home insurance underwriting is slow, manual, and inconsistent. Underwriters must individually consult flood maps, planning portals, crime databases, and EPC registers — a process that can take hours per application and introduces significant human variability. Smaller insurers lack the tooling to do this at scale, leading to mispriced risk and poor customer experience.\
Aurea solves this by automating the entire data collection and decision pipeline using a graph of specialised AI agents, each responsible for a single risk dimension, coordinated by a Claude-powered LLM synthesis layer.
What it does
Aurea is a multi-agent AI system that automates the underwriting of UK residential property insurance. Given a property address and postcode, Aurea runs a parallel pipeline of specialised agents — each pulling from a different authoritative data source — to produce a risk score, a premium multiplier, and a plain-English decision (accept / refer / decline) within seconds.
How we built it
Architecture Overview
The system is a LangGraph agent graph running on a FastAPI backend. Data agents run in parallel; the LLM synthesis layer runs sequentially after.
Input (address + postcode)
│
▼
┌─────────────────────────────────────────────────────┐
│ Parallel Data Collection │
│ │
│ PropertyValuationAgent │ FloodRiskAgent │
│ EnvironmentalDataAgent │ LocalitySafetyAgent │
└──────────────┬──────────────────────────────────────┘
│ all scores + raw data
▼
PolicyAgent (RAG — MongoDB Atlas Vector Search)
│ relevant policy chunks
▼
CoordinatorAgent (AWS Bedrock / Claude)
│ decision + overall score
▼
ExplainabilityAgent (AWS Bedrock / Claude)
│
▼
API Response
Agents
1. PropertyValuationAgent
Assesses planning & development risk using the IBEX Planning API by Serac Technologies.
Data retrieved:
- Nearby planning applications within 500 m (heading, decision, appeals, new houses, floor area, project type, comment count)
- Council-level statistics (activity level, approval rate, refusal rate, new homes approved, application counts by type)
- Full details for flagged high-risk applications (conditional — demolition, hazardous materials, 10+ houses, active appeals)
Flow:
- Geocode address → lat/lon via Nominatim
IBEX POST /search(500 m radius) — fetch nearby applications + extractcouncil_id- Fallback A: postcodes.io → council name lookup map
- Fallback B:
IBEX POST /search(2000 m wide radius) - (no permission so commented out)
IBEX POST /stats(council_id) — fetch council-level development statisticsIBEX POST /applications-by-id(conditional) — full details for up to 5 flagged applications- LLM construction risk analysis — all application headings passed to Claude Sonnet 4.6 via AWS Bedrock; Claude identifies instances of demolition, excavation, hazardous materials, large-scale development, and change-of-use, scoring each by severity (low / medium / high); returns a calibrated
risk_score(0–30) and a list of identified risk instances
Risk score (0–100):
base score = council activity level (low=5, moderate=15, high=35, very high=60)
stats bonus = +8 if >500 new homes approved
+ +4 if >200 new homes approved
+ +4 if refusal rate >20%
llm_construction = Claude-assigned score 0–30 (demolition/excavation/hazardous/large-scale)
appeal bonus = appeals × 3, capped at 12
final score = base + stats_bonus + llm_construction + appeal_bonus
| Score | Label |
|---|---|
| 0–24 | Low |
| 25–49 | Moderate |
| 50–74 | High |
| 75–100 | Very High |
2. FloodRiskAgent
Assesses flood risk using the DEFRA CYLTFR methodology, augmented with IBEX planning data.
Data retrieved:
- DEFRA Flood Risk Zone polygons at the property's exact coordinates (planning.data.gov.uk)
- Live EA flood warnings and alerts within 5 km (EA Flood Monitoring API)
- Nearby planning applications within 500 m that mention flood risk in their heading (IBEX)
Flow:
- Query
planning.data.gov.ukfor flood-risk-zone entities at the property coordinates- Zone 2/3 polygon present → classify accordingly
- No polygon returned → implicitly Zone 1 (DEFRA only publishes elevated-risk polygons)
- Query EA Flood Monitoring API for active warnings within 5 km
IBEX POST /search(500 m radius) — count applications mentioning flood risk, drainage assessments, SUDS, sequential test in heading
Risk score (0–100):
base score = flood zone (Zone 1=5, Zone 2=45, Zone 3=85, unknown=20)
warning uplift = +10 flood alert | +20 flood warning | +30 severe warning
ibex uplift = +4 if 1 nearby flood-risk app | +8 if 2–4 | +15 if 5+
final score = min(base + warning_uplift + ibex_uplift, 100)
| Zone | Risk Level | Annual Probability |
|---|---|---|
| 1 | Very Low | < 0.1% |
| 2 | Low to Medium | 0.1% – 1% |
| 3 | High | > 1% |
3. EnvironmentalDataAgent
Assesses property age and building quality risk using EPC certificate data. Also extracts a full structured property profile returned to the frontend as informational display.
Data retrieved:
- Construction age band (e.g. "before 1900", "2012 onwards")
- Property type (House, Flat, Maisonette, Bungalow)
- Built form (Detached, Semi-Detached, Mid-Terrace, End-Terrace)
- Current EPC energy rating (A–G)
- Total floor area (m²)
- Number of habitable rooms
- Wall construction description (e.g. "Cavity wall, as built, no insulation")
- Roof description (e.g. "Pitched, 270 mm loft insulation")
- Floor description
- Glazing type (double / single)
- Main heating system description
- Confirmed address from EPC record
Flow:
- Query MHCLG EPC Open Data API (
/api/v1/domestic/search) by postcode — up to 5 records - If empty body returned, retry with outward code only (e.g.
M145TL→M14) - Extract all EPC fields from most recent record; build structured
property_detailsdict - Score age band and energy rating separately; blend into composite risk score
property_detailsis passed through to the API response and displayed in the frontend as a Property Details card (sourced from the EPC Register)
Risk score (0–100):
age score = lookup table (pre-1900=80, 1900–29=65, ..., 2012+=10)
energy score = A=5, B=15, C=30, D=50, E=65, F=80, G=95
final score = age_score × 70% + energy_score × 30%
(falls back to age-only if energy rating unavailable)
4. LocalitySafetyAgent
Assesses crime and neighbourhood safety risk.
Data retrieved:
- All street-level crimes within 1-mile radius over the past 12 months (Police UK API)
- Crime categories: burglary, criminal damage/arson, robbery, vehicle crime, theft from person, and all other categories
Flow:
- Probe up to 4 months back to find the most recent available month (API has 2–3 month publication lag)
- Fetch all 12 months in parallel using
asyncio.gather - Aggregate all crimes and apply category weights
Risk score (0–100):
weighted_total = Σ (crime_count × weight)
weights: burglary=3.0, criminal-damage-arson=2.5, robbery=1.5,
vehicle-crime=1.0, theft-from-person=0.8, other=0.3
final score = min(weighted_total / 96, 100)
divisor 96 = 8 per month × 12 months
| Score | Label |
|---|---|
| 0–19 | Very Low Crime |
| 20–39 | Low Crime |
| 40–59 | Moderate Crime |
| 60–79 | High Crime |
| 80–100 | Very High Crime |
5. PolicyAgent
Retrieves relevant insurance policy guidelines using RAG.
Data retrieved:
- Top 3 most semantically relevant policy chunks from MongoDB Atlas Vector Search
- Embeddings generated via Amazon Titan Embed Text v2
Flow:
- Build a natural-language query from all four risk scores and labels
- Embed the query and search MongoDB Atlas Vector Search
- Return top-3 policy chunks to the CoordinatorAgent as context
6. CoordinatorAgent
LLM synthesis of all sub-agent scores into a single underwriting decision.
Data received:
- All four risk scores and labels from data agents
- Retrieved policy context from PolicyAgent
Flow:
- Construct prompt with all scores, labels, and policy guidelines
- Invoke Claude Sonnet 4.6 via AWS Bedrock
- Parse structured JSON response
- Falls back to deterministic weighted average if Bedrock is unavailable
Final risk score (fallback formula):
overall_risk_score = flood×0.40 + planning×0.20 + age×0.25 + crime×0.15
premium_multiplier = 1.0 + (overall_risk_score / 100) × 2.0 (clamped 0.80–3.00)
Decision thresholds:
| Overall Score | Decision |
|---|---|
| < 60 | Accept |
| 60–79 | Refer |
| ≥ 80 | Decline |
7. ExplainabilityAgent
Generates a customer-facing explanation of the decision.
Flow:
- Invoke Claude Sonnet 4.6 via AWS Bedrock with the full decision context
- Produce structured JSON:
risk_factors(name, score, weight, one-sentence reasoning per factor),policy_citations,plain_english_narrative - Falls back to a deterministic template if Bedrock is unavailable
Data Sources
| Source | What it provides | Agent |
|---|---|---|
| IBEX Planning API — Serac Technologies | Nearby planning applications, council-level development statistics, appeals data | PropertyValuationAgent |
| Nominatim / OpenStreetMap | Free address geocoding (lat/lon) | PropertyValuationAgent |
| postcodes.io | Postcode metadata, council district resolution | PropertyValuationAgent |
| planning.data.gov.uk | DEFRA Flood Risk Zone polygons — MHCLG authoritative source | FloodRiskAgent |
| EA Flood Monitoring API | Live EA flood warnings and alerts (free, no auth) | FloodRiskAgent |
| EPC Open Data — MHCLG | Energy Performance Certificate records — construction age, property type | EnvironmentalDataAgent |
| Police UK API | Street-level crime data by month (free, no auth) | LocalitySafetyAgent |
| MongoDB Atlas Vector Search | Semantic policy document retrieval (RAG) | PolicyAgent |
| AWS Bedrock — Claude Sonnet 4.6 | LLM construction risk analysis from planning headings; underwriting synthesis; plain-English explanation | PropertyValuationAgent, CoordinatorAgent, ExplainabilityAgent |
| Amazon Titan Embed Text v2 | Generating embeddings for RAG policy retrieval | PolicyAgent / PolicyService |
Challenges we ran into
- figuring out the ibex api permissions and access
- multi agent system latency
Accomplishments that we're proud of
- IBEX Planning API Integration: Successfully leveraged Serac Technologies’ IBEX Planning API to retrieve detailed planning applications and council-level statistics, enabling nuanced construction risk analysis with LLM-assisted scoring.
- Open Data Utilisation: Incorporated authoritative open sources—DEFRA flood maps, EPC records, Police UK crime data, and more—maximising accuracy while keeping costs low.
- Seamless Multi-Agent Orchestration: Built a LangGraph agent graph that runs multiple specialised agents in parallel, coordinating their outputs through a Claude-powered LLM synthesis layer for real-time underwriting decisions.
What we learned
- Parallel vs. Sequential Processing: Running property, flood, environmental, and crime data agents in parallel drastically improves throughput, while sequential LLM synthesis ensures consistent, holistic decisions.
- LLM-Augmented Scoring: Using Claude Sonnet 4.6 to interpret planning applications, assess construction risk, and synthesise underwriting decisions increases nuance over deterministic scoring rules alone.
- Data Gaps Are Inevitable: Some open data sources (e.g., EPC records, flood polygons) are incomplete or lagged; fallback strategies and redundancy (multi-radius searches, postcode-level lookups) are critical for robust scoring.
- Explainability Matters: Even highly automated decisions require clear, traceable reasoning for regulatory compliance and customer trust.
- Policy Context Improves Accuracy: Integrating RAG-based retrieval ensures that AI outputs respect existing underwriting guidelines, bridging the gap between automation and human oversight.
What's next for Aurea — AI-Powered Residential Insurance Underwriting
- Deeper IBEX Integration: Expand the PropertyValuationAgent to incorporate richer datasets—historic planning trends, development approvals vs. refusals, and flagged high-risk projects—to improve construction risk scoring.
- Enhanced Multi-Agent Collaboration: Experiment with multi-agent reasoning loops, where agents can query each other’s outputs before final synthesis, increasing decision quality.
- Dynamic Risk Weighting: Introduce adaptive weighting in CoordinatorAgent based on historical claim outcomes per postcode, council, or property type.
- Additional Open Data Sources: Integrate utilities data, local environmental hazards, and socio-economic indicators to further refine risk assessment.
- Improved Explainability & Transparency: Develop visual dashboards showing how each agent’s output contributes to the final risk score, premium multiplier, and plain-English decision.
- Extending Use Cases: Explore tenant insurance assessments, portfolio risk analysis for insurers, and real-time underwriting during property transactions.
Built With
- amazon-web-services
- aws-bedrock
- aws-ec2
- docker
- fastapi
- ibex
- langgraph
- mongodb-atlas
- mongodb-vector-index
- nextjs
- python
- rag
Log in or sign up for Devpost to join the conversation.