← all projects
Bid Radar
Watches a bid mailbox for federal solicitation notices, verifies each one against the official record, screens it against explicit bid criteria, and hands the qualifying ones off for pursuit.
StatusActive
StageBuild
StackPython · Microsoft Graph · SAM.gov API · Azure Functions or Windows Task Scheduler
OwnerAndrew
The problem
Federal opportunity notifications arrive as email, formatted for people and liable to change without warning. Teams either skim them by hand and miss things, or scrape them and quietly feed half-records into their pipeline.
Approach
- The email is only a trigger: the one thing taken from it is the notice ID.
- Everything else is pulled from the SAM.gov API, the authoritative record, then hashed and timestamped. A wrong ID fails loudly instead of producing a plausible-looking record.
- Beyond the mailbox, it also scans other public sources and tip-off links a person drops in.
- Each notice is screened against rules in a config file. Every rule carries a "why", and that text is what the person deciding whether to bid sees.
- Results route to auto-handoff, human review, and an internal alert email.
- Qualified notices go straight into the Governed Research Engine, which researches the buyer and drafts an internal response for a person to review.
- A first-touch email is drafted in the mailbox but never sent. A person edits it and decides.
Guardrails
- It never emails a government contact on its own.
- With no screening rules configured, everything routes to review.
- It decides who gets told, not whether to bid. Qualification stays with a person, behind a review gate.
Build notes
- Runs on whatever schedule you set, as often as you'd like: every half hour as an Azure Functions timer, or once a morning as a scheduled task beside the research workspace.
- Authenticated as an app, with an Exchange access policy limiting it to the one bid mailbox.
- A zero-install browser console for tuning screening weights, with tests that hold it to the same verdicts as the Python screener.
- Dry-run mode decides everything and writes, sends and marks nothing.
Files & links
Private repository. Demo available on request.