# Public Tenders Search – EU TED, UK & US (`sfoln/public-tenders-search`)

Search government tenders and contract awards in EU TED, UK Contracts Finder, UK Find a Tender and USAspending by keyword, CPV code, country and date. One row per notice: buyer, value, CPV, deadline, status, awarded supplier, link. $2 per 1,000 notices.

- Family: Company & lead intelligence
- Categories: Lead generation, News, Automation
- Availability: on request (private on Apify). Email contact@sfoln.com with subject "Access request: Public Tenders Search – EU TED, UK & US (sfoln/public-tenders-search)" before calling; calls fail until it is public.
- JSON: https://www.sfoln.com/actors/public-tenders-search.json
- MCP: https://mcp.apify.com?tools=sfoln/public-tenders-search
- REST (sync): POST https://api.apify.com/v2/actors/sfoln~public-tenders-search/run-sync-get-dataset-items
- REST (async): POST https://api.apify.com/v2/actors/sfoln~public-tenders-search/runs

Find government tenders and contract awards in EU TED, UK Contracts Finder, UK Find a Tender and USAspending with one search, by keyword, CPV code, country, region and date. Each notice is one clean row in the same shape whatever the source: title, buyer, country, CPV codes, estimated or awarded value with currency, procedure, publication date, deadline, open/closed/awarded status, winning suppliers and the link to the notice. Built for bid teams, sales prospecting, market research and AI agents that track public procurement. $2 per 1,000 notices.

## Price per delivered record

| Event | Price | Per 1,000 | Charged for |
| --- | --- | --- | --- |
| Tender notice (`tender`) | $0.002 | $2 / 1,000 | One procurement notice delivered: an EU TED, UK Contracts Finder or UK Find a Tender notice (call for tenders, award, prior information) or a USAspending contract award. |

Pay-per-event, USD, billed by Apify; no platform usage charge. Only records with status `ok` are charged. Cap a run with `maxTotalChargeUsd`. Apify free plan: up to 10 per run.

## Run

```bash
curl -X POST "https://api.apify.com/v2/actors/sfoln~public-tenders-search/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"keywords":["cybersecurity"],"maxResultsPerQuery":5}'
```

MCP client configuration:

```json
{
  "mcpServers": {
    "apify": {
      "type": "http",
      "url": "https://mcp.apify.com?tools=sfoln/public-tenders-search"
    }
  }
}
```

Example prompt: Find 5 open public tenders for "cybersecurity" published in the last 30 days in Germany and the UK, with buyer, estimated value, deadline and link.

## Input

Search public procurement notices (calls for tenders and contract awards) in EU TED, UK Contracts Finder, UK Find a Tender and USAspending. Each notice is one dataset row; each search also gets one summary record.

| Field | Type | Default | Meaning |
| --- | --- | --- | --- |
| `keywords` | array | — | Keywords: What to look for, one search per line (e.g. "cybersecurity", "cloud migration"); a multi-word keyword is searched as a phrase. Leave empty to list notices by CPV codes, countries or regions only. Accounts on the Apify free plan can process up to 10 items per run (searches) and 20 notices per search. |
| `cpvCodes` | array | — | CPV codes: Common Procurement Vocabulary codes (8 digits) applied to every search; a code matches its sub-codes (72000000 = all IT services). USAspending has no CPV codes. |
| `countries` | array | — | Countries: Buyer countries as ISO codes (DE, FR, GB, US) or English names; EU means the 27 member states. Empty: every country of every source. Sources outside these countries are not searched. |
| `regions` | array | — | Regions: Places of performance: NUTS codes for EU notices (DE21, FR10), UK regions (London, Scotland, North West…) or UK NUTS codes (UKI, UKM) for both UK services, US states for USAspending (US-CA, US-VA). |
| `daysBack` | integer | `30` | Published in the last N days: Notices published in the last N days (counting today). Ignored when publishedFrom is set. |
| `publishedFrom` | string | — | Published from: Earliest publication date (YYYY-MM-DD). Overrides daysBack. |
| `publishedTo` | string | — | Published until: Latest publication date (YYYY-MM-DD, default today). |
| `status` | string | `"all"` | Status: open: calls for tenders still accepting tenders or requests to participate; awarded: contract award notices; all: both (plus prior information notices). One of `"all"`, `"open"`, `"awarded"`. |
| `sources` | array | — | Sources: Where to search: ted (EU Tenders Electronic Daily), uk-contracts-finder, uk-find-a-tender, usaspending (US federal contract awards). Leave empty for all sources that cover the chosen countries. |
| `maxResultsPerQuery` | integer | `25` | Max notices per search: How many notices each search returns at most, newest first, shared fairly between the sources. |
| `deduplicate` | boolean | `true` | Skip notices already delivered in this run: A notice found by several keywords is delivered (and charged) once, for the first search. |
| `maxItems` | integer | `50` | Max searches: Safety cap on how many searches (keywords) are processed in this run; the rest are reported as ignored. |
| `concurrency` | integer | `2` | Concurrency: Searches processed in parallel. The UK sources are rate-limited for the whole run, so more rarely helps. |
| `includeRaw` | boolean | `false` | Include raw source records: Attach the source's unmodified notice record to every row (larger output). |

