# Tenders Radar — Public Tenders & Contract Awards (`tacps126/tenders-radar`) Actor

Public tenders and awards from 17 official portals in one schema: US SAM.gov and USAspending, EU TED and EU institutions, UK, France, Spain, Germany, India GeM, Brazil, Ukraine, Canada, Colombia, Australia, South Africa. Country, state, sector, value filters. From $4/1k.

- **URL**: https://apify.com/tacps126/tenders-radar.md
- **Developed by:** [Tapaswai Ashok Choudhary](https://apify.com/tacps126) (community)
- **Categories:** Lead generation, Automation
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.20 / 1,000 tenders

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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

## Tenders Radar — Public Tenders & Contract Awards

Public procurement notices from **official government portals of many countries in one clean schema**: open tenders you can bid on, contract awards (who won, for how much) and planned procurement. Filter by country, sector, CPV / UNSPSC code, value and keywords; schedule it for daily bid alerts.

**Built for** B2B sales and bid teams, contractors and consultancies, distributors, market researchers tracking public spending, and AI agents that find opportunities for their users.

### Coverage

| Country / region | Portal | Notices |
|---|---|---|
| 🇺🇸 United States | **USAspending.gov** | New federal contract awards: recipient, amount, agency, state, NAICS/PSC (choose notice type `award`) |
| 🇺🇸 United States | **SAM.gov** contract opportunities | Federal solicitations, sources sought, presolicitations and awards, with NAICS and PSC codes, set-asides and contracting officers |
| 🇪🇺 EU + EEA (27 + 3) | **TED** (Tenders Electronic Daily) | Every tender above the EU thresholds, all member states |
| 🇬🇧 United Kingdom | **Find a Tender**, **Contracts Finder** | Above- and below-threshold contracts |
| 🇫🇷 France | **BOAMP** | Tenders, amendments and awards |
| 🇩🇪 Germany | **service.bund.de** | Federal tenders |
| 🇪🇸 Spain | **Plataforma de Contratación del Sector Público** | Tenders, awards and cancellations, with CPV codes, budget and deadline |
| 🇳🇱 Netherlands | **TenderNed** | Tenders, awards, planned procurement |
| 🇨🇦 Canada | **CanadaBuys** | Open federal tenders |
| 🇮🇳 India | **GeM** (Government e-Marketplace) | Ongoing bids and reverse auctions of central and state buyers: items, quantity, ministry and department, start and end time, bid document |
| 🇧🇷 Brazil | **PNCP** (Portal Nacional de Contratações Públicas) | Every federal, state and municipal procurement by law: object, buyer, state and city, estimated value in BRL, proposal deadline, method |
| 🇨🇴 Colombia | **SECOP II** | Procurement processes |
| 🇦🇺 Australia | **AusTender** | Contract awards with supplier and value |
| 🇿🇦 South Africa | **eTenders** | Tenders and RFQs |
| 🇺🇦 Ukraine | **Prozorro** | Open tenders from every public buyer, with CPV codes, value, deadline and contact |
| 🇪🇺 EU institutions | **Funding & Tenders portal** | Calls for tenders of the Commission, EU agencies, Council and Parliament (choose `EU`) |

More countries are being added. For district-level Indian tenders, see India District Notices. Only official, public sources are used: no logins, no captchas.

### Why this Actor

- **One schema for every country.** `title`, `description`, `reference`, `buyer`, `status`, `noticeType`, `category` (works / goods / services), `classifications` (CPV, UNSPSC, NAICS, PSC), `value` (amount + currency), `publishedAt`, `deadline`, `suppliers`, `contacts`, `documents`, `url`.
- **Sectors in every language.** Each notice is tagged from its CPV, UNSPSC, NAICS or PSC codes plus terms in English, French, Spanish, Portuguese, German, Dutch and Italian: IT & tech, construction, health, energy, transport, defence, environment, education, finance and more.
- **Only what you can bid on.** By default you get open tenders whose deadline hasn't passed; switch on awards to see who wins what.
- **Daily bid alerts.** Turn on *Only new notices* and schedule it: each run returns only what earlier runs didn't deliver. Send it to Slack, Google Sheets, a webhook or an RSS reader.
- **For AI agents.** Callable as an MCP tool.

### How to use it

1. Pick **sectors** and/or **countries** (`EU` = every EU/EEA country) and, if you like, **states or regions** (searchable list, or type `Texas`, `Maharashtra`, `Bavaria`), or type **keywords**.
2. Optionally add **CPV / UNSPSC codes**, a **minimum value**, or **notice types** (awards, planning).
3. Press **Start**. For alerts, turn on **Only new notices** and add a daily schedule.

```json
{
  "sectors": ["tech"],
  "countries": ["EU", "GB", "CA"],
  "minValue": 100000,
  "postedWithinDays": 3,
  "onlyNew": true
}
```

**Keywords match literally**, so add translations for non-English portals (`software`, `logiciel`, `Software`), or rely on sectors and codes, which work in every language.

### Output

| Field | Description |
|---|---|
| `title`, `description`, `reference` | As published; `reference` is the buyer's own number |
| `buyer` | `{name, id, city, region, country}`; for SAM.gov the name is department / agency / office |
| `contacts` | The buyer's published contact points `{name, email, phone}` |
| `country`, `subdivision` | ISO code of the buyer's country; ISO 3166-2 state or region where the work is or the buyer sits (`US-TX`), when known |
| `status` | `open`, `closed`, `awarded`, `planned`, `cancelled`, `unknown` |
| `noticeType` | `tender`, `award`, `planning`, `amendment`, `cancellation` |
| `category`, `procedure` | Works / goods / services; procedure as published (for SAM.gov, the set-aside, e.g. *Total Small Business Set-Aside*) |
| `classifications`, `sectors` | CPV / UNSPSC / NAICS / PSC codes and the sectors they map to |
| `value` | `{amount, currency}` (estimated value, or the awarded amount) |
| `publishedAt`, `deadline`, `awardDate` | RFC 3339 |
| `suppliers` | Winners, for awards |
| `documents`, `url` | Notice documents and the official notice page |

### AI insights (optional)

Turn on **AI insights** and an AI reads each notice for you: a two-sentence summary in your language, what is being bought, who may bid, the deadline and value as written, and what to do next. Describe your company in **Your profile** and every insight also gets a **fit score** (0-100) with the reason, so the best matches rise to the top. Choose "Apify (no key)" and the model's cost goes to your Apify account, or use your own Anthropic, OpenAI, Gemini or other key.

### Pricing

**$4 per 1,000 notices** plus a small start fee per run. AI insights, when you turn them on, are $0.01 each (from 24 November 2026; free until then) plus the model's own cost. Notices that don't match your filters, duplicates and (with *Only new notices*) already-delivered notices are free.

### Need something bigger?

More countries, regional or municipal portals, full tender documents, a private self-hosted deployment or a feed for your sector: **contact tacps126@gmail.com**. Custom and standalone setups are available.

### Good to know

Values are in each notice's own currency (no conversion yet). SAM.gov is read from its public daily extract (no key), so US notices appear the morning after they are posted. Notices are copied as published and always link to the official notice; check the portal before bidding.

# Actor input Schema

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

Words or phrases matched on title and description (whole words). They match literally, so add translations for non-English portals (e.g. software, logiciel, Software), or use sectors and codes, which work in every language.

## `sectors` (type: `array`):

Only tenders in these sectors, from their CPV / UNSPSC codes and words in several languages.

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

ISO codes or names: CA, GB, FR, DE, ES, NL, CO, AU, ZA, or EU for every EU/EEA country on TED. Leave empty for all.

## `states` (type: `array`):

Only notices for these states, provinces or regions: where the work is done or the buyer sits. Pick from the list or type a name or ISO code (Kerala, Texas, IN-MH, Bavaria); names are checked and misspellings get a suggestion. Notices whose region can't be told are left out when states are chosen.

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

Which kinds of notice to return. Default: tenders you can still bid on.

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

For tenders, keep only those whose deadline hasn't passed (or isn't published).

