How a swarm of agents maps a market in a day
Agents from three model families priced a market nobody had measured. 26 providers, 70 rows, one open dataset, and three conclusions that never shipped.
Most of what a company wants to know is not in a database. It is scattered across a few dozen websites, written by people with no interest in being comparable, and it goes stale. Which competitors publish a price and what for. Which suppliers actually serve your size. What a market charges when nobody has ever collected it.
That work is a research problem before it is an AI problem, and it is the kind of research that gets done badly: someone opens twenty tabs, gets bored around the eighth, and writes a summary nobody can check.
In August we ran that job properly on a market of our own and published the result as an open dataset. This is how the machine is built, what it caught, and what the design costs to run.
The job
MJOP-maker is one of our products. It produces a thirty-year maintenance plan for small Dutch apartment owners’ associations, the ones with two to twelve flats, who carry the same legal duty as a building of forty and get quoted accordingly.
We wanted the actual price of that market. Not a sense of it. The number, per provider, per building size, with the source.
No such dataset existed. There is no register, no trade body publishing rates, no comparison site with real figures. The only ground truth is what each provider writes on its own page, and most of them write nothing at all.
That is the shape of the problem worth pointing a swarm at: high volume, low individual difficulty, no reference answer to check against, and a result that is worthless the moment anyone doubts it.
The architecture
One agent reading twenty-six websites is a faster intern. It has the same failure mode an intern has, which is that nothing catches a confident misreading. The design question is not how capable the model is: it is where the error check lives.
Six rules carry the measurement.
Every row is read blind, by at least two agents drawn from different model families. The pool is built on OpenAI Codex, Anthropic Claude and Google Gemini. The agents read the same page without seeing each other’s answers and without being told what we expected or what we charge. Models from different families fail differently, which is the entire point: two independent readings that agree are evidence, and two readings from one model that agree are one opinion stated twice.
Every cell carries its own proof. Amount, apartment count, VAT basis, product, horizon, plus the verbatim quote it came from and the URL of the page. A value without a quote does not enter the file. That is what lets a stranger who distrusts us re-derive every number from the sources rather than take ours on trust, which is the only standard that means anything for a price comparison published by a seller.
Disagreement is preserved, not resolved. Where the readings agree, the row is marked confirmed. Where they diverge, it is marked disputed and stays that way: 53 confirmed, 17 disputed across 70 rows. We do not quietly break ties in our own favour. A reader can see exactly which rows are load-bearing and which are soft.
Sub-questions are asked separately. Whether an on-site inspection is included in a price decides whether two numbers are comparable at all, so it was not inferred from the pricing pass. It was asked again, from scratch, by two agents independently. Questions answered as a by-product get answered carelessly.
Anything that flatters us gets an adversary. Where a finding favours our own product, a further reviewer is briefed to attack it. Not to check it, to break it. What survives that is allowed through.
A re-measurement is a new file. Same method, same queries, new date in the filename, and the old file is never overwritten. That turns the second run into a diff you can compute instead of a claim you have to accept.
The run on 21 August 2026 covered 40+ providers screened down to 26 recorded beside our own, across 70 rows. Twenty-two of the 26 publish an amount somewhere. Four publish no figure at all.
What the cross-checks destroyed
An architecture is only worth describing if you say what it stopped. Three conclusions died between the first pass and publication.
Tiered pricing above ten apartments does exist. The first pass concluded that no provider publishes a rate above ten units, which is a tidy, quotable finding and false. The second reading produced three counterexamples in one round: Projekthus publishes to twenty, VastgoedKeur likewise, 1-2-MJOP.NL to fifteen. The claim was attractive precisely because most pages do stop at ten. Attractive claims are what the second reader is for.
Our only price match was selling something else, and we still refuse to call it settled. One provider appeared at our own €399, the only one matching us. The second reading found that their pages for one to eight apartments offer a shorter ten-year plan, a different product, listed at €465 and €625. Above eight apartments they do sell a full plan. Meanwhile their homepage advertises €399 and takes orders there.
This is where the adversarial step earned its place, because the finding suits us: without that row we are the lowest published price at both sizes we can check. The reviewer briefed to attack it accepted the product distinction and refused to call the price question resolved. So the dataset records it as open, and every downstream number that leans on it carries the caveat, including in this post.
We are not the only provider with a flat fee. That sentence used to be in our marketing. One row had been recorded as unreadable; on re-reading, the page plainly states €350 excluding VAT for any building up to ten apartments, or €423.50 including, flat, exactly like ours. It was read three times because it was unwelcome, and it went in.
Read those three together and the direction is the point. One correction removed a claim we were selling on. One removed the only competitor standing between us and a clean sweep, which is exactly why it drew an adversary and exactly why the price half of it is still marked open. One made the market look less opaque than our first pass had it. None of them was quietly dropped for being inconvenient in either direction, and that is the only property that makes the other sixty-seven rows worth reading.
What the design costs
Every rule above buys accuracy with redundancy, and it is worth being concrete about the bill. The floor is two full reads of every page instead of one, so a pass costs at least double before anything interesting happens. Contested rows draw a third read. Anything flattering draws a reviewer whose entire job is to spend effort trying to destroy work that already looks finished. Seventeen of seventy rows ended in disagreement, and each of those is a row somebody had to go back to.
That is the trade. You spend two to three times the reads of a naive run, and in exchange the output is something you can put a DOI on and hand to a competitor.
The result, and why we gave it away
The dataset is published under CC BY 4.0 with a DOI, 10.5281/zenodo.22093783. Competitors may use it. So may journalists, and so may any board that wants to build its own table. The only condition is attribution.
That is a deliberate trade. Work that restates numbers gets summarised and forgotten; work that produces them gets cited, and the citation carries our name. The DOI is there because a number keeps resolving after a URL moves or a site disappears.
What it found, as measured on 21 August 2026, all figures including VAT: at two apartments, nine of the 26 providers publish a price for a full plan, median €625, lowest €410. At twelve, five do, median €1,193, lowest €950. Our flat €399 sits €11 and €551 under those lowest figures, and €226 and €794 under the medians. The €11 depends on the unresolved row above; if that provider’s homepage price counts as a full plan, we tie at two apartments rather than win.
The more interesting finding is not the size of the gap but how little there was to find. Nine providers out of 26 at one size, five at another. For most buyers there is no published price at all, and there is a good reason: nearly every other provider sends someone to inspect the building, and a building is not a standard object. Publishing no price is the normal condition of that market, not evasion. Ours can be flat because nobody visits, and that is the real difference between us and them. Not the eleven euros.
The full comparison, per provider, with a quote and a source on every line, is at the price measurement of 26 MJOP providers.
What this is actually for
In a day, we mapped a market that had never been mapped, and we can tell you exactly which three conclusions did not survive the process. Those two facts are the same fact.
The speed is the cheap part. Any competent setup can read twenty-six websites quickly. What makes the output usable by a board or a journalist is the structure around the reading: blind parallel passes instead of one confident voice, model diversity instead of one family’s blind spots, disagreement preserved instead of smoothed, an adversary assigned to every convenient result, and a published artefact that a stranger can audit line by line.
This is the same apparatus we build for clients, pointed at supplier pricing, competitor claims, regulatory changes or whatever the market keeps in a hundred unstructured pages. Our agents supply the reach and the pace. The judgement about what is allowed to stand stays with people, and the architecture is what makes that judgement possible instead of decorative.