# Public Tenders & Procurement: EU TED, UK, US SAM.gov (`postatelier/public-tenders-feed`) Actor

Public procurement tenders, RFPs and contract awards from EU TED, UK Find a Tender, UK Contracts Finder and US SAM.gov in one feed. Filter by keyword, CPV or NAICS code, country and value. Monitoring mode returns only new notices.

- **URL**: https://apify.com/postatelier/public-tenders-feed.md
- **Developed by:** [Post Atelier](https://apify.com/postatelier) (community)
- **Categories:** Lead generation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$3.00 / 1,000 notice returneds

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

### What does Public Tenders & Procurement do?

It collects **public tenders, RFPs and contract awards** from TED (EU tenders), UK Find a Tender, Contracts Finder and SAM.gov, and returns them in one normalised format:

| Region | Source | What you get |
|---|---|---|
| 🇪🇺 EU + EEA | **TED** (Tenders Electronic Daily, the EU's official journal for public procurement) | Contract notices, prior information notices, award notices from every EU member state and more |
| 🇬🇧 UK | **Find a Tender** | Above-threshold UK public procurement notices |
| 🇬🇧 UK | **Contracts Finder** | UK public sector contracts, including lower-value ones |
| 🇺🇸 US | **SAM.gov** contract opportunities | Federal solicitations, pre-solicitations, sources sought, awards |

Filter by **keywords**, **CPV codes** (EU/UK) or **NAICS codes** (US), **country**, **notice type** and **minimum value**, and keep only tenders that are still open. Turn on **Only new notices** and schedule it daily to get a feed of fresh tenders in your field.

### What you get

A real run with `"keywords": ["software"]` over the last 3 days returned, among others:

| Title | Buyer | Country | Value | Deadline | Source |
|---|---|---|---|---|---|
| Website redesign and redevelopment | Capital City College | GB | – | 2026-10-27 | Find a Tender |
| Connected Business Platforms Systems Integrator Service Provision | UK Hydrographic Office | GB | £5,000,000 | – | Find a Tender |
| Lithuania – Software programming and consultancy services | VĮ Registrų centras | LT | €364,800 | 2026-11-16 | TED |
| Germany – IT services: consulting, software development | TenneT TSO GmbH | DE | €7,200,000 | – | TED |
| Sweden – IT services: consulting, software development | Arbetsförmedlingen | SE | SEK 600,000,000 | 2026-11-12 | TED |
| Bulgaria – Software package and information systems | ИНФОРМАЦИОННО ОБСЛУЖВАНЕ АД | BG | €817,740 | 2026-11-18 | TED |

Each row is a full JSON record with CPV/NAICS codes, description, notice type, publication date and a link to the official notice (see the output example below). Results download as JSON, CSV or Excel, or go straight to Sheets, Slack or your CRM.

### Run it on a schedule: Slack, e-mail, Google Sheets or a webhook

Set it up once and get new tenders in your field automatically:

1. **Save a task.** Fill in the input (or paste the JSON below in the JSON editor) and click **Save as a new task**.
   ```json
   { "cpvCodes": ["72", "48"], "countries": ["DE", "FR", "GB"], "publishedWithinDays": 2, "openOnly": true, "onlyNew": true, "monitorName": "it-tenders" }
   ```
2. **Schedule it daily.** Open **Schedules** in the left menu of the Apify Console, create a schedule, pick the time and add your task. Each run then returns only notices that earlier runs haven't, so you pay only for new ones.
3. **Send the results somewhere.** In the task's **Integrations** tab:
   - **Slack:** "Send notification via Slack" when a run succeeds.
   - **E-mail or Google Drive:** "Send results email via Gmail" attaches the rows; "Upload results to GDrive" saves them as a file.
   - **Google Sheets, CRM, n8n:** connect the task through Make, Zapier or n8n (listed under Automation platforms) and add a row per result.
   - **Webhook:** add an HTTP webhook for the event **Run succeeded** with your URL. The payload includes `resource.defaultDatasetId`; fetch the rows from `https://api.apify.com/v2/datasets/<defaultDatasetId>/items`.

### Who uses it

- **Bid and proposal teams** that want every new tender in their category, across borders, in one place.
- **Sales teams** selling to the public sector: who is buying what, from which budget, by when.
- **Market research:** award notices show who won which contract and for how much.
- **AI agents and newsletters** that summarise new tenders in a niche.

### How to use it

```json
{
  "keywords": ["software", "cloud"],
  "cpvCodes": ["72"],
  "countries": ["DE", "AT", "GB"],
  "publishedWithinDays": 7,
  "openOnly": true
}
```

- CPV and NAICS codes work as prefixes: `72` matches every IT-services code, and `5415` every NAICS computer-systems code.
- **SAM.gov is off in the example input.** Add `us-sam` to `sources` (or leave `sources` empty) for US federal notices.
- Countries are ISO codes for the buyer's country. Sources that can't match are skipped automatically, so `["DE"]` only queries TED.
- **Daily feed:** add `"onlyNew": true, "monitorName": "it-tenders"`, save as a task and schedule it. Each run returns only notices you haven't seen, and you only pay for those.

### Output example

A real record from a run (description shortened):

```json
{
  "title": "Printable Patient Identification Wristbands and Associated Accessories 2027",
  "source": "uk-fts",
  "noticeId": "097361-2026",
  "procurementId": "ocds-h6vhtk-0521ca",
  "kind": "tender",
  "noticeType": "tenderUpdate",
  "buyer": { "name": "SUPPLY CHAIN COORDINATION LIMITED", "country": "GB" },
  "country": "GB",
  "description": "Opportunity\nNon-exclusive framework agreement for the supply of Laser and Thermal printable wristbands, Thermal Printers- (Direct Thermal Pr…",
  "cpvCodes": ["22455100", "30191140", "35123000", "35123400", "30233300"],
  "naicsCode": null,
  "estimatedValue": { "amount": 50000000, "currency": "GBP" },
  "publishedAt": "2026-10-15T11:17:07+01:00",
  "deadline": "2026-11-11T15:00:00+00:00",
  "placeOfPerformance": null,
  "setAside": null,
  "awardedTo": [],
  "url": "https://www.find-tender.service.gov.uk/Notice/097361-2026",
  "sourceInfo": {
    "registry": "Find a Tender Service (UK Cabinet Office)",
    "licence": "Open Government Licence v3.0",
    "attribution": "Contains public sector information licensed under the Open Government Licence v3.0 (Find a Tender)"
  },
  "query": "Find a Tender",
  "retrievedAt": "2026-10-16T16:25:35.643Z"
}
```

`kind` is normalised across sources:

- `tender`: open calls for bids and solicitations
- `planning`: prior information notices, pre-solicitations, sources sought
- `award`: contract awards
- `other`

**One notice per procurement.** A tender is often amended several times (new deadline, clarifications), and each amendment is its own notice. By default you get only the newest version of each procurement (per type: tender, award), linked by `procurementId` (the OCDS ID in the UK, TED's procedure ID, SAM.gov's solicitation number). In monitoring mode, later amendments of a tender you already have are skipped for free. Set `includeUpdates: true` to get every notice.

US notices also carry `naicsCode` and `setAside` (e.g. "Small Business Set Aside - Total"). TED titles and descriptions are in English when TED provides a translation, otherwise in the original language.

### Use it from code, Make, Zapier or an AI agent

```bash
curl -X POST "https://api.apify.com/v2/acts/postatelier~public-tenders-feed/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "keywords": ["software"], "countries": ["GB", "US"], "publishedWithinDays": 3 }'
```

It also works from Make, Zapier, n8n and Google Sheets through Apify's integrations. AI agents can call it as a tool through the [Apify MCP server](https://mcp.apify.com), with the Actor name `postatelier/public-tenders-feed`.

**Further reading:** [TED API in Python: daily IT tender alerts from the EU and UK](https://dev.to/postatelier/ted-api-in-python-daily-it-tender-alerts-from-the-eu-and-uk-2kbm), a step-by-step tutorial with a Slack digest.

### Pricing

Pay per event:

| Event | Price |
|---|---|
| Notice returned | **$0.003** ($3 per 1,000 notices) |

Filters are applied before charging. Notices skipped by monitoring are free.

**Examples:** 1,000 notices cost $3. A daily feed returning 40 new notices a day costs about $3.60 a month. Apify's free plan includes $5 of monthly credit, which covers about 1,600 notices.

### Data sources and licences

Every record carries `sourceInfo.licence` and `sourceInfo.attribution`.

- **TED:** © European Union, https://ted.europa.eu. Free re-use under Commission Decision 2011/833/EU, with attribution.
- **Find a Tender and Contracts Finder:** UK Cabinet Office, under the Open Government Licence v3.0.
- **SAM.gov:** the public Contract Opportunities data extract published by the U.S. General Services Administration. Awardee names on awards dated before 2022-04-04 are withheld to respect Dun & Bradstreet's terms on that data.

### Privacy

Notices name contact officials: names, e-mails and phone numbers.

- **Contact fields are never read.** Only the buyer organisation is kept.
- **Descriptions are scrubbed.** Any sentence that names or points to a contact ("Offers must be emailed to …", "Point of contact: …", "Ansprechpartner: …") is replaced with `[contact details removed]`, and stray e-mails and phone numbers are removed. This is pattern-based, so turn descriptions off if you need none at all.
- **Awarded suppliers** are listed only when the name carries a legal form or is a public body ("… Ltd", "… GmbH", "… Inc", "… University"). Other names, which could be sole traders, are dropped. Some small companies are dropped as a result.

### Good to know

- **Volume:** TED publishes about 3,000 notices a working day, so use filters. `maxResults` is split evenly across the selected sources, and any share a source doesn't use rolls over to TED and then SAM.gov.
- **Keywords** match at word starts in the title and description. For SAM.gov only the first 1,500 characters of the description count, to skip the standard clause boilerplate.
- **Times:** SAM.gov dates are as published (US Eastern, no offset).
- **Speed:** the Actor respects each source's limits. Contracts Finder allows 12 requests a minute, so broad UK runs over long periods take a while. The US extract is streamed and only the requested date window is read.
- **Coverage:** below-threshold national portals (e.g. Germany's Vergabeplattformen, Poland's e-Zamówienia) aren't included yet. Tell us which ones you need.

### Related Actors

- [European Company Registry Search](https://apify.com/postatelier/eu-company-registry): look up a buyer or supplier in official European registers, with VAT and LEI checks.
- [UK Companies House](https://apify.com/postatelier/uk-companies-house): company profiles, accounts dates and filings for UK suppliers.
- [Secretary of State Business Entity Search](https://apify.com/postatelier/us-business-entities): check US awardees in state registries.

### FAQ

**How fresh is it?** EU and UK notices are queried live. SAM.gov publishes its extract daily.

**Can I get the tender documents?** The `url` field links to the official notice page, where documents are linked or downloadable.

**Does a source outage break my run?** No. If one source is down, the others still return notices, and a free record with `status: "source_unavailable"` tells you which source is missing. Filter on `status` before importing results into a spreadsheet or CRM.

**Something broke?** Open an issue. A health check runs against every source daily, and we aim to fix problems within a day.

# Actor input Schema

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

Notices whose title or description contains any of these, e.g. software, cleaning services, solar. Leave empty for all.

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

Common Procurement Vocabulary codes or prefixes, e.g. 72000000 (IT services) or 72 for the whole division. Applies to TED and UK notices.

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

NAICS codes or prefixes for SAM.gov notices, e.g. 541511 or 5415.

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

ISO country codes of the buyer, e.g. DE, FR, PL, GB, US. Leave empty for all. Sources outside the listed countries are skipped.

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

Tender = open calls for bids. Planning = prior information, pre-solicitations, sources sought. Award = contract awards.

## `publishedWithinDays` (type: `integer`):

Only notices published in the last N days.

## `openOnly` (type: `boolean`):

Skip tenders whose submission deadline has passed. Tenders without a published deadline are kept.

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

In the notice's own currency. Notices without a published value are skipped when this is set.

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

Leave empty for all. The example input covers the EU and UK; add US: SAM.gov for US federal notices.

## `maxResults` (type: `integer`):

Upper limit for the run, shared fairly across sources.

## `includeDescription` (type: `boolean`):

Plain-text notice description. Contact e-mails and phone numbers are removed.

## `includeUpdates` (type: `boolean`):

Off (default): one notice per procurement and type, the newest version, so a tender and its amendments come back once (and in monitoring mode, later amendments of a tender you already have are skipped for free). On: every notice, including each amendment and award update.

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

Skip notices this monitor already returned in earlier runs. Schedule the Actor daily for a feed of new tenders. Skipped notices are free.

## `monitorName` (type: `string`):

Keeps separate memory per monitor, e.g. "it-tenders-dach".

## `selfCheck` (type: `boolean`):

Maintainer health check. Leave off.

## Actor input object example

```json
{
  "keywords": [
    "software"
  ],
  "noticeTypes": [
    "tender"
  ],
  "publishedWithinDays": 3,
  "openOnly": true,
  "sources": [
    "ted",
    "uk-fts",
    "uk-cf"
  ],
  "maxResults": 30,
  "includeDescription": true,
  "includeUpdates": false,
  "onlyNew": false,
  "monitorName": "default",
  "selfCheck": false
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "keywords": [
        "software"
    ],
    "publishedWithinDays": 3,
    "sources": [
        "ted",
        "uk-fts",
        "uk-cf"
    ],
    "maxResults": 30
};

// Run the Actor and wait for it to finish
const run = await client.actor("postatelier/public-tenders-feed").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 = {
    "keywords": ["software"],
    "publishedWithinDays": 3,
    "sources": [
        "ted",
        "uk-fts",
        "uk-cf",
    ],
    "maxResults": 30,
}

# Run the Actor and wait for it to finish
run = client.actor("postatelier/public-tenders-feed").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 '{
  "keywords": [
    "software"
  ],
  "publishedWithinDays": 3,
  "sources": [
    "ted",
    "uk-fts",
    "uk-cf"
  ],
  "maxResults": 30
}' |
apify call postatelier/public-tenders-feed --silent --output-dataset

```

## MCP server setup

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

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/2rSyce2dt9FnoEheF/builds/ROY4FRCZLpfUvfyVs/openapi.json
