· 4 min
GovTender: a trustworthy map of who government buys from
Government tender data is everywhere and trusted nowhere. So I built a US and Canada procurement platform where a tender is not a project, a contract ceiling is not spend, two spellings of a buyer are one company, and every number carries its source.
Governments publish an enormous amount about what they buy.
Notices, amendments, awards, permits, funding announcements. It is all public. And almost none of it is usable.
The problem is not access. The problem is trust.
Most tools that sit on top of this data quietly lie. They call a five-year national-lab management ceiling "spend." They label every record "open" when most closed years ago. They count "Natural Resources Canada" and "NRCan" as two different buyers. They claim complete coverage they do not have.
I wanted the opposite of that.
GovTender is a US and Canada government-market intelligence platform, built provenance-first. It is for a company trying to answer a real question: where should I compete, who holds the work today, and who am I up against.
It is live now: Open it → govtender.vayuai.ai
A number you cannot trace is a rumor. A number with its source attached is a starting point.
A project is not a tender
The load-bearing idea is a distinction most aggregators collapse.
A planned project, its funding, its permits, the tenders it generates, the amendments to those tenders, and the awards that follow are different objects. One project spawns many tenders. One tender has many versions and one or more awards.
GovTender models that whole lifecycle instead of flattening it into a list.
Seven official sources feed it: SAM.gov and USAspending for the United States, CanadaBuys tenders and awards, Grants.gov, a federal permitting dashboard, and Canada's infrastructure project map. Grants stay grants. Permits stay permits. A grant never gets dressed up as a contract.
The part that makes it trustworthy
The data is fused, deduplicated, and then run through a trust layer. That layer is the product.
Lifecycle honesty. Of roughly 28,000 tender records, only about 2,500 are actually open right now. The rest are closed, cancelled, or are standing arrangements and information notices that were never one-time bids. The dashboard says so, instead of showing one big "open" number.
Currency honesty. Obligated dollars (US) and contract value (Canada) are different measures in different currencies. They are never summed into one figure. A total in the wrong currency is not a smaller lie, it is a wrong number.
Organization honesty. Duplicate buyer and supplier names are resolved into one canonical entity, reversibly, with a confidence score. "Natural Resources Canada," "NRCan," and "Department of Natural Resources" become one company, and the profile shows exactly which spellings were merged and why.
Anomaly honesty. Fake far-future deadlines, duplicate notices, weak classifications, and negative award values are flagged, not hidden. The old "100% complete" badge is replaced with real presence, validity, freshness, and coverage.
Every record keeps its source, its record id, its content hash, its parser version, and its retrieval time. Provenance is a column, not a caption.
What you can do with it
On top of that honest base sit the tools a decision-maker actually wants.
A deep-analysis console with market concentration by sector, a supplier inequality curve, procurement cycle times, seasonality, and who wins where.
Decision intelligence that scores open opportunities for a given supplier as a transparent sum of named factors, then shows their competitors and the incumbents already holding the work.
A unified search across tenders, awards, projects, and organizations, and an Ask assistant that answers strictly from the data, cites it, and refuses to invent.
How it works
The stack is deliberately ordinary, because the value is the data and the honesty.
A Python pipeline over Postgres, a FastAPI read layer that serves the dashboards, deployed on Vercel against a single free Neon database. A daily job re-ingests every source, rebuilds the trust layer, and snapshots the day's numbers into an append-only history, so the market can be watched over time and never quietly overwritten.
Immutable raw storage means every transformation can be replayed from the source without refetching. Nothing is invented downstream.
The limits, stated plainly
GovTender never claims complete US and Canada coverage. It cannot. It says what it has and what it is missing.
A contract "ceiling" is shown as a ceiling, not as money spent. A fuzzy link between a project and a tender is shown with its confidence, not asserted as fact. A weakly classified record is marked weak.
The value is not a verdict on the whole market. It is a trustworthy, drillable view of the slice it does hold, with the uncertainty shown rather than smoothed over.
That is a smaller claim than "AI reveals where governments spend."
It is also a true one, which I care about more.
What I learned building it
Two things stand out.
First, trust is an architecture decision, not a copy decision. Currency filters, canonical entities, and provenance columns have to live in the schema and the queries. Bolt honesty on at the end and it disappears under the first join. I found and fixed the same class of bug twice, by grepping every place a value was summed, not by trusting my memory.
Second, the useful number is the honest one. "28,000 tenders" is an impressive headline and a useless one. "2,500 actually open, in these sectors, closing in the next 30 days" is what a company can act on. The whole platform is built to prefer the second kind of number.
Where this goes next
More subnational coverage, deeper project-to-tender linking, saved watchlists, and richer company fit scoring.
The direction is the same as day one. Keep the objects distinct. Keep the currencies apart. Keep the source on every record. Show what is open, what is closed, and what we simply do not know.