> ## Documentation Index
> Fetch the complete documentation index at: https://www.worldmonitor.app/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Global Procurement Intelligence

> How WorldMonitor aggregates active public tender opportunities, communicates source health, and exposes the paginated procurement API.

WorldMonitor separates **open opportunities** from historical **recent awards**. Open opportunities live in the dedicated **Global Procurement** panel as a forward-looking, seed-backed feed; awards remain sourced from USASpending in the Economic panel.

Global Procurement is a **Pro feature**. The panel shows the standard sign-in or upgrade gate to free users, and the RPC independently enforces an active tier-1 subscription server-side. The browser only requests and retains tender data while Pro access is active; sign-out or downgrade clears both the panel payload and its in-memory response cache. Recent awards remain part of the free Economic panel behavior.

Pro users can search titles and descriptions, filter by buyer, two-letter country code, and source, choose a supported sort, and page through the complete result set. The panel never reads Upstash directly: it calls the paginated RPC, which reads the canonical seeded snapshot.

## Coverage and freshness

The initial adapters read official public procurement sources:

| Source                         | Coverage              | Notes                                                                                                                 |
| ------------------------------ | --------------------- | --------------------------------------------------------------------------------------------------------------------- |
| SAM.gov                        | United States         | Requires the deployment's `SAM_GOV_API_KEY`; an unconfigured adapter is reported as unavailable, not as zero results. |
| TED                            | European Union        | Published public procurement notices from the public TED Search API.                                                  |
| Contracts Finder               | United Kingdom        | Published OCDS tender releases.                                                                                       |
| CanadaBuys                     | Canada                | Official federal open-tender CSV, refreshed daily by CanadaBuys.                                                      |
| GETS                           | New Zealand / Oceania | Current open tenders from the official public GETS RSS feed.                                                          |
| World Bank Procurement Notices | Multilateral / global | World Bank-financed opportunity notices across borrower countries.                                                    |

The Railway seeder runs hourly and stores a canonical snapshot at `economic:global-tenders:v1`. Its TTL is three hours so the prior successful snapshot survives a missed run. If one adapter fails, healthy-source results remain available, that source's last-good records are retained, and the response reports `availability: "partial"`. If every adapter fails, the previous records remain available with `availability: "stale"`.

`availability` has five meanings:

* `available`: all configured adapters succeeded and returned one or more notices.
* `empty`: configured adapters succeeded but returned no notices.
* `partial`: at least one adapter is unavailable or failed while another succeeded.
* `stale`: all current source attempts failed, so retained last-good records are being served.
* `unavailable`: no fresh canonical snapshot is available.

Per-source state, record counts, retrieval-attempt time, last-success time, and stale flag are included in the feed response. Every per-source seed key is independently registered in `/api/health`. Unsupported country filters are never treated as a confirmed zero-result source.

## Deployment configuration

Only the U.S. SAM.gov adapter needs a new credential:

