charges: 1–6 quote verbatim, original language category one of 11 risk types severity low | medium | high injection_detected: boolean
How xscan works
Four steps, in order, for every tender. Cheap checks first; the AI court only when the cheap checks find something.
- Collect
Real tenders from official APIs and from any website you paste.
- Screen
Thirteen free rules score each tender from 0 to 1. Below the threshold it looks normal.
- Argue
The prosecutor brings counts with verbatim quotes; the defense answers each one.
- Rule and ask
The court rules count by count, sets a risk level, and the clerk writes to the buyer.
The three agents
rebuttals: one per charge stance contest | partially_concede | concede counter_quote verbatim, or empty would_clear_it what the buyer could show
rulings: one per charge ruling SUSTAINED | DISMISSED | REFER_FOR_CLARIFICATION strength prosecution 0–1, defense 0–1 risk: LOW | MEDIUM | HIGH | CRITICAL, score 0–1
Every quote is matched against the notice text: VERIFIED, APPROXIMATE or NOT_FOUND. A quote the model made up is struck through and the court gives it no weight.
The screening rules
| Rule | Looks for | How |
|---|---|---|
short-window | Too little time to bid | Days between publication and deadline, against the legal minimum (EU 15, elsewhere 10). |
delivery-window | Delivery period too short | A delivery or execution period that is very short for the scope. |
brand-lock | Brand with no equivalent | A named brand or model with no “or equivalent” wording. |
restrictive-spec | Proprietary specification | Unusually exact or proprietary technical parameters. |
turnover-ratio | Turnover far above value | Required turnover more than twice the contract value. |
eligibility | Narrow eligibility | Eligibility tied to a manufacturer, a locality, or prior work for this buyer. |
penalties | Heavy penalties | Severe or uncapped delay penalties. |
guarantee | Large guarantees | Bid security or guarantees well above the usual share of value. |
amendment | Suspicious amendment | A change that shortens the deadline or adds a new restrictive requirement. |
process | Process gaps | No clarification channel, deferred justification, or price-only evaluation. |
missing-info | Missing facts | Value, deadline or buyer not published. |
non-competed | No competition | US awards made without full and open competition. |
injection | Text aimed at AI | Instructions to automated reviewers inside the notice. Kept as evidence, never obeyed. |
Sources
- TED
Official EU API. Newest notices first; only the ones not on file are downloaded in full.
- USAspending
Official US API. Federal contracts awarded without open competition.
- SAM.gov
US tenders. With an API key, or by pasting a link, read in a headless browser.
- zakup.gov.kz
Kazakhstan. Read from the portal's own public JSON API: exact official fields.
- Any website
Paste a link. Plain pages are read directly, JavaScript pages in headless Chrome; the AI extracts the facts, the tender text stays verbatim.
For developers
GET /api/v1/tenders every tender on file
POST /api/v1/tenders/:id/trials open a hearing
GET /api/v1/trials/:id/events live stages (server-sent events)
POST /api/v1/import/one { url } or { text }
POST /api/v1/import/listing { url, max }
POST /api/v1/ingest { target, sources }Models: Meta Muse Spark 1.3 with strict JSON schemas, validated and retried. Tender text is wrapped as untrusted data, so instructions inside a notice are never followed.
What xscan does not do
It never says a buyer is corrupt. It points out warning signs for a person to review, and drafts the question to ask. Every claim it makes can be traced to a quote in the notice.
Watch a hearing