Example input:

```json
{
  "keywords": [
    "cybersecurity"
  ],
  "maxResultsPerQuery": 5
}
```

## Output

One record per input item with `status` (`ok` is charged; `not_found`, `error`, `skipped_*` are free) and `charged`. The run stores an `OUTPUT` summary record.

| Field | Type | Meaning |
| --- | --- | --- |
| `input` | string | object | Input: The search (keyword, or CPV / country filter) this record belongs to. |
| `recordType` | string | Record type: tender (one notice; charged) or summary (one per search: counts, sources, warnings; never charged). |
| `position` | integer | Position: Rank of the notice in its search's results (1 = first; grouped by source, newest first). |
| `status` | string | Status: ok \| not_found \| error \| skipped_invalid \| skipped_budget \| skipped_free_plan \| skipped_unmetered |
| `charged` | boolean | Charged: Whether this record incurred a pay-per-event charge. |
| `chargedEvent` | string | Charged event: Pay-per-event event charged for this record (present only when charged). |
| `chargedCount` | integer | Events charged: Events actually charged when the charge came back short of the requested count (present only then; a warning explains it). |
| `source` | string | Source: Notice rows: ted, uk-contracts-finder, uk-find-a-tender or usaspending. Summary records: the sources searched (ted+uk-contracts-finder+…). |
| `fetchedAt` | string | Fetched at: ISO timestamp. |
| `noticeId` | string | Notice id: The source's id, unique within the source: TED publication number, Contracts Finder notice id, Find a Tender notice id, USAspending generated award id (CONT_AWD_…). |
| `referenceNumber` | string | null | Reference: The buyer's or platform's reference number, when published (USAspending: the award id / PIID). |
| `noticeType` | string | Notice type: tender (call for competition), award, planning (prior information / pipeline) or other. |
| `title` | string | null | Title: Notice title (TED: English when the buyer published one, else the original language). |
| `description` | string | null | Description: Plain-text excerpt of the description (at most 600 characters). |
| `buyer` | string | null | Buyer: Contracting authority or awarding agency. |
| `country` | string | null | Country: Buyer country, ISO 3166-1 alpha-2. |
| `region` | string | null | Region: NUTS code (EU/UK), UK region (Contracts Finder) or US state of the place of performance or the buyer. |
| `cpvCodes` | array | CPV codes: Common Procurement Vocabulary codes, main code first. |
| `classifications` | array | Classifications: [{ scheme: CPV \| NAICS \| PSC, code, description }] (USAspending: NAICS and PSC). |
| `value` | number | null | Value: Estimated contract value (tenders) or awarded amount (awards). |
| `currency` | string | null | Currency: ISO currency code of value. |
| `valueType` | string | null | Value type: estimated or awarded. |
| `procedureType` | string | null | Procedure: Procedure (open, restricted, negotiated with prior call…; Find a Tender's wording; USAspending's award type). |
| `publishedAt` | string | null | Published: Publication date (YYYY-MM-DD) or timestamp. |
| `deadline` | string | null | Deadline: Deadline for tenders (or requests to participate), date or timestamp. |
| `tenderStatus` | string | Tender status: open, closed, awarded, planned, cancelled or unknown. |
| `awardedSuppliers` | array | Awarded to: Winning suppliers (awards). |
| `contractStart` | string | null | Contract start: Start of the contract period, when given. |
| `contractEnd` | string | null | Contract end: End of the contract period, when given. |
| `url` | string | null | URL: The notice page on the source's website. |
| `submissionUrl` | string | null | Submission URL: Where tenders are submitted or the documents are published, when given. |
| `keyword` | string | null | Keyword: Summary records: the keyword searched (null for a CPV / country listing). |
| `resultsDelivered` | integer | Notices delivered: Summary records: notices delivered (and charged) for the search. |
| `stopReason` | string | Stop reason: Summary records: limit, free_plan, end, budget, aborted or error. |
| `sourcesSearched` | array | Sources searched: Summary records: the sources asked. |
| `sourceTotals` | object | Matches per source: Summary records: matches each source reported (or returned), null when it failed. |
| `duplicatesSkipped` | integer | Duplicates skipped: Summary records: notices skipped because an earlier search of the run delivered them (not charged). |
| `error` | object | Error: { code, message, provider?, status? } when status is not ok. Codes set by the runtime: budget_exhausted, free_plan_limit, unmetered, aborted, charge_failed, record_too_large, invalid_record, dataset_push_failed; upstream codes: http_error (with the source's HTTP status), timeout, network, tls_error, invalid_json, too_large, rate_limit, server, client, invalid_response, not_found; invalid_input. |
| `warnings` | array | Warnings: Notes about this record: sources that failed or were skipped, scan limits, free-plan or budget limits, skipped duplicates. |
| `raw` | object | Raw: The source's unmodified notice record (only with includeRaw). |

Example record:

```json
{
  "input": "cybersecurity",
  "recordType": "tender",
  "position": 1,
  "noticeId": "707412-2026",
  "referenceNumber": "PPP0DJ-536/6194/2026/11",
  "noticeType": "tender",
  "title": "Aanstelling sociaal secretariaat",
  "description": "IVM is een intercommunale die een erkend sociaal secretariaat wil aanstellen …",
  "buyer": "Intergemeentelijke opdrachthoudende Vereniging voor huisvuilverwerking Meetjesland (IVM)",
  "country": "BE",
  "region": "BE233",
  "cpvCodes": [
    "79211110"
  ],
  "classifications": [
    {
      "scheme": "CPV",
      "code": "79211110",
      "description": null
    }
  ],
  "value": null,
  "currency": null,
  "valueType": null,
  "procedureType": "open",
  "publishedAt": "2026-10-13",
  "deadline": "2026-12-08T11:18:00+01:00",
  "tenderStatus": "open",
  "awardedSuppliers": [],
  "contractStart": "2028-01-01",
  "contractEnd": "2031-12-31",
  "url": "https://ted.europa.eu/en/notice/-/detail/707412-2026",
  "submissionUrl": "https://www.publicprocurement.be",
  "status": "ok",
  "charged": true,
  "chargedEvent": "tender",
  "source": "ted",
  "fetchedAt": "2026-10-14T10:00:00.000Z"
}
```

## FAQ

**Which countries are covered?**

EU TED covers all EU member states plus EEA and some neighbouring countries (calls for tenders above the EU thresholds, awards and prior information notices). UK Contracts Finder and Find a Tender cover the United Kingdom. USAspending covers US federal contract awards. Pick countries with ISO codes (DE, FR, GB, US), names or EU; sources outside them are not searched.

**Can I get open US federal solicitations?**

Not yet: open US federal opportunities are published on SAM.gov, which needs an API key or its bulk extract. For the US the Actor returns new federal contract awards from USAspending (who won what, for how much).

**How do I monitor new tenders?**

Schedule the Actor daily with `daysBack: 1` (or 2 to be safe) and `status: "open"`, and attach a webhook or an integration to send new rows to Slack, a CRM or a sheet.


## Related

- [Website Contact Details Scraper](https://www.sfoln.com/actors/company-contacts-finder.md) (`sfoln/company-contacts-finder`)
- [Company Enrichment – Firmographics by Domain](https://www.sfoln.com/actors/company-enrichment.md) (`sfoln/company-enrichment`)
- [LinkedIn Company Details Scraper (No Login)](https://www.sfoln.com/actors/linkedin-company-lookup.md) (`sfoln/linkedin-company-lookup`)
- [Google News Scraper](https://www.sfoln.com/actors/google-news-search.md) (`sfoln/google-news-search`)
- [Domain WHOIS & DNS Lookup](https://www.sfoln.com/actors/domain-intelligence.md) (`sfoln/domain-intelligence`)
- [Currency Exchange Rates API](https://www.sfoln.com/actors/fx-rates.md) (`sfoln/fx-rates`)

Publisher: SFOLN LLC, contact@sfoln.com. Catalogue: https://www.sfoln.com/catalog.json. Agent guide: https://www.sfoln.com/agents.md.
