Procurement-Demand Signal
Government contract flow, turned into a leading demand read a systematic or thematic desk can trade around. For every country × procurement category × month we publish the share of activity, buyer concentration, and 3-month momentum — point-in-time, license-clean, with the source on every value.
Analyzed data, not raw rows: rising government-demand share in a category is a leading tailwind for the listed suppliers who serve it. Built on AF-TENDER (OCDS), deterministic, and as_of-queryable with no look-ahead.
Grain: country × category × month · robust headline = category demand share · point-in-time (knowable at month-end) · deterministic (snapshot-hashed) · v1 universe: South Africa (S007) · 4 provenance guarantees
Shares and momentum, not fragile counts.
Demand share
Each category’s share of a country’s procurement activity that month — a within-month ratio that stays comparable even when ingestion coverage of a month is partial.
3-month momentum
The change in a category’s share over the trailing quarter — the “demand is rotating into (or out of) this sector” read a desk positions around.
Buyer concentration
A per-cell buyer HHI — is the demand broad-based across many procuring entities, or driven by one? Distinguishes a durable trend from a single large programme.
As-of queryable. No look-ahead.
Every cell is knowable at its month_end. The API and SDK apply an as_of filter so a backtest dated D sees only months that had closed by D — the same discipline as AF-MACRO. Restatements accrue as new vintages; published values are never silently rewritten.
# three lines to a point-in-time DataFrame import certvas cv = certvas.Client(api_key="your-key") panel = cv.signals.procurement_demand(country="ZA", as_of="2025-06-30")
Also reachable via the REST API (/v1/signals/procurement-demand), the MCP tool get_procurement_demand, and the bulk Parquet above — one schema, one provenance envelope, every surface.
Panel dictionary.
| Field | Type | Description |
|---|---|---|
country | string | ISO country code of the procuring jurisdiction. |
category | string | Procurement category (goods / works / services / uncategorized). |
month | string | Release month, YYYY-MM. |
month_end | date | Last day of the month — the date at which the cell becomes knowable (the as_of anchor). |
category_share_pct | number | Headline. Category’s share of the country-month’s tenders (robust to ingestion volume). |
share_mom_3m_pp | number | 3-month change in category_share_pct, in percentage points (null if no 3-month base). |
buyer_hhi | number | Buyer concentration within the cell (0–10000). |
n_tenders | integer | Context only — ingestion-coverage sensitive; read the shares. |
n_buyers | integer | Distinct procuring entities in the cell. |
value_disclosed_pct | number | Share of the cell’s tenders that disclose a value (context). |
What this is — and isn’t — today.
We publish the exact coverage rather than overclaim. The signal leads on shares because the underlying OCDS feed is backfilled in windows, so raw counts are coverage-sensitive; category share and buyer HHI are within-month ratios and are volume-robust. There is no value-weighting (OCDS value coverage is sparse and mixes currencies). The v1 universe is South Africa (S007); coverage expands as more national feeds clear the licence register. Suppliers are not yet resolved to listed tickers — the signal maps to categories/sectors, with issuer-level mapping on the roadmap. See the provenance guarantees.