## `codes` (type: `array`):

Code prefixes, e.g. 72 (IT services, CPV), 45 (construction, CPV), 4321 (computers, UNSPSC), 5415 (IT services, US NAICS), DA (IT services, US PSC).

## `minValue` (type: `number`):

Only tenders with an estimated value at least this much, in the notice's own currency.

## `maxValue` (type: `number`):

Leave out tenders worth more than this, in the notice's own currency.

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

Only notices published in the last N days.

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

Pick specific portals instead of countries.

## `excludeKeywords` (type: `array`):

Leave out notices whose title or description contains any of these.

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

Most notices kept from each portal (after filters).

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

Most notices returned by the run.

## `aiInsights` (type: `boolean`):

Add an `insight` to each notice: a plain-language summary, key points, what to do and by when, and more. With a profile, also a 0-100 fit score and its reason.

## `aiProfile` (type: `string`):

What your organisation does and looks for, e.g. "We build and maintain cloud data platforms for public bodies in Germany and Austria; contracts above €100k". Each insight then scores how well the notice fits.

## `aiLanguage` (type: `string`):

Insights are written in this language, whatever the source language.

## `maxInsights` (type: `integer`):

Insights are added to the first N notices (most relevant first); the rest are delivered without one.

## `aiProvider` (type: `string`):

