Open the explorer · Methods · Data licences · Public evidence
A static explorer for published public-procurement records from France, Chile, Colombia, Czechia, Paraguay, Portugal, Romania, Ukraine and the United Kingdom. It flags contract characteristics that may deserve a closer look, such as awards without competition, single offers, repeated awards to the same supplier, or long durations. Every row links to its source and shows which checks could or could not be evaluated.
A signal prompts a review. It is not an accusation. A zero or missing label does not mean a contract is clean, and “Not assessed” is never zero.
Prototype: not independently validated for operational procurement review. It does not make legal findings or automate procurement decisions.
Illustrative view of a bounded French cohort—not a ranking of wrongdoing.
Open contracts.lasu.dev (live since 2026-09-26, Cloudflare Pages; use this launch date wherever one is asked, e.g. data.go.kr use-case forms), or run it locally from this folder:
python -m http.server 8000 # then open http://localhost:8000You can also open index.html directly. If the browser blocks loading built-in data under file://, use the local import control for a JSON or CSV file.
- English, Spanish or French: pick a language in the header (or add
?lang=es/?lang=frto the link). Only the interface is translated; contract descriptions, justifications and names stay exactly as published. - Browser-local processing: no application backend, account, cookies, analytics or uploads. Data is processed in your browser; the static host still receives ordinary requests and may process network metadata. Only your theme, advanced-filter preference and review marks are saved in local storage. Notes and their JSON exports are plaintext, not confidential case storage.
- Filters: advanced filters are closed by default; open them when needed. The choice is remembered in this browser, and the panel folds out on phones. The indicator list shows only the checks the loaded dataset runs, each with its count.
- Record panel: click a subject to open its panel: the record's own facts, its signals in one line each, context, sources, and a folded list of every check. Notes that apply to the whole dataset are under Scope and limits, not repeated per record. Step through results with Previous/Next or j/k; / jumps to search, Esc closes. Print gives a one-record case sheet with its sources and the link it came from.
- Review marks: mark a record Follow up, Referred or Reviewed and add a note. Marks never change the index, stay in this browser, and are not part of shared links; Export notes / Import notes move them between browsers or colleagues as a JSON file.
- Share a view: search, filters, sort, page, page size and the open record are kept in the link after
#; copy the address to share it. Click a column heading to sort by it (click again to reverse); the Sort list also has sorts no column offers (official findings first, notice publication, amount increase). Browsers never send that part to a server. - Export: CSV / JSON downloads every filtered record, not just the current page. An empty index means not assessed. Copy page summary copies the visible page as sourced notes.
- Theme: light, dark or automatic (follows the system), from the button at the top right. How to read · Method opens the reading notes and the full method.
- Your own data: Import a dataset, next to search, reads JSON, CSV or OCDS locally and never uploads it. CSV column mapping, a validation preview, and explicit confirmation are required before loading. Browse-only/no scoring is the default; French v3 is opt-in and does not verify jurisdiction, source, or completeness. Limits and JSON/OCDS details: docs/data-format.md.
| Dataset | Records | Scoring |
|---|---|---|
| France · eight buyers (Ville de Paris, Ardèche, Rennes, Nantes, Bordeaux, Grenoble, Dijon, Tours) — DECP contracts 2024–2025, reconciled with buyer feeds and open-data lists | 5,286 | French v3 checks |
| France · Tours — BOAMP/TED notices | 66 | linked correction checks; 6 evaluated, 60 not assessed |
| France · 3 Feb 2025 — BOAMP consultation notices | 10 | documents, not assessed |
| France · nationwide BOAMP award sample + 8 CRC audit dossiers | 3,010 | French v3 checks; audit findings outside the index |
| Chile · MOP / Maule region / Puente Alto — Mercado Público licitaciones 2024–2026 | 522 | Chilean checks |
| Colombia · MEN / Caldas / Usaquén — SECOP II contracts 2024–2026 | 7,560 | Colombian checks |
| Paraguay · Fernando de la Mora — DNCP OCDS 2024–2025 | 84 | Paraguayan checks |
| Paraguay · MOPC / Central / Asunción — DNCP OCDS 2024–2026 | 293 | Paraguayan checks |
| Portugal · Infraestruturas de Portugal / CIM Cávado / Lisboa — TED award notices 2024–2026 | 488 | EU eForms checks |
| Romania · Ministry of Finance / Cluj county / Cluj-Napoca — TED award notices 2024–2026 | 321 | EU eForms checks |
| Czechia · Ministry of Finance / Moravian-Silesian region / Ostrava — TED award notices 2024–2026 | 630 | EU eForms checks |
| Ukraine · Ministry of Health / Vinnytsia region / Dnipro — Prozorro contracts 2024–2026 | 488 | Ukrainian checks |
| United Kingdom · FCDO / Lincolnshire / Milton Keynes — Find a Tender award notices 2024–2026 | 1,081 | UK checks |
Choose a country, then its source/cohort. Korea opens the 5,000 highest-scored contracts nationwide; choose a contracting institution to see all of its contracts. The subset is built with node tools/build-korea-top.cjs <site-dir> and published as top.json alongside the static buyer shards. All filters, sorting and exports apply to the loaded subset or institution.
Every check belongs to one universal indicator catalogue (docs/indicators.md), while eligibility and thresholds follow each jurisdiction.
Each dataset is a bounded cohort chosen before scoring. None of them is exhaustive or representative. Underlying datasets are never silently merged or deduplicated; the global scan preserves collection provenance. Amounts are never converted between currencies or summed across sources. For suppliers with a French SIREN, the explorer shows the current public name from the company register, not the name at the contract date. Companies with restricted register listings are not named. Provenance and gaps are in each data/*-coverage.json, and licences in docs/data-sources.md.
Profiles. Open any row and choose Buyer profile or Supplier profile to see that organisation's contracts, its signal rates next to the whole dataset's, and its main counterparts.
Personal data. Suppliers who are private individuals are shown by name, as the publishers release them, but their national ID numbers (Colombian cédulas, Ukrainian individual tax numbers, Chilean RUNs, Paraguayan cédula-based RUCs) are replaced by a stable pseudonym (tools/personal_ids.py). Publishers release these numbers lawfully; this site does not need to repeat them. Contact details are never imported.
Check it yourself. Sources and how to verify, above the table, gives each dataset's publisher, portal, API, licence, raw snapshot and rebuild command. Every row has a Verify it yourself section with the official pages and documents published for that contract (for Paraguay: the award page with tenderers and evaluation report, the call page, and the signed-contract PDFs), plus the identifiers to search on the portal if a link moves. Copied summaries and CSV/JSON exports carry the same links (verifyUrls).
- BOAMP↔DECP links: of nine candidate pairs, seven remain unconfirmed candidates and two were dismissed, with reasons in the correction log. Three BOAMP↔TED notice versions are verified; no DECP link or amount is confirmed. Sources and reproduction: docs/public-evidence.md (
python tools/build-public-link-evidence.pyrebuilds the ledger offline). - Ukraine: a public-only audit of the 488-contract cohort found seven of eleven amount differences explained by net/VAT basis; four remain unresolved. An omitted amendment list means zero changes, so the importer's zero default is correct. No scores changed.
These are targeted checks, not a measured accuracy rate.
index = max(competition checks) + max(execution/duration checks) + max(transparency checks), in points, shown as the multiplier ×2^(index / 10) (score 4.0, 29 October 2026): ×2 means records with these signals are twice as frequent among proven cases as among the same buyers' other contracts. It is not a probability. Only measured points count: a check takes its country's own measurement on labelled cases, else the lowest points any labelled country measured for the same kind of check, else it is context at ×1.0 (docs/score-v3.md). Each row shows 9 checks for France, Paraguay and the TED cohorts (the jurisdiction's own eight and the universal late-publication check; Tours adds a linked-notice check), 10 for Colombia and 13 for Ukraine, plus the five evidence-based checks only on records that carry evidence, each as signal, evaluated, not assessable or out of scope. Declared amounts are not scored in themselves: points never grow with the size of a contract. A few checks use an amount only as a threshold or share (the French legal direct-award threshold, the relative amount increase, the Ukrainian UAH 200,000 direct-contract report, and the buyer-share checks). Legal citations, company names and official findings never add points. Correlated signals in the same family are not summed. Colombia, Paraguay, Ukraine and the TED cohorts (Portugal, Romania) use their own checks. TED holds only procedures above the EU thresholds, so the Portuguese and Romanian cohorts are not a picture of those countries' procurement.
- French method: docs/score-v3.md
- Colombian method: docs/score-colombia.md
- Paraguayan method: docs/score-paraguay.md
- Ukrainian method: docs/score-ukraine.md
- Portugal and Romania (TED eForms) method: docs/score-ted.md
- Court outcomes and reported investigations (kept outside the index): docs/adjudicated-outcomes.md
- Paraguay pilot notes and other candidate countries: docs/paraguay-pilot.md, docs/international-pilots.md
- Dated history of every delivery, count and design decision: docs/project-journal.md
- Low-cost, voluntary adoption and usability-feedback proposal: docs/adoption.md
- Bounded source/coverage expansion and metadata evidence: docs/expansion.md
Plain HTML, CSS and JavaScript: no framework, build step, dependency or runtime API call. Importers under tools/ use the Python standard library and keep raw source snapshots in data/ (large ones gzipped, byte-exact).
sh tests/run-all.sh # every suite; NO_BROWSER=1 skips the Chromium testThe browser test needs Playwright 1.58.2, installed outside the project: npm install --prefix /tmp/procurement-browser playwright@1.58.2 (set PLAYWRIGHT_PATH for another location, CHROMIUM_PATH for another browser). GitHub Actions runs the same script on every push (.github/workflows/tests.yml). After any change to the scoring engine (scoring.js, checks-*.js, records.js, views.js; listed in index.html with data-engine), run node tools/review-score-v3.cjs so the review report matches the new engine hash, and node tools/build-first-pages.cjs (the prepared first pages are scored by it). Interface translations live in tools/i18n_table.py; run python tools/i18n-strings.py after editing it.
BOAMP-published dataset content is documented under Licence Ouverte 2.0 based on DILA's legal notice and official data.gouv.fr dataset records; null licence fields in the BOAMP API catalogue do not undo that dataset-level evidence. Third-party attachment/content scope and privacy questions remain. The documented Annuaire business dataset supports LO 2.0 for the project's limited supplier name/status/identifier enrichment, not every API field. Retained source evidence: docs/source-rights-evidence.json. See docs/data-sources.md and personal-data inventory.
Every dataset can be rebuilt offline from its raw snapshot:
| Dataset | Rebuild |
|---|---|
| Paris & Ardèche DECP | python tools/import-decp-paris-ardeche.py --offline |
| Six cities DECP | python tools/import-decp-cities.py --offline |
| Tours notices | python tools/import-tours-notices.py --offline |
| 3 Feb 2025 consultations | python tools/import-consultations.py --offline |
| Nationwide BOAMP sample | python tools/import-boamp-sample.py --offline |
| Chile (Mercado Público) | python tools/import-chilecompra.py --offline |
| Colombia SECOP II | python tools/import-colombia-secop2.py --offline |
| Paraguay DNCP | python tools/import-paraguay-dncp.py --cohort fernando|3buyers --offline |
| Portugal, Romania, Czechia (TED) | python tools/import-ted-cohorts.py --cohort portugal|romania|czechia --offline |
| Ukraine (Prozorro) | python tools/import-prozorro.py --offline |
| United Kingdom (Find a Tender) | python tools/import-find-a-tender.py --offline |
Linked notice/bid checks and the bounded three-contract API sample: method and collection controls. python tools/fetch-linked-records.py shows its plan without making requests.
Portugal BASE preparation (not yet bundled): python tools/import-portugal-base.py prints its plan without archive reads or network calls. The implemented streaming importer retains published supplier names but omits supplier NIFs and competitor identities; it produces a private, browse-only candidate before explicit publication review. Extraction is deferred while on battery. Commands, coverage/conflict handling and limits: docs/portugal-base.md.
After any rebuild, refresh the browser copies: python tools/build-web-data.py (slim DECP and SECOP II files in data/web/, without archival fields the explorer never reads) and node tools/build-first-pages.cjs (each dataset's default first page, shown while the full file downloads). tests/test_build_web_data.py fails when either is stale.
--download fetches a new snapshot instead; it is not a fixed archive (the DECP index, for instance, keeps only the latest modification of each contract). python tools/enrich-suppliers.py refreshes French supplier names and python tools/fetch-dncp-sanctions.py the Paraguayan sanction snapshot (--offline re-applies either).
Any static host works; all paths are relative. For Cloudflare Pages: no build command, output directory /. _headers sets a Content Security Policy that only allows the site's own files, plus Referrer-Policy: no-referrer. Keep Rocket Loader, Email Address Obfuscation and Web Analytics off: they rewrite pages or add scripts. The largest file, data/colombia-secop2.json (15.6 MB), is under Cloudflare Pages' 25 MiB per-file limit.
Code and original documentation: MIT. Third-party data and source documents retain their original rights; see data/LICENSE.md and the source-by-source licence register.
