Certvas
Signal · PDS v1

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

Why it’s tradeable

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.

Point-in-time

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.

certvas SDK (preview)
# 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.

Schema

Panel dictionary.

FieldTypeDescription
countrystringISO country code of the procuring jurisdiction.
categorystringProcurement category (goods / works / services / uncategorized).
monthstringRelease month, YYYY-MM.
month_enddateLast day of the month — the date at which the cell becomes knowable (the as_of anchor).
category_share_pctnumberHeadline. Category’s share of the country-month’s tenders (robust to ingestion volume).
share_mom_3m_ppnumber3-month change in category_share_pct, in percentage points (null if no 3-month base).
buyer_hhinumberBuyer concentration within the cell (0–10000).
n_tendersintegerContext only — ingestion-coverage sensitive; read the shares.
n_buyersintegerDistinct procuring entities in the cell.
value_disclosed_pctnumberShare of the cell’s tenders that disclose a value (context).
Honest coverage

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.