Which AI does the analysis. Apify needs no key: the model runs through Apify's OpenRouter proxy and is billed to your Apify account. Any other provider uses your own key and bills you there.

## `aiApiKey` (type: `string`):

Your own key for the provider above (not needed for Apify). Sent only to that provider, never stored.

## `aiModel` (type: `string`):

Model name. Apify: an OpenRouter id like anthropic/claude-sonnet-… or google/gemini-… (default: the newest Claude Haiku listed, a light model since it runs once per result). Anthropic: default claude-opus-5-5. Others: required.

## `aiBaseUrl` (type: `string`):

Only for "Other OpenAI-compatible API", e.g. http://localhost:11434/v1 for Ollama.

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

Schedule the Actor (daily) and each run returns only notices earlier runs didn't deliver: a bid-alert feed you pay for only when something new appears.

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

Optional name for the “only new” history, so several monitors can run side by side.

## `delivery` (type: `object`):

Webhook: {"webhookUrl": "https://…", "format": "json" | "slack" | "discord", "onlyWhenResults": true, "includeItems": 10}. Google Sheets: {"spreadsheetId": "<id from the sheet URL>", "sheetName": "Sheet1"} plus the service account key below; share the sheet with the service account's e-mail first. Leave empty to only save results in the dataset.

## `googleServiceAccountJson` (type: `string`):

Only for Google Sheets delivery: paste the service account's JSON key. Stored encrypted; the account sees only sheets you share with it.

## `tenantId` (type: `string`):

Optional label used to keep separate histories for different clients or teams.

## `debug` (type: `boolean`):

Save extra diagnostics with the run (for support requests).

## Actor input object example

```json
{
  "keywords": [
    "software"
  ],
  "noticeTypes": [
    "tender"
  ],
  "openOnly": true,
  "postedWithinDays": 3,
  "maxItemsPerSource": 200,
  "maxItems": 500,
  "aiInsights": false,
  "aiLanguage": "English",
  "maxInsights": 25,
  "aiProvider": "apify",
  "onlyNew": false,
  "debug": false
}
```

# Actor output Schema

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

The produced items (default dataset items).

# 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"
    ]
};

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

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

```

## MCP server setup

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

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/yNl9aykvq7aS0FVie/builds/uPj7hzSzW7EVhKnyN/openapi.json
