Our numbers don't come from an AI
The price range and the likely-bidder list are produced by ordinary statistical models, and measured against the record. Where AI actually works here.

When software claims it can predict what a public contract will cost, most people now picture ChatGPT. That is a reasonable guess in 2026, and it is the wrong one here — not out of caution, but because a language model is not the right instrument for this job.
The two figures you actually decide on — the price range and the list of likely competitors — come from ordinary statistical models trained on twenty years of Quebec public tenders. Not from a chat agent, and not from anything that "reasons" about your file.
What a statistical model is, without the jargon
Picture a hundred thousand contracts that have already been awarded. For each one, everything that was knowable the day the notice was published: the buyer, the category, the region, the length of the specification, how many firms are active in that line of work, and a few hundred other facts of the same kind. And for each one, the price it was eventually awarded at.
A statistical model is a program that searches that pile for regularities. It understands nothing about procurement. It observes that in this category, with this sort of buyer, at this document volume, prices have historically fallen a certain way. Then it is shown a notice it has never seen, and applies what it observed.
The technique is decades old and holds no mystery, and that is exactly why it is the right answer here. On tabular data — rows and columns of checkable facts — it still beats the newer approaches, and, more importantly, it can be graded.
The difference that matters: being able to say "I don't know"
Here is the point that decides everything, and it is not ideological.
A generative model always produces an answer. Ask it about a tender nobody could know anything about and it will still write a confident paragraph. Nothing in how it is built forces it to measure its own ignorance.
Our models do not publish a price. They publish a range, and the width of that range is the confession. On a well-documented contract in a dense category it is tight. On a notice with no specification, no buyer estimate and no comparable history, it is very wide — and that width is the useful information. A wide range is an admission of uncertainty, not a defect. When too much is missing to say anything honest, the report declines instead of printing a middling number.
A promise you can hold us to
A range announced "at 80%" ought to contain the real award price about 80 times out of 100. Otherwise it means nothing at all.
That is what we measure, on tenders published after the training period, which the models had never seen. The 80% range contained the awarded price 79% of the time. That is not a flattering figure we chose to publish; it is a falsifiable promise, and you can hold it against us if it drifts. The accuracy page has the detail, including the one price band where the measurement falls below our own threshold.
A generative system cannot offer that. There is no "80%" attached to a well-written paragraph.
Likely competitors: retrieve, then rank
The expected-bidder list works in two stages, and neither one invents names.
- Tens of thousands of firms with a public bidding record are first narrowed to a few hundred plausible candidates for this specific notice — those active in the right product family, with the right buyer, in the right region.
- Those candidates are then ranked, and each one comes out carrying a probability rather than a position.
The distinction is real. Read as "here is who will bid", such a list is false. Read as "recognise these names, and here is a calibrated probability for each", it is useful and honest.
Measured: a list of ten names contains 43% of the firms that actually bid — 44% once you set aside companies with no public history, about which nobody, ourselves included, can know anything before their first submission. That is a long way from perfect, and it is published as it stands.
We tested a language model. It lost.
This is not a principle adopted after the fact. We added features produced by a language model to the price model and measured the result against a noise floor declared in advance.
The gain on the primary metric came in smaller than the noise. The median error got worse. Of the two features added, one contributed exactly zero. It is a documented rejection, not an omission.
There is a better story, and it is more humbling. On roughly half of notices the buyer publishes their own estimate. On those, a two-parameter arithmetic correction applied to the buyer's figure beats our several hundred variables. We did not bury that — we adopted it. What the report shows you on those notices is a blend of the two, because that is what is wrong least often.
A vendor telling you their model always wins has not measured it.
Where AI does work here
It would be dishonest to tell you there is no AI in the product. There is, and it earns its place. It reads, and it writes.
- It turns the documents you upload into text, scanned PDFs included.
- It tells you what those documents contain: requirements, bonding, penalties, dates.
- It writes the plain-language summary at the top of the report.
What it never does is touch a figure. Your documents do not move the price range, and that is a measurement rather than a drafting precaution: we built the instrument that would have detected such an effect, and it reads zero. What your documents change is what you know about them, not what the market will pay.
The vendors handling those files are named in our privacy policy. We would rather tell you which ones than print "powered by AI" on a home page.
Why you should care
Deciding to bid commits weeks of work and sometimes a bond. What you want from a tool at that moment is not confidence. It is a number whose track record you can ask for, and that tells you when it doesn't know.
That is the one claim we would defend if only one survived: the number on the page means the thing it says.