# Government Tenders & AI Bid Matcher: EU TED, UK, SAM.gov, UN (`qlufiq/tender-finder-ai`) Actor

Find open government tenders and RFPs from 8 official sources (EU TED, SAM.gov, UK Contracts Finder & Find a Tender, CanadaBuys, AusTender, World Bank, UNDP) in one schema. AI scores every tender against your company profile: bid, maybe or skip.

- **URL**: https://apify.com/qlufiq/tender-finder-ai.md
- **Developed by:** [lufi aq](https://apify.com/qlufiq) (community)
- **Categories:** Lead generation, Business, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 tenders

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

## Government Tenders & AI Bid Matcher: EU TED, UK, SAM.gov, UN

Find open government tenders from **eight official procurement APIs and feeds** in one run and one schema, then let AI tell you **which ones are worth bidding on** for *your* company.

| Source | Coverage | Key needed |
|---|---|---|
| **EU TED** (Tenders Electronic Daily) | All EU/EEA above-threshold tenders + European partner countries | No |
| **UK Contracts Finder** | UK public sector (incl. lower-value contracts) | No |
| **UK Find a Tender** | UK above-threshold tenders | No |
| **World Bank** procurement notices | World Bank–financed projects in ~100 developing countries | No |
| **SAM.gov** | US federal contract opportunities | No (built in; optional own key) |
| **CanadaBuys** open tender notices | Canadian federal government (and agencies publishing on CanadaBuys) | No |
| **AusTender** current approaches to market | Australian Government | No |
| **UNDP** procurement notices | UN Development Programme country offices in 100+ countries | No |

### Use cases

- **Bid managers and consultancies:** a daily or weekly shortlist of tenders that fit your services, with the reasons and risks already written.
- **SMEs entering the public sector:** find relevant contracts abroad (EU, UK, US, Canada, Australia, World Bank, UN) without learning eight portals.
- **Tender alert and lead generation services:** one normalized feed for your own customers.
- **Market research:** see who is buying what, where, and when.

### Quick start

1. Click **Start** with the prefilled input (a cybersecurity company profile, 25 tenders, 10 scored by AI). A run takes under a minute and costs about $0.28.
2. Write your own `companyProfile` (what you sell, where you deliver, size, certifications) and `keywords` or CPV/NAICS codes.
3. Schedule it daily with `publishedWithinDays: 1` to get only new tenders.

### What you get

For every tender:

- **title, buyer, country, estimated value + currency, deadline, published date, notice URL**
- **CPV** codes (EU/UK) or **NAICS** + set-aside (US), notice type, procedure
- **AI fit score (0–100)**, a **bid / maybe / skip** verdict, a one-sentence **summary in English** (even when the notice is in German, Czech, Polish…), the **reasons** for the score and the **risks** (eligibility, location, size, deadline)

Results are sorted with the best matches first. A run summary (`SUMMARY` in the key-value store) shows how many tenders came from each source, which sources were skipped or failed and why, and the top 10 matches.

### Why this Actor

- **One schema for the EU, UK, US, Canada, Australia, the World Bank and the UN.** No more eight different portals and formats.
- **AI bid qualification, not just keyword hits.** Full-text search returns lots of noise. The AI reads each notice against your company profile and explains its verdict.
- **Official APIs only.** No scraping of web pages, so runs are fast and stable: fetching all sources takes under a minute, and AI scoring adds about 2 seconds per tender.
- **Built for scheduling.** Use `publishedWithinDays` (e.g. 1 or 7) with an Apify schedule to get a daily or weekly feed of new, scored opportunities.

### Example output

```json
{
  "title": "Germany – IT services: consulting, software development, Internet and support – Vergabe von Dienstleistungen für Hosting, Betrieb und Content-Erstellung des Internetportals www.Ihre-Vorsorge.de",
  "buyer": "Deutsche Rentenversicherung Rheinland",
  "country": "DE",
  "value": null,
  "currency": null,
  "publishedAt": "2026-10-16",
  "deadline": "2026-10-22T23:59:59.000Z",
  "url": "https://ted.europa.eu/en/notice/-/detail/718446-2026",
  "cpv": ["72000000"],
  "source": "ted",
  "ai": {
    "score": 72,
    "verdict": "bid",
    "summary": "Deutsche Rentenversicherung Rheinland seeks hosting, operation, and content creation services for its Ihre-Vorsorge.de internet portal.",
    "reasons": [
      "Hosting and IT operations align with the company’s cloud and operations services.",
      "The buyer is a German public authority, matching the company’s public-sector experience in DACH."
    ],
    "risks": ["Content creation may require editorial expertise not stated in the company profile."],
    "model": "gpt-6-luna"
  }
}
```

### Input

| Field | Description |
|---|---|
| `companyProfile` | What you sell, where you deliver, size, certifications, typical contract size. Empty = search only, no AI. |
| `keywords` | Any of these words (full-text on TED and World Bank, title on SAM.gov, title/description on UK portals, CanadaBuys, AusTender and UNDP). |
| `cpvCodes` | EU/UK CPV codes, hierarchical: `72000000` matches all IT services. |
| `naicsCodes` | US NAICS codes for SAM.gov, e.g. `541512`. |
| `countries` | ISO-2 codes (`DE`, `GB`, `US`, `KE`…). Sources that can't serve them are skipped. |
| `sources` | Any of `ted`, `uk_cf`, `uk_fts`, `worldbank`, `samgov`, `canadabuys`, `austender`, `undp`. |
| `publishedWithinDays` / `publishedFrom` / `publishedTo` | Date range (default: last 14 days). |
| `onlyOpen` | Drop tenders whose deadline has passed (default on). |
| `minValue` + `currency` (+ `requireValue`) | Minimum estimated value. |
| `maxTenders`, `maxAiMatches`, `minScore` | Output size, how many tenders the AI scores, minimum score to keep. |
| `language` | Preferred language for TED texts and CanadaBuys (`en`/`fr`), falling back to English. |
| `samGovApiKey` | Optional: your own SAM.gov key (sam.gov → Account Details → Public API Key) instead of the built-in one. |

### Pricing (pay per event)

| Event | Price |
|---|---|
| Tender delivered (`tender-fetched`) | $0.003 |
| Tender scored by AI (`tender-ai-matched`) | $0.02 |

Example: 100 tenders with the 50 newest AI-scored = $0.30 + $1.00 = **$1.30**. Failed AI matches are not charged. The run stops before exceeding your maximum charge per run: tenders are reserved first, then AI matches until the limit.

### Good to know

- **World Bank** notices publish no contract value, and regional projects (e.g. "Western Balkans") have no single country. Filters by country or minimum value treat them accordingly.
- **CanadaBuys, AusTender and UNDP** publish no contract value. CanadaBuys closing times are Eastern time. The AusTender feed has no buyer agency or close date (open the notice link for those); UNDP notices list a close date only and often a short title, mostly in the local language (English, French or Spanish).
- **Values** in other currencies are compared to `minValue` using approximate static exchange rates. They are for filtering only.
- **SAM.gov** works out of the box with a built-in key, which is rotated every 90 days. Add your own key only if you want to use your own SAM.gov quota.
- **CPV filters** apply to TED and the UK portals; **NAICS** applies to SAM.gov. World Bank, CanadaBuys, AusTender and UNDP have neither, so use keywords there.
- **TED titles** are "Country – CPV category – original title". The original title stays in the buyer's language; the AI summary is always English.
- The **AI score is a qualification aid**, not legal or bid advice. Always read the tender documents before deciding.

### More Actors by the same developer

- [AI Visibility Tracker](https://apify.com/qlufiq/ai-answer-visibility-tracker): does ChatGPT search, Grok and DeepSeek mention and cite your brand?
- [Google Trends API & Scraper + AI Trend Insights](https://apify.com/qlufiq/google-trends-ai-insights): interest over time, regions, related queries and trending searches with AI summaries.

# Actor input Schema

## `companyProfile` (type: `string`):

Describe what your company sells, where it can deliver, its size, certifications and typical contract size. The AI scores every tender against this text. Leave empty to only search tenders (no AI matching, cheaper).

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

Tender must mention at least one keyword (full-text search on TED and World Bank, title search on SAM.gov, title/description filter on the UK portals, CanadaBuys, AusTender and UNDP). Leave empty for all tenders.

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

Common Procurement Vocabulary codes. Matched hierarchically: 48000000 matches all software packages (48730000 etc.). Applies to TED and UK portals.

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

NAICS codes for SAM.gov, e.g. 541512 (computer systems design).

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

ISO 2-letter country codes of the buyer or project, e.g. DE, FR, GB, US, KE. Empty means all countries. Sources that cannot cover the selected countries are skipped.

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

Official APIs and feeds to search. SAM.gov uses a built-in API key (you can supply your own below). CanadaBuys and AusTender only cover their own country.

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

Only tenders published in the last N days. Ideal for scheduled runs. Ignored when 'Published from' is set.

## `publishedFrom` (type: `string`):

Optional fixed start date (YYYY-MM-DD).

## `publishedTo` (type: `string`):

Optional fixed end date (YYYY-MM-DD). Defaults to today.

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

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

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

Drop tenders with a published estimated value below this amount. Values in other currencies are compared with approximate static exchange rates. Tenders without a value are kept unless 'Require value' is on.

## `currency` (type: `string`):

Currency of the minimum value.

## `requireValue` (type: `boolean`):

With a minimum value set, also drop tenders that publish no value.

## `maxTenders` (type: `integer`):

Maximum tenders in the output. Sources are interleaved so each gets a fair share.

## `aiMatch` (type: `boolean`):

Score each tender against the company profile with AI (charged per matched tender).

## `maxAiMatches` (type: `integer`):

Maximum tenders scored by AI per run (newest first). Remaining tenders are returned without a score.

## `minScore` (type: `integer`):

Only output AI-scored tenders with at least this score (0-100). Unscored tenders are still returned.

## `language` (type: `string`):

Preferred language for TED titles and texts (falls back to English). AI summaries are always in English.

## `samGovApiKey` (type: `string`):

Optional: use your own SAM.gov key instead of the built-in one (sam.gov → sign in → Account Details → Public API Key).

## Actor input object example

```json
{
  "companyProfile": "Cybersecurity integrator with 40 staff based in Czechia. We supply, implement and run SIEM and SOC solutions (Splunk, Elastic), penetration testing and security training for public sector clients across the EU. Typical contract EUR 100k-2M. ISO 27001 certified.",
  "keywords": [
    "SIEM",
    "cybersecurity",
    "security operations"
  ],
  "cpvCodes": [],
  "naicsCodes": [],
  "countries": [],
  "sources": [
    "ted",
    "uk_cf",
    "uk_fts",
    "worldbank",
    "samgov",
    "canadabuys",
    "austender",
    "undp"
  ],
  "publishedWithinDays": 14,
  "onlyOpen": true,
  "currency": "EUR",
  "requireValue": false,
  "maxTenders": 25,
  "aiMatch": true,
  "maxAiMatches": 10,
  "language": "en"
}
```

# Actor output Schema

## `overview` (type: `string`):

One row per tender, best AI matches first: title, buyer, country, value, deadline, AI score, verdict and summary.

## `details` (type: `string`):

Description, CPV/NAICS codes, procedure, AI reasons and risks for every tender.

## `summary` (type: `string`):

Tenders per source (including skipped or failed sources), AI verdict counts and the top 10 matches.

# 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 = {
    "companyProfile": "Cybersecurity integrator with 40 staff based in Czechia. We supply, implement and run SIEM and SOC solutions (Splunk, Elastic), penetration testing and security training for public sector clients across the EU. Typical contract EUR 100k-2M. ISO 27001 certified.",
    "keywords": [
        "SIEM",
        "cybersecurity",
        "security operations"
    ],
    "countries": [],
    "maxTenders": 25,
    "maxAiMatches": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("qlufiq/tender-finder-ai").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 = {
    "companyProfile": "Cybersecurity integrator with 40 staff based in Czechia. We supply, implement and run SIEM and SOC solutions (Splunk, Elastic), penetration testing and security training for public sector clients across the EU. Typical contract EUR 100k-2M. ISO 27001 certified.",
    "keywords": [
        "SIEM",
        "cybersecurity",
        "security operations",
    ],
    "countries": [],
    "maxTenders": 25,
    "maxAiMatches": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("qlufiq/tender-finder-ai").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 '{
  "companyProfile": "Cybersecurity integrator with 40 staff based in Czechia. We supply, implement and run SIEM and SOC solutions (Splunk, Elastic), penetration testing and security training for public sector clients across the EU. Typical contract EUR 100k-2M. ISO 27001 certified.",
  "keywords": [
    "SIEM",
    "cybersecurity",
    "security operations"
  ],
  "countries": [],
  "maxTenders": 25,
  "maxAiMatches": 10
}' |
apify call qlufiq/tender-finder-ai --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,qlufiq/tender-finder-ai"
        }
    }
}
```

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/fi4OTLHd9Wzdo4kUC/builds/lLZpnqRgSyi5qkViE/openapi.json
