Discovery and Matching Engine
Klarum's core AI engine. It ingests public tenders and aid-funded opportunities globally, indexes them in one canonical table, and scores every firm/tender pair with a calibrated, explained multi-signal ensemble.
- Catalogue id
- discovery-matching
Description
What it is
Klarum's core AI engine: it collects public tenders and aid-funded opportunities globally, understands them in plain language, and tells each firm which are worth bidding on. Three user-facing layers plus one engine:
- Notices: a global, searchable index of every open tender Klarum ingests, with natural-language search over structured filters. Unscored; the raw browsable universe. A firm's own inbound portal submissions are also prepended to page 1, tagged with an "Inbound" pill, so the surface a consultant triages from shows both what was scraped and what was sent directly to them. They are skipped whenever a search or filter is active, because a submission carries no procurement method, category or notice type and so cannot satisfy one.
- Explore / Featured: a personalised, ranked feed of the tenders best fitting a specific firm, each annotated with a match score and human-readable reasons.
- The Matching Engine: the multi-signal ensemble underneath both, turning "a firm" + "a tender" into a calibrated 0-1 fit score plus an explanation, powering the "Should we bid?" recommendation.
In data terms: every tender lives in one canonical table,
canonical_opportunities (public, no firm attached); every firm-to-tender
judgement lives in featured_match_results (per-firm scored cache) and is
logged for learning in match_signal_log.
What it helps users do
- Stop trawling dozens of portals. TED (EU), SAM.gov, UK Find-a-Tender/Contracts Finder, World Bank, IATI, ProZorro, PNCP and ANAC (Brazil), AusTender, EBRD, Chile Compra and more are normalised into one feed.
- Reach beyond one jurisdiction. Those 12+ sources resolve to 197
distinct ISO3 country codes across the 191,779 rows of
canonical_opportunities(measured on Neondev, 2026-07-31): 173 countries carry 10 or more notices, 120 carry 100 or more, on top of the EU-focused depth TED supplies. Country coverage is a property of the ingested corpus, so it is a measurement and not a contract - re-measure with a distinct count of country codes over the canonical table before restating it publicly. - Search the way they think. A user types "water and sanitation projects in East Africa over EUR 2M" and the system parses it into structured filters plus a semantic query.
- Get a curated daily shortlist: pre-scored per firm every morning, grouped LinkedIn-style by date added.
- Understand why a tender fits: sector overlap, geographic coverage, budget fit, reference/track-record evidence, plus a bid/consider/pass recommendation.
- Act in one click. "Go" (
developFromTender) spins a tender into a workspace and auto-attaches members whose CVs match required capabilities; "No-go" dismisses; thumbs up/down feed the learning loop. - Promote anything on demand. "Send to Featured" queues a single notice for full real-time AI scoring even if it didn't clear the bulk gates.
- Save and reuse filter views: named presets slice the feed instantly at read time, with no AI re-run.
Capabilities
Notices (global tender index)
Generally availableAn unscored, searchable index of every open tender Klarum ingests, served over SSE so rows paint progressively, with the org's own inbound portal submissions prepended to page 1.
Featured (per-org AI shortlist)
Generally availableThe pre-scored daily shortlist read from featured_match_results, refreshed by a 06:00 UTC cluster-singleton cron with an 08:00 UTC digest email to opted-in users.
Send to Featured (on-demand scoring)
Generally availableQueues a single notice for the full orchestrator with real-time G3 extraction, returning 202 while the UI polls a pending skeleton every five seconds.
First-value warm-up
Generally availableScores the whole candidate pool once for a brand-new org as soon as onboarding confirms its profile, so its feed is populated before it first reaches the dashboard (#1933).
Read-time filter presets
Generally availableNamed presets re-slice the cached universe at the SQL layer, so switching one costs zero AI spend and returns instantly.
Derived primary CPV division
Generally availableScores each notice's text against the 45 CPV division vectors and records the nearest division, used only where the source supplied no classification and only above a confidence floor.
Learning loop
Generally availableEvery ensemble run logs to match_signal_log and user actions supply labels, so calibration and future learned weights improve from real bid behaviour.
Engines
- Matching ensemble Blends ten independent calibrated signals into one 0-1 fit score plus an auditable per-signal breakdown; missing signals redistribute their weight rather than zeroing the score.
- Natural-language query parser Turns free text into structured filters plus a semantic query via a structured LLM call, with a hard 3-second timeout and a keyword-only fallback.
- Tender ingestion pipeline An 8-step dlt/dbt pipeline that normalises 12+ tender sources into one canonical_opportunities row each, then scrapes, translates, embeds and indexes them.
Keywords
tender-search, matching, featured, notices, ensemble, pgvector, reranker, cpv, g3
Provenance
This page renders a published artifact. Read the same records as JSON if you would rather check the source than the page.