1. Sign in to [SAM.gov](https://sam.gov/), open **Account Details**, and enter your account password to view the API-key controls.
2. Request a **Public API Key**. SAM.gov displays the generated key on the Account Details page.
3. Add it to the Railway service running `node scripts/seed-bundle-relay-backup.mjs` as `SAM_GOV_API_KEY`. Do not expose it through a `VITE_` variable or commit it to the repository.

The official setup and request-limit details are in the [GSA Get Opportunities Public API guide](https://open.gsa.gov/api/get-opportunities-public-api/). TED, Contracts Finder, CanadaBuys, GETS, and World Bank do not require API keys. If `SAM_GOV_API_KEY` is absent, only the SAM source reports `unavailable`; the other adapters continue normally.

Leaving SAM unconfigured is a supported state, not a degradation: `/api/health` reports that source as [`NOT_CONFIGURED`](/docs/docs/health-endpoints) (green, excluded from `problems`) rather than as an error, so a deployment that never obtains a GSA key still reports a clean health endpoint. Adding the key flips it to `OK` on the next seed run with no health-config change.

### Australia: AusTender adapter is blocked

An official Australian `austender` adapter cannot ship safely today, because no permitted machine-readable AusTender interface publishes the closing date that an open-opportunity record requires. Evidence, current as of 2026-07-13:

* The official AusTender current-ATM RSS feed (`https://www.tenders.gov.au/public_data/rss/rss.xml`, registered on [data.gov.au](https://data.gov.au/data/dataset/latest-approaches-to-markets-listed-on-austender) by the Department of Finance) publishes only a notice title, official link, free-text description, and publish date. It carries no closing date, buyer, or category fields.
* The official [AusTender OCDS API](https://github.com/austender/austender-ocds-api) exposes awarded contract notices from 2013 onward, not open Approaches to Market.
* data.gov.au's machine-readable open-ATM exports ended in June 2014.
* Closing dates are published only on per-notice HTML pages; harvesting them would mean scraping the AusTender website, which is not a documented machine-readable reuse interface and is excluded by this feed's non-goals.

This feed never represents a record without a verifiable future closing date, so Australian coverage remains absent rather than inferred, and New Zealand GETS coverage is not substituted for it. Filtering on `country=AU` keeps the standard `countryCoverage: "unknown"` semantics for unobserved countries. If AusTender begins publishing closing dates through a machine-readable channel, the adapter can ship without pipeline changes.

## API

`GET /api/economic/v1/list-global-tenders` is Pro-gated, deliberately paginated, and is **not** part of the bootstrap payload. It supports `country`, repeated `countries`, `region`, `source`, `status`, `buyer`, `published_from`, `published_to`, `deadline_from`, `deadline_to`, `min_value`, `max_value`, `currency`, `category`, `query`, `min_automation_score`, `page_size`, `cursor`, and `sort`.

Supported sorts are `newest`, `closing_soon`, `estimated_value`, and `relevance`. `page_size` is bounded to 100. The response includes applied filters, a cursor, snapshot time, availability, and source-health summaries.

Every record contains a stable WorldMonitor ID (`source:sourceNoticeId`), its official notice URL, source notice ID, typed money fields when supplied, source timestamps, category data, and a provenance-preserving source name. Missing upstream fields remain absent rather than being inferred.

## MCP tool

`get_procurement_opportunities` exposes this same canonical route to authenticated MCP clients; it never reads `economic:global-tenders:v1` directly. Its intentional context budget is **10 compact opportunities by default, 25 maximum**. It exposes `country`, repeated `countries`, `source`, `query`, `buyer`, `deadline_from`, `deadline_to`, `sort`, `min_automation_score`, `page_size`, and `cursor`.

The compact projection omits description text, eligibility requirements, and submission URLs while retaining each opportunity's official URL, source, title, buyer, dates, money, categories, sectors, `participationMode`, and compact `automationFit`. It also retains cursor pagination, `total`, `appliedFilters`, `countryCoverage`, availability, snapshot time, and source-health summaries. The 25-record MCP maximum is deliberately tighter than the REST route's 100-record maximum.

The MCP tool is Pro-gated exactly like the HTTP route and is not part of bootstrap. An unfiltered tool call preserves all open opportunities; `min_automation_score` remains opt-in. See the [MCP tool reference](/docs/mcp-tools-reference#get_procurement_opportunities) for the complete parameter contract.

## Technology relevance

`automationFit` is a transparent keyword-based relevance signal for software, AI, data, cybersecurity, automation, cloud, and related terms. It contains a score, classification version, match reasons, and text evidence. It is **not** a legal or procurement-eligibility determination: `participationMode` remains `unknown` unless an upstream source explicitly supports it.

The optional `min_automation_score` query parameter (an integer from 1–100; larger values are clamped and non-integer values are ignored) returns only opportunities whose `automationFit.score` meets the threshold. It is disabled by default, so existing callers keep receiving every matching open opportunity, and when active it appears in the response's `appliedFilters`. The dedicated panel exposes it as a **Technology relevant only** checkbox. Both the filter and the per-record match reasons express keyword relevance evidence only — they never assert that an AI system, agent, or vendor is eligible to bid.

The dashboard renders official notice links only after URL sanitization and exposes the relevance reason alongside the source-provided opportunity details.
