Proof · single tender

Match Score playground.

One endpoint, one alert. Paste a normalised tender JSON on the left and a Company Profile on the right — score, verdict and the 3-line rationale come back and persist to the audit table in under a second. This is the Bidloom scoring engine end to end.

POST /api/matchscore
Persists inputs + output to TenderMatch
Read the brief →

Input · 2 JSON blobs

Zod-validated

Both blobs are validated server-side against a shared contract. A wrong shape 400s with field-level errors — no silent drift, no mystery masks.

TenderNormalised notice — title, buyer, region, industry, cpv, value band, deadline.
Company ProfileIndustry, price band, regions, certificates — the only inputs that drive the score.
POST /api/matchscore

Audit log · last 5

Postgres · TenderMatch

Loading audit log…

Try a different notice

Three sample tenders to drop into the Tender box — copy any of them and watch the score swing on industry, value and deadline.

  • IT endpoint refresh — phase 2

    Yorkshire · £150,000–£180,000

    Review
  • Building fabric maintenance — south zone

    East Midlands · £380,000–£460,000

    Bid
  • Security-cleared FM helpdesk (lot 4)

    Multi-region · £2,000,000–£2,800,000

    Skip

Every score is auditable: the inputs you typed and the 5-line sub-score breakdown are persisted in TenderMatch the instant a result returns. The weight model is fully deterministic — change the Profile, regenerate, and the same Tender scores reproducibly.

Back to brief
How the score is computed

Five sub-scores, five weights.

Every Tender is decomposed into five sub-scores — Industry & certs, Contract value, Geography, Deadline pressure, and Competition. Each is weighted and combined into a 0–100 score with a deterministic bid/review/skip verdict. Every row pulled from the API is reproducible from the same inputs — no model drift.

  • Industry & certsw 30%
  • Contract valuew 25%
  • Geographyw 20%
  • Deadline pressurew 15%
  • Competitionw 10%
  • Total100%