# Government Tenders Scraper - SAM.gov, TED EU & UK Contracts (`artsiom_k/government-tenders-scraper`) Actor

Public tenders and contract awards from SAM.gov (US federal), TED (EU) and the UK's Find a Tender and Contracts Finder in one format: buyer, deadline, value, CPV/NAICS codes, contacts, winners.

- **URL**: https://apify.com/artsiom_k/government-tenders-scraper.md
- **Developed by:** [Artsiom Kunitsyn](https://apify.com/artsiom_k) (community)
- **Categories:** Lead generation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.80 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## Government Tenders Scraper - SAM.gov, TED EU & UK Contracts

Scrapes **public tenders and contract awards** from four official procurement portals into **one format**:
[SAM.gov](https://sam.gov) (US federal contract opportunities), [TED](https://ted.europa.eu) (the EU's official
tenders journal, all EU/EEA countries), the UK's [Find a Tender](https://www.find-tender.service.gov.uk) and
[Contracts Finder](https://www.contractsfinder.service.gov.uk). Each notice comes with the buyer, deadline,
estimated value, CPV or NAICS codes, contacts, documents and, for awards, the winners and the awarded value.
Built for bid teams, sales prospecting and market research that check new opportunities every day. No login,
no API key, no proxy needed.

### Contents

- [Key features](#key-features)
- [Strengths and limits](#strengths-and-limits)
- [Output](#output)
- [Input](#input)
- [Input examples](#input-examples)
- [Incremental mode](#incremental-mode)
- [FAQ](#faq)

### 🔑 Key features

- **Four portals, one schema.** US federal, EU/EEA and UK notices with the same field names, so one filter,
  one spreadsheet and one alert rule cover all of them.
- **Tenders, planning notices and awards.** Open opportunities, prior information / sources sought, contract
  awards with winners and values, modifications and cancellations (`notice_category`).
- **Filters that work across portals.** Keywords, buyer countries, CPV codes (each matches everything under it),
  NAICS codes, notice types, minimum value and a date window.
- **SAM.gov details.** NAICS and PSC codes, set-aside, contracting office and department, points of contact with
  email and phone, place of performance, award data and attachment download links.
- **Daily-ready.** Schedule it with incremental mode and get only notices that are new or whose deadline, status,
  value or title changed.
- **Buyer contacts.** A buyer email on every notice in our sample, named contacts with phone numbers on SAM.gov
  and the UK portals.
- **`maxItems` defaults to 50**: a fast, cheap preview with notices from every portal. Clear it (`null`) for
  everything in your selection.

### ⚖️ Strengths and limits

Read this before scheduling a big job, so you know exactly what you get.

**Strengths**

- **Official sources only.** Every notice comes from the government portal that published it, with a link back
  to the original notice.
- **One format for four portals.** The work of mapping SAM.gov codes, EU eForms notice types and the UK's open
  contracting data into one row is done for you.
- **Fast and light.** Open APIs, no browser and no proxy; a default run takes about 15 seconds.
- **Cheap to keep current.** Incremental runs return only new and changed notices.

**Limits**

- **Not every country.** US federal (SAM.gov), EU/EEA notices published in TED, and the UK. No US state and local
  (SLED) bids, no Canada, Australia, India or UN agencies. Notices below the EU publication thresholds that a
  country publishes only on its national portal are not in TED either.
- **UK keyword search is narrower.** The UK portals have no full-text search, so keywords are matched on the
  title and description only (SAM.gov and TED search the whole notice).
- **Languages.** TED titles are available in English; descriptions, buyer names and cities are in the notice's own
  language (German, French, Polish...). Keyword searches on TED match the original text, so search in the local
  language too for full coverage.
- **Values are not always there.** On a sample day (5,808 notices), about half of TED tenders and 57–78% of UK
  tenders had an estimated value, and SAM.gov opportunities never do (SAM.gov award notices always have the
  awarded amount; TED awards 93%). Values are in the notice's own currency (EUR, GBP, PLN, USD...), not converted;
  Minimum value compares the raw number and leaves out notices without a value. On SAM.gov it needs each
  notice's details first, so a SAM.gov run with Minimum value is slower.
- **Fields differ by portal.** Named contacts with phone numbers come from SAM.gov and the UK (TED gives the
  buyer's email only); set-asides only from SAM.gov (and Contracts Finder's "SME suitable"); winners only on award
  notices. Every notice in the sample had a title and a buyer email; 99–100% of tenders had a deadline.
- **Codes differ by portal.** SAM.gov uses NAICS and PSC codes, the others CPV. Filtering by CPV leaves SAM.gov
  out, filtering by NAICS leaves TED and the UK out.
- **Deadlines and statuses come as published.** Formats differ by portal (a date on TED, a date and time
  elsewhere), and TED notices have no status: a correction or cancellation is a new notice.
- **Documents are links, not files.** The actor lists document and attachment links; it doesn't download or read
  PDFs.
- **SAM.gov uses the website's own search.** SAM.gov is read through the same search interface sam.gov's search
  page uses (the official SAM.gov API requires a personal key). If SAM.gov changes it, that source stops until the
  actor is updated; the other three keep working.
- **Volume and cost.** All four portals publish about 6,000 notices on a weekday, so an unfiltered week is about
  40,000 rows (about $160 at $4 per 1,000 on the free plan). Use filters, and incremental mode for schedules.
- **One date window per run**, up to 366 days.
- **Not affiliated** with any of these governments or portals.

### 📋 Output

The **Output** tab lists every field. One row per notice:

```json
{
  "source": "sam_gov",
  "notice_id": "fe0081bd251941d39a2ba9320e9283ad",
  "url": "https://sam.gov/opp/fe0081bd251941d39a2ba9320e9283ad/view",
  "title": "J045--FY27 Boilers Maintenance & Testing",
  "notice_category": "tender",
  "notice_type": "Combined Synopsis/Solicitation",
  "published_at": "2026-10-30T19:32:15+00:00",
  "deadline": "2026-11-06T11:00:00-04:00",
  "buyer_name": "248-NETWORK CONTRACT OFFICE 8 (36C248)",
  "buyer_department": "VETERANS AFFAIRS, DEPARTMENT OF",
  "buyer_country": "US",
  "buyer_email": "Aurea.Gonzalez@va.gov",
  "contacts": [{ "name": "Aurea Gonzalez", "email": "Aurea.Gonzalez@va.gov", "phone": "787-641-7582  Ext. 34954", "type": "primary" }],
  "naics_codes": ["238220"],
  "psc_code": "J045",
  "set_aside": "SDVOSBC",
  "place_of_performance": "San Juan, PR, 00921, USA",
  "documents": [{ "name": "36C24827Q0061 Boilers .pdf", "url": "https://sam.gov/api/prod/opps/v3/opportunities/resources/files/997db4a93e194eada34fe77e4172262b/download" }],
  "solicitation_number": "36C24827Q0061",
  "change_type": "new"
}
```

A TED or UK notice has the same fields, with `cpv_codes`, `estimated_value` / `estimated_value_currency`, and for
awards `award_value`, `award_currency` and `winners`.

### 🔧 Input

| Field | Type | Default | Description |
|---|---|---|---|
| `sources` | array | all four | `sam_gov`, `ted`, `uk_find_a_tender`, `uk_contracts_finder`. |
| `noticeTypes` | array | `["tender"]` | `tender`, `planning`, `award`, `modification`, `cancellation`, `other`. **Empty = all.** |
| `keywords` | array | — | Any of these keywords or phrases. |
| `countries` | array | all | Buyer countries, two-letter codes (`DE`, `FR`, `US`, `GB`...). |
| `cpvCodes` | array | — | CPV codes; `72` or `72000000` = all IT services. |
| `naicsCodes` | array | — | NAICS codes or prefixes (`5415`). |
| `minValue` | integer | — | Minimum estimated or awarded value, in the notice's currency. |
| `lookbackDays` | integer | `3` | Notices published or updated in the last N days. |
| `dateFrom` / `dateTo` | string | — | A fixed window (`YYYY-MM-DD`), up to 366 days. |
| `includeDetails` | boolean | `true` | SAM.gov contacts, NAICS, set-aside, attachments. |
| `maxItems` | integer | `50` | Stop after this many notices. `null` = everything selected. |
| `mode` | string | `auto` | `auto` / `full` / `incremental`. |
| `concurrency` | integer | `8` | Requests in flight (max 20). |
| `proxyConfiguration` | object | no proxy | Apify Proxy settings. Not needed. |

### 📥 Input examples

**Default preview (50 open tenders from all four portals, last 3 days):**

```json
{}
```

**IT and software tenders in Europe and the UK, every day:**

```json
{ "cpvCodes": ["72", "48"], "lookbackDays": 2, "maxItems": null }
```

**US federal IT opportunities (NAICS 5415) with contacts:**

```json
{ "sources": ["sam_gov"], "naicsCodes": ["5415"], "lookbackDays": 2, "maxItems": null }
```

**Cybersecurity tenders anywhere:**

```json
{ "keywords": ["cybersecurity", "cyber security"], "lookbackDays": 7, "maxItems": null }
```

**Contract awards over 1 million in Germany and France (who won what):**

```json
{ "noticeTypes": ["award"], "countries": ["DE", "FR"], "minValue": 1000000, "lookbackDays": 7, "maxItems": null }
```

**Construction tenders in the UK:**

```json
{ "sources": ["uk_find_a_tender", "uk_contracts_finder"], "cpvCodes": ["45"], "maxItems": null }
```

### 🔁 Incremental mode

Only for a run with `maxItems` cleared (`null`): a capped run is a preview and always returns rows. After the
first complete run, a scheduled run of the same selection (sources, notice types, keywords, countries, codes,
minimum value) returns only notices that are new, or whose deadline, status, value, category or title changed,
with `change_type` `new` or `changed`. Notices are remembered for 90 days. The date window doesn't count as part
of the selection, so a daily schedule with `lookbackDays: 2` keeps one memory and never returns the same notice
twice unless it changed. A run that hits an error on any portal doesn't update the memory, so the next run
catches up.

### ❓ FAQ

**How fresh is the data?** As fresh as the portals: SAM.gov and the UK portals update all day, TED publishes on
weekdays only. A run reads the portals live. `lookbackDays: 1` means today only, so it can be empty early in the day or
at weekends; for a daily schedule use `lookbackDays: 2` with incremental mode, so nothing published after the last
run is missed.

**Can I get the full tender documents?** The `documents` field lists the links (SAM.gov attachments download
directly). The actor doesn't download or read the files.

**Why do some TED titles start with a country and a category?** That's TED's own English title format:
`Country – CPV category – title`. `title_original` has the title in the notice's language.

**Why is SAM.gov missing when I filter by CPV code?** SAM.gov classifies with NAICS and PSC codes, not CPV. Add
`naicsCodes` to include it.

**What does `notice_category` mean?** `tender`: an open opportunity you can bid on. `planning`: prior information,
presolicitation or sources sought. `award`: who won and for how much. `modification`: a change or correction.
`cancellation`: cancelled.

**Is this affiliated with SAM.gov, the EU or the UK government?** No. It reads data these portals publish openly.

### Related scrapers

- [Company Hiring Signals](https://apify.com/artsiom_k/company-hiring-signals) — which companies are hiring fastest, from their own career sites.
- [Career Site Jobs Scraper](https://apify.com/artsiom_k/career-site-jobs-scraper) — jobs straight from company career sites (Greenhouse, Lever, Workday and more).
- [USAJOBS Scraper](https://apify.com/artsiom_k/usajobs-scraper) — every US federal job posting with salary, grade and agency.
- [Agency Directory Scraper](https://apify.com/artsiom_k/agency-directory-scraper) — B2B agency leads from Clutch, Sortlist and GoodFirms.

# Actor input Schema

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

Which procurement portals to search. Empty = all four.

## `noticeTypes` (type: `array`):

"tender" = open opportunities you can bid on. "planning" = prior information and sources sought. "award" = contract awards with the winner and value. Empty = every type.

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

Only notices matching any of these keywords or phrases (e.g. "cybersecurity", "road maintenance"). SAM.gov and TED search the full text; UK notices are matched on title and description.

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

Two-letter country codes (DE, FR, PL, US, GB...). US = SAM.gov, GB = the UK sources, others = TED. Empty = all.

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

EU/UK sources: CPV codes; each also matches everything under it (72000000 or 72 = all IT services). Setting only CPV codes leaves out SAM.gov, which uses NAICS.

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

SAM.gov: NAICS codes or prefixes (541511, or 5415 for all computer systems design). Setting only NAICS codes leaves out TED and the UK sources, which use CPV.

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

Only notices with an estimated or awarded value of at least this amount, in the notice's own currency. Notices without a value are left out when this is set.

## `lookbackDays` (type: `integer`):

Notices published or updated in the last N days (today included). Ignored when Date from is set.

## `dateFrom` (type: `string`):

Notices published or updated on or after this date. Up to 366 days per run.

## `dateTo` (type: `string`):

Notices published or updated on or before this date. Default: today.

## `includeDetails` (type: `boolean`):

SAM.gov: also fetch each notice's NAICS code, set-aside, contacts, place of performance, award and attachment links (two extra requests per notice).

## `maxItems` (type: `integer`):

Stop after pushing this many notices. Defaults to 50 - a fast, cheap preview with some from each source. Set to null for everything in your selection.

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

"incremental" returns only notices that are new or changed (deadline, status, value, title) since earlier runs of the same selection; notices are remembered for 90 days. "auto" is incremental when Max results is cleared and an earlier run exists.

## `concurrency` (type: `integer`):

Requests in flight at once (SAM.gov details).

## `impersonate` (type: `string`):

Browser TLS fingerprint. Change only if requests are blocked.

## `proxyConfiguration` (type: `object`):

Apify Proxy settings. Not needed: all four sources are open.

## Actor input object example

```json
{
  "sources": [
    "sam_gov",
    "ted",
    "uk_find_a_tender",
    "uk_contracts_finder"
  ],
  "noticeTypes": [
    "tender"
  ],
  "lookbackDays": 3,
  "includeDetails": true,
  "maxItems": 50,
  "mode": "auto",
  "concurrency": 8,
  "impersonate": "chrome",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

No description

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("artsiom_k/government-tenders-scraper").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("artsiom_k/government-tenders-scraper").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 '{}' |
apify call artsiom_k/government-tenders-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,artsiom_k/government-tenders-scraper"
        }
    }
}
```

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/TktArima17cFbRrOo/builds/MLOW3ebtfLkY7eiEA/openapi.json
