Inspiration
Everyone shopping for a medical procedure without insurance hits the same wall: nobody will tell you the price until you call. A cash-pay MRI can be about $400 at one clinic and over $2,000 at another in the same city, for the exact same scan. A self-pay patient is legally entitled to a Good Faith Estimate, but in practice that right is close to unusable, because the prices are not published and the answers you get on the phone are not comparable. The part that actually bothered me is that a naive tool makes it worse: it lists the facility-only quote as the cheapest and sends you to the clinic that costs the most once the second bill arrives.
What it does
GoodFaith is an AI phone agent, built on CALL-E, that calls every clinic on your list at once and does the hard part on the call: forcing the quotes onto the same footing. It asks each clinic for the all-inclusive self-pay price, what is included, what is billed separately, and how long the estimate holds. Then it normalises what it heard into a true landed cost and ranks only the quotes that are actually comparable. The one rule it never breaks is the reason to trust it: every price it ranks is tied to the exact sentence the clinic said, with the moment in the transcript it was said. If it cannot trace a number to a real quote, it refuses to rank it rather than guess. The moment I care about most is the flip: a clinic quotes $525, which looks cheapest, but it is a facility fee only, so GoodFaith flags it as not comparable and the real winner is the $438 all-inclusive quote, 12% below the fair-price benchmark.
How I built it
It is a Next.js console on Vercel, all TypeScript, with the CALL-E integration quarantined to one module so the rest of the code never touches the SDK directly. The deterministic core, the schemas and the normaliser, imports nothing outward, which is what lets the no-fabricated-quotes rule be a structural fact and not just a promise: a result can only become ranked on the code path that already found the sentence it came from, so a price without evidence cannot be constructed. Each run opens one CALL-E call task fanned out to every clinic, reads back each outcome with its confidence and transcript, gates out anything low-confidence, and benchmarks the comparable winners against a fair-price table.
Challenges I ran into
Building against the live SDK is where the surprises were. The docs show snake_case fields and schema parameters on the call; the real SDK is camelCase, events come back paged from listEvents, goals run one phone at a time, and webhooks arrive unsigned. I found all of that by calling the real API instead of trusting the docs, which is also how I found that the JSON result schemas are rejected outright on this tier, and that region and language support is not discoverable anywhere except as a 422 at call time (my own Nigerian number was refused for English calls). I wrote those findings up honestly for the team.
What I am honest about
The demo runs mock-first, on a recorded sample call, and it says so on the screen, because I would rather show the full flow reliably than gamble a batch of cold calls. The live path is real and reaches the CALL-E API, but because the tier rejects the result schemas it derives the structured fields from the transcript, and because of the region limit I could not place the live hero call to a number I control. None of that touches the core promise: there are no fabricated prices anywhere, by construction.
What I learned
That the hard problem in phone-based price discovery is not placing the calls, it is comparability, and that the honest move when two quotes are not comparable is to say so, not to fake a merge.
What's next
A live hero call from a supported region with the result schemas enabled, more procedures than the imaging demo, a shared store so a cold visitor always sees the same result, and CALL-E Goals templates so a clinic quote becomes a reusable versioned workflow.
Built With
- call-e
- next.js
- node.js
- react
- tailwind
- typescript
- vercel
Log in or sign up for Devpost to join the conversation.