# Tender Search & Government Contracts Finder: US, UK & EU TED (`data-done-right/government-contracts-finder`) Actor

Tender search across SAM.gov, USAspending.gov, UK Find a Tender and EU TED in one clean feed. Find open government tenders and awarded contracts; filter by keyword, NAICS or CPV code, country, deadline and value, and get only new notices since your last run as daily bid alerts.

- **URL**: https://apify.com/data-done-right/government-contracts-finder.md
- **Developed by:** [Data Done Right](https://apify.com/data-done-right) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Tender Search & Government Contracts Finder: US, UK & EU TED

**Government Contracts Finder** is a **tender search** tool that searches the official public procurement APIs of the US, the UK and the EU and returns open government tenders and awarded contracts in **one clean, normalised feed**. It covers **SAM.gov contract opportunities**, **USAspending.gov** awards, **UK Find a Tender** and **EU TED (Tenders Electronic Daily)**. It's built for bid teams, government contractors, consultants and sales teams who want daily bid alerts without checking four portals.

### Tender search: what you can do

Search open tenders by keyword, NAICS or CPV code, country, deadline and value across four official sources at once, then export the **tender search** results to CSV, Excel or JSON.

### What data can you get

- **One schema for every source.** You get title, description, buyer or agency, country, notice type, NAICS and CPV codes, set-aside, estimated value and currency, published date, response deadline, place of performance, the official contact fields published on the notice, the notice URL and attachment links.
- **Awards too.** Awards include the winner (`awardee`), awarded value and award date: USAspending.gov contract awards, SAM.gov award notices, UK contract award notices and EU contract award notices.
- **Filters:** keywords, NAICS codes (US), CPV codes (UK/EU), countries, posted date, response deadline, minimum value and SAM.gov set-aside.
- **Only new since last run:** schedule it daily and get only notices you haven't seen, as a bid-alert feed.
- **Official APIs only.** No scraping of web pages and no login. SAM.gov needs your own free API key; the other three sources need no key.
- **No silent zeros.** A `NOTES` record in the key-value store says, for each source, how many records were scanned, how many were delivered, and why a source was skipped or failed.

| Source | What | Key needed |
|---|---|---|
| SAM.gov (Get Opportunities Public API) | US federal solicitations, combined synopses, sources sought, award notices | Yes, your free SAM.gov public API key |
| USAspending.gov (API v2) | US federal contract awards (new awards in your date window) | No |
| UK Find a Tender (OCDS API) | UK public sector tenders and award notices, including many below-threshold notices under the Procurement Act 2023 | No |
| EU TED API v3 | Contract notices and award notices from the EU, EEA and other countries publishing on TED | No |

### How to find government contracts to bid on

1. Leave **What to find** on *Open opportunities* and pick your **Sources**.
2. Add **Keywords** (e.g. `software`, `cybersecurity`, `facility management`), or industry codes: **NAICS codes** for the US, **CPV codes** for the UK and EU.
3. Optionally set **Countries** (e.g. `US`, `GB`, `DE`, `FR`), turn on **Only still-open opportunities** (deadline today or later, checked on every run) and set a **Minimum value**.
4. For SAM.gov, paste your **SAM.gov API key**. Without one, SAM.gov is skipped with a note and the other sources still run.
5. Run it, then export the results as JSON, CSV or Excel, or send them to Google Sheets or Slack.

### How to set up daily bid alerts

Turn on **Only notices new since my last run** and **Only still-open opportunities**, then create a daily schedule in Apify. Each run returns only notices that earlier runs didn't deliver. Connect a webhook or one of our related tools (below) to send the new notices to Slack, email or a spreadsheet.

### How to search SAM.gov contract opportunities with the API

1. Sign in at SAM.gov, open **Account Details** and request a **Public API Key**.
2. Paste it into **SAM.gov API key**. It is stored as a secret input, never logged and never written to the output.
3. NAICS codes are sent to SAM.gov one request per code. One keyword is sent as the SAM.gov title search; several keywords are matched against the title on our side. **SAM.gov set-aside code** accepts one code such as `SBA`, `8A`, `HZC`, `SDVOSBC` or `WOSB`.
4. SAM.gov returns descriptions as a separate link (`descriptionUrl`). Turn on **Fetch full SAM.gov descriptions** to download the text. This costs one extra API request per notice, against your key's daily limit.

### Input example

```json
{
  "mode": "opportunities",
  "sources": ["sam", "uk", "eu"],
  "keywords": ["software", "cloud"],
  "naicsCodes": ["541512"],
  "cpvCodes": ["72000000"],
  "postedWithinDays": 7,
  "onlyOpen": true,
  "maxItemsPerSource": 100,
  "onlyNew": true,
  "samApiKey": "your-sam-gov-key"
}
```

### Output example

```json
{
  "source": "EU TED",
  "sourceId": "718824-2026",
  "noticeType": "tender",
  "rawNoticeType": "cn-standard",
  "title": "The provision of Internal Audit Service",
  "titleEnglish": "Ireland – Internal audit services – The provision of Internal Audit Service",
  "description": "The Authority wishes to procure an economic operator to provide the following Internal Audit Services...",
  "buyer": "Rásaíocht Con Éireann",
  "country": "IE",
  "naicsCodes": [],
  "cpvCodes": ["79212200", "79212000", "79212300"],
  "pscCode": null,
  "setAside": null,
  "estimatedValue": 140000.0,
  "currency": "EUR",
  "awardedValue": null,
  "awardee": null,
  "awardDate": null,
  "publishedDate": "2026-10-19",
  "responseDeadline": "2026-11-20T13:00:00+01:00",
  "placeOfPerformance": "IE",
  "contactName": null,
  "contactEmail": "procurement@grireland.ie",
  "contactPhone": null,
  "url": "https://ted.europa.eu/en/notice/-/detail/718824-2026",
  "attachments": ["https://www.etenders.gov.ie/epps/cft/listContractDocuments.do?resourceId=9305346"],
  "solicitationNumber": null,
  "procedureType": "open",
  "descriptionUrl": null,
  "scrapedAt": "2026-10-19T12:34:40+00:00"
}
```

`noticeType` is `tender`, `planning` (only with **Include early-stage notices**) or `award`. `rawNoticeType` keeps the source's own type, e.g. `Combined Synopsis/Solicitation`, `tenderUpdate` or `can-standard`. Countries are two-letter codes.

### Use cases

- **Bid alerts** for government contractors and small businesses: new tenders in your NAICS or CPV codes every morning.
- **Market research:** who buys what, at what value, in the US, UK and EU.
- **Competitor tracking:** who wins awards (`awardee`, `awardedValue`) in your category.
- **Sales prospecting:** public sector buyers that are actively procuring your kind of service.

### Limits (honest)

- **SAM.gov** needs your own API key, and SAM.gov limits how many requests a key can make per day depending on your account's role. The Actor saves requests by asking for 1,000 notices per request. If the limit is hit, the run says so in `NOTES` and the other sources still deliver.
- **USAspending.gov** has awarded contracts only, not open opportunities. By law, Department of Defense award data appears there with a delay of up to 90 days.
- **UK:** the source is Find a Tender (the UK central digital platform). The older Contracts Finder portal is not included. Find a Tender has no keyword search in its API, so keywords and CPV codes are matched on our side. It rate-limits bursts of requests, so the Actor paces them about 5 seconds apart (100 notices each). Long date windows with narrow filters can take a few minutes. **Max records scanned per source** caps this.
- **EU TED** notices are in the buyer's language. The keyword search runs on the full notice text, so add keywords in the local languages you care about. `titleEnglish` has TED's English title line when available.
- Many notices don't publish a value. Values are in the notice's own currency, with no conversion.
- Contacts are the official public contact fields published on each notice, nothing more.

### How much does it cost

Pay per result: one `opportunity` event per tender delivered and one `award` event per award delivered. Notices that are filtered out, skipped as already seen, or fail are not charged. At the launch price of $2.20 per 1,000 notices, a daily alert of 50 new tenders costs about $0.11 a day, plus Apify's small start fee per run. See the Pricing tab for current prices.

### FAQ

#### How do I find government contracts to bid on?

Run this Actor with your keywords or industry codes, turn on **Only still-open opportunities**, and turn on **Only notices new since my last run** with a daily schedule. You get the new open tenders from SAM.gov, the UK and the EU in one list, each with its deadline, buyer contact and link to the official notice.

#### Where are government contracts posted?

US federal opportunities are posted on SAM.gov, and US federal awards are reported on USAspending.gov. UK public sector tenders are on Find a Tender, and EU public tenders above the EU thresholds are on TED. This Actor reads all four through their official APIs.

#### Does SAM.gov have an API, and how do I get a SAM.gov API key?

Yes. SAM.gov has the Get Opportunities Public API. Sign in to SAM.gov, open Account Details and request a Public API Key. It's free. Paste it into **SAM.gov API key**.

#### Are government contracts public record?

Contract opportunities and award notices published on these portals are public. The UK data is under the Open Government Licence, TED data is published for reuse, and US federal data is public domain. Check the terms of each portal for your use. This is not legal advice.

#### Why do I get no SAM.gov results?

Either no API key was given (the run says "skipped: no SAM.gov API key" in `NOTES`), the key is invalid or not active yet, or the key's daily request limit is used up. `NOTES` tells you which.

#### Can I filter by NAICS or CPV code?

Yes. NAICS codes apply to SAM.gov and USAspending.gov. CPV codes apply to TED and Find a Tender, and a broad code like `72000000` includes its sub-codes.

### Related tools

- **Send Data to Slack, Discord, Email, Notion & Postgres**: post each day's new tenders to a Slack channel or an email.
- **Google Sheets Import & Export: Apify Data, No Login**: keep a bid pipeline spreadsheet up to date.
- **Companies House API: UK Company, Officer & PSC Data**: look up UK buyers and award winners.

# Actor input Schema

## `mode` (type: `string`):

Open opportunities (tenders, solicitations, contract notices), awarded contracts, or both.

## `sources` (type: `array`):

Official sources to search. SAM.gov needs your free API key (below). USAspending.gov has awarded contracts only.

## `keywords` (type: `array`):

Keep notices that mention any of these words or phrases (e.g. software, cybersecurity, cleaning services). TED searches the full notice text; Find a Tender and SAM.gov match the title and description; USAspending searches its award text.

## `naicsCodes` (type: `array`):

US industry codes, e.g. 541512 (computer systems design). Used by SAM.gov (one request per code) and USAspending.gov. Ignored by UK and EU sources.

## `cpvCodes` (type: `array`):

EU procurement codes, e.g. 72000000 (IT services) or 45000000 (construction). Broader codes include their sub-codes. Used by TED and Find a Tender; ignored by US sources.

## `countries` (type: `array`):

Optional. Two- or three-letter codes, e.g. US, GB, DE, FRA. US runs the US sources, GB runs Find a Tender, any other code filters TED by buyer country. Empty = all.

## `postedWithinDays` (type: `integer`):

Only notices published in this many days (ignored when 'Posted after' is set).

## `postedAfter` (type: `string`):

Optional fixed start date, YYYY-MM-DD. Overrides 'Posted in the last N days'. SAM.gov allows at most one year.

## `deadlineAfter` (type: `string`):

Optional, YYYY-MM-DD. Keeps only opportunities whose bid deadline is on or after this date (use today's date for still-open tenders). Notices without a deadline are dropped. Not applied to awards.

## `onlyOpen` (type: `boolean`):

Keeps only opportunities whose bid deadline is today or later, checked on each run's date (best for scheduled alerts). Notices without a deadline are dropped. Not applied to awards.

## `minValue` (type: `integer`):

Optional. Minimum estimated value (opportunities) or awarded value (awards), in the notice's own currency (USD, GBP, EUR ...). No currency conversion.

## `keepItemsWithoutValue` (type: `boolean`):

Many notices publish no value. With a minimum value set, these are dropped unless you turn this on.

## `includeEarlyNotices` (type: `boolean`):

Also return pre-tender notices: SAM.gov sources sought, presolicitation and special notices, UK planning (pipeline) notices and EU prior information notices.

## `maxItemsPerSource` (type: `integer`):

Newest first. Also caps cost.

## `onlyNew` (type: `boolean`):

Remembers what earlier runs delivered and skips it. Schedule the Actor daily for a bid-alert feed.

## `samApiKey` (type: `string`):

Free public API key from SAM.gov (sign in > Account Details > Public API Key). Without it SAM.gov is skipped and the other sources still run. Stored encrypted, never logged or written to the output.

## `samSetAside` (type: `string`):

Optional, one code: SBA (small business), 8A, HZC (HUBZone), SDVOSBC (service-disabled veteran-owned), WOSB, EDWOSB and others from SAM.gov.

## `samFetchDescriptions` (type: `boolean`):

SAM.gov returns descriptions as a separate link. On = one extra API request per notice, which uses up your key's daily request limit fast. Off = the link is in descriptionUrl.

## `maxRecordsScanned` (type: `integer`):

Upper limit on raw records read per source before filtering. Raise it for long date windows with narrow filters (Find a Tender is filtered on our side; its requests are paced about 5 seconds apart, 100 records each).

## Actor input object example

```json
{
  "mode": "both",
  "sources": [
    "usaspending",
    "uk",
    "eu"
  ],
  "postedWithinDays": 7,
  "onlyOpen": false,
  "keepItemsWithoutValue": false,
  "includeEarlyNotices": false,
  "maxItemsPerSource": 5,
  "onlyNew": false,
  "samFetchDescriptions": false,
  "maxRecordsScanned": 3000
}
```

# Actor output Schema

## `results` (type: `string`):

All result items of this run (the default dataset), as JSON, CSV, Excel and more.

## `records` (type: `string`):

Key-value store records: the run summary, notes on any problems, and any files.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "mode": "both",
    "sources": [
        "usaspending",
        "uk",
        "eu"
    ],
    "postedWithinDays": 7,
    "maxItemsPerSource": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("data-done-right/government-contracts-finder").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "mode": "both",
    "sources": [
        "usaspending",
        "uk",
        "eu",
    ],
    "postedWithinDays": 7,
    "maxItemsPerSource": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("data-done-right/government-contracts-finder").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "mode": "both",
  "sources": [
    "usaspending",
    "uk",
    "eu"
  ],
  "postedWithinDays": 7,
  "maxItemsPerSource": 5
}' |
apify call data-done-right/government-contracts-finder --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,data-done-right/government-contracts-finder"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/MszR3mbasKiRRW56r/builds/tjF4VvraZI4iQAIBr/openapi.json
