~58% of commercial insurance submissions arrive missing a mandatory field. Underwriters still spend 30–40% of their time on admin instead of risk. A lot of that data is not actually gone. It is sitting in a broker email, an SOV, or a portal page.

Inspiration

Most submissions are not missing data. The data is just scattered. Federato already tells you which submissions to look at. We built the next step: open the file, see what’s actually blocking the decision, pull the scattered details into one place, and leave the score honest.

What it does

FedAgent takes the live Federato queue and turns it into a workspace an underwriter can actually work.

  • Scores every commercial-property submission against the 2025 appetite guidelines, then ranks it so the best files rise first instead of sitting in FIFO
  • Sorts the queue into lanes: ready for review, needs evidence, outside appetite, or not our line, so you know what to touch this morning
  • Opens a full case with the recommendation, a plain-English explanation, and a task list of exactly what’s blocking a decision
  • Builds a chase list from missing vs unclear fields: ask the broker for what’s absent, leave judgement calls with the underwriter
  • Evidence Trail: Logs evidence on the case as observed, confirmed, or disputed. If two sources disagree on the same field, it flags the conflict for a person — it never silently picks a winner or changes the score.
  • Uses Browserbase to scrape the broker email, SOV, and portal, so you recover premium, TIV, and construction from stuff they already sent instead of asking again
  • Pulls FEMA flood / hazard and Census neighborhood context next to the file, and never lets that quietly change the appetite score
  • Lets you ask the queue in plain English through OpenAI API, while the engine still owns every number and every row

Federato API -> schema discovery + query -> appetite engine (score, rank, explain) -> queue lanes: ready / needs evidence / outside appetite / not our line | | | +-> Ask the queue (OpenAI phrases, engine owns rows) v open case | +-> missing fields? --yes--> Browserbase scrapes email / SOV / portal | -> recovered fields with source tags | -> chase list for whatever is still gone +-> missing fields? --no---> ready for review | +-> FEMA + Census sit next to the file (context only, no rescore) v underwriter decides

The engine decides the math. The human still decides the file.

How we built it

  • Next.js App Router + TypeScript, with Federato Auth0 token flow and schema discovery before the production query
  • Schema-aware query planner maps appetite fields onto the discovered Federato resource graph
  • Deterministic scoring engine evaluates all 50+ commercial-property submissions against the 2025 guidelines and emits ranked, explained verdicts
  • Completeness waterfall + provenance tags resolve missing factors from canonical data, inference, then external caches
  • Live path: Browserbase cloud browsers + Playwright scrape seeded broker email / SOV / portal HTML;
  • FEMA National Risk Index and Census ACS are prefetched JSON context; they never mutate appetite status or score
  • OpenAI is a grounded ask-layer over /api/ask only: intent parse + phrasing, no scoring

Challenges we ran into

Real submissions are not a clean spreadsheet

Federato gives you a live schema, then a query over nested resources. TIV might be buried, premium might be named something else, and losses might just not be there. If we guessed, the whole appetite score would be fake. So we had to map only what the schema actually gave us, leave the rest unknown, and still rank the full queue.

Live browsing cannot be the only path

Browserbase opening the email, SOV, and portal looks great until the key is missing or the session dies on stage. The demo still has to work. So we put the live scrape and a local fixture behind the same interface, and both return the field with a source tag instead of a mystery number.

Accomplishments that we're proud of

Messy files still get a real rank

We ranked the full Federato book, including out-of-appetite files, and every row still has a score, a lane, and a reason. Missing fields stay unknown instead of getting a made-up number, then they land on a chase list the underwriter can actually act on.

We stop asking for stuff they already sent

Browserbase can open the email, SOV, and portal, pull premium, TIV, and construction, and tag where each value came from. FEMA and Census sit next to the file as context only. The score does not quietly move.

What we learned

Ask what exists before you query it If you hardcode field names, you will make up stuff that is not in the API. We learned that we should fetch the schema first, only map what is actually there, and if TIV or losses do not show up, leave them unknown instead of guessing.

What's next for FedAgent

A draft RFI for whatever is still actually missing Right now we recover what the broker already sent. Next we want the leftover gaps to become a ready-to-send request: exact fields, why they block a quote, and who has to answer. It stays draft-only, so nothing emails out until an underwriter says so. That finishes the loop: find it in the file first, chase only what is still gone.

A one-screen brief that replaces the status meeting Open a messy submission, run resolve, and end on a short recap: fields recovered, contradictions found, one next step. Ready for decision, or one blocker left. The point is not another dashboard widget. It is so nobody needs a 12-minute huddle to repeat what the file already knows.

Built With

Share this project:

Updates

Submission history