# Global Tenders Scraper - EU TED, UK & World Bank Procurement (`scrapesage/global-tenders-scraper`) Actor

Scrape government & public procurement tenders worldwide — EU TED, UK Find a Tender and World Bank in one run. Buyer contacts, contract awards (who won), CPV codes, values, deadlines, B2G/B2B leads, lead scoring & only-new monitoring. Keyless, no browser.

- **URL**: https://apify.com/scrapesage/global-tenders-scraper.md
- **Developed by:** [Scrape Sage](https://apify.com/scrapesage) (community)
- **Categories:** Lead generation, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $8.00 / 1,000 tender scrapeds

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Global Tenders Scraper — EU TED, UK & World Bank Public Procurement + Leads

Scrape **government and public-procurement tenders worldwide from one actor** — the **EU's TED (Tenders Electronic Daily)**, the **UK Find a Tender Service**, and the **World Bank** (100+ countries) — in a single run with one unified schema. Get **open bid opportunities and contract awards (who won, for how much)**, full **buyer contact details**, CPV sectors, estimated values, submission deadlines, and turn every contracting authority or winning supplier into a **ready-to-use B2G/B2B lead** with a lead score.

No login, no API key, no browser — fast JSON extraction straight from official government and multilateral procurement APIs.

### Why this tenders scraper?

Every other procurement scraper covers **one** source — TED only, or UK only, or World Bank only — and stops at the raw notice. This actor **consolidates all three into one normalized dataset** and adds the lead-generation and intelligence layer that buyers, bidders and sales teams actually need:

| Capability | Single-source scrapers | This actor |
|---|---|---|
| EU TED (27 countries + EEA) | partial | ✅ |
| UK Find a Tender (post-Brexit) | partial | ✅ |
| World Bank (100+ countries) | partial | ✅ |
| **One unified schema across all sources** | ❌ | ✅ |
| Open tenders **and** contract awards (who won) | rarely both | ✅ |
| Buyer contact — email, phone, website, address | ❌ | ✅ |
| CPV code **+ human sector label** | code only | ✅ |
| Submission deadline + days-left + open/closed flag | ❌ | ✅ |
| Deduplicated **buyer leads (B2G)** with lead score | ❌ | ✅ opt-in |
| Deduplicated **winning-supplier leads** + total won | ❌ | ✅ opt-in |
| Only-new **monitoring** for scheduled runs | ❌ | ✅ |

### Use cases

- **Win public contracts** — find live tenders by country, sector (CPV) and value, filter to open deadlines, and bid before your competitors. Monitor your sectors daily for new opportunities.
- **B2G lead generation** — sell *into* the public sector: every contracting authority becomes a lead with email, phone, website, address, how many tenders they run and their biggest contract (`extractBuyerLeads`).
- **Competitor & market intelligence** — pull contract awards to see who's winning what, for how much, and from which buyers (`mode: "awards"`, `extractSupplierLeads`).
- **Partner & subcontractor prospecting** — identify the suppliers winning awards in your space and reach out to team up.
- **Procurement dashboards & CRMs** — pipe clean, normalized procurement data into Power BI, Tableau, HubSpot or Salesforce via the Apify integrations below.
- **Bid/no-bid analytics** — track values, procedure types, single-bidder rates and deadline pressure across markets.

### How to use

1. [Sign up for Apify](https://console.apify.com/sign-up) — the free plan is enough to try this actor.
2. Open the **Global Tenders Scraper**, choose your **sources**, **mode** and filters (keyword, country, CPV, value, dates), and click **Start**.
3. Watch tenders, awards and leads stream into the dataset table.
4. **Export** as JSON, CSV, Excel, XML, or RSS — or pull results programmatically via the [Apify API](https://docs.apify.com/api/v2).

### Input

```json
{
    "mode": "all",
    "sources": ["ted", "uk", "worldbank"],
    "query": "cloud software",
    "countries": ["DE", "FR", "GB", "KE"],
    "cpvCodes": ["72"],
    "publishedAfter": "2026-06-01",
    "onlyOpenDeadlines": true,
    "minValue": 100000,
    "extractBuyerLeads": true,
    "extractSupplierLeads": true,
    "maxResults": 500,
    "monitorMode": false
}
```

- **mode** — `tenders` (open opportunities), `awards` (who won), or `all`.
- **sources** — any of `ted` (EU 27 + EEA), `uk` (UK Find a Tender), `worldbank` (100+ countries).
- **query** — full-text keyword across title & description.
- **countries** — ISO codes (`DE`, `GB`, `KE`) or names (`Germany`, `Kenya`).
- **cpvCodes** — 2-digit sector (`72` = IT, `45` = construction, `33` = medical) or full 8-digit CPV.
- **publishedAfter / publishedBefore** — date filters for fresh notices.
- **onlyOpenDeadlines** — keep only tenders you can still bid on.
- **minValue** — minimum estimated/awarded value (in the notice's own currency; not converted).
- **extractBuyerLeads** *(default false)* — also emit one deduplicated buyer lead per contracting authority.
- **extractSupplierLeads** *(default false)* — also emit one deduplicated lead per winning supplier.
- **maxResults** — cap on tender/award records (split evenly across sources); leads are emitted in addition.
- **monitorMode** *(default false)* — only emit notices not seen in previous runs; pair with [Schedules](https://docs.apify.com/platform/schedules).

### Output

One record per **tender**, **award**, **buyerLead**, or **supplierLead**.

```json
{
    "type": "tender",
    "source": "TED (EU)",
    "sourceRegion": "European Union / EEA",
    "noticeId": "423565-2026",
    "title": "Germany – Software package and information systems – Digital time-tracking & staff-scheduling system",
    "description": "Procurement of an integrated digital time-tracking and workforce-scheduling system (PEP)…",
    "noticeType": "Contract notice",
    "procedureType": "Negotiated with prior call",
    "contractNature": "supplies",
    "buyerActivity": "education",
    "status": "Open",
    "cpvCodes": ["48000000", "72260000"],
    "cpvSectors": ["Software package & information systems", "IT services: consulting, software development, internet & support"],
    "buyer": {
        "name": "Stiftung Tierärztliche Hochschule Hannover",
        "country": "Germany",
        "countryCode": "DE",
        "town": "Hannover",
        "postalCode": "30559",
        "address": "Bünteweg 2",
        "email": "vergabe@tiho-hannover.de",
        "phone": "+49 511953-8114",
        "website": "https://www.tiho-hannover.de",
        "buyerProfileUrl": null
    },
    "country": "Germany",
    "publicationDate": "2026-06-18+02:00",
    "deadlineDate": "2026-07-14T09:00:00.000Z",
    "daysUntilDeadline": 26,
    "isOpen": true,
    "estimatedValue": null,
    "currency": "EUR",
    "totalValue": null,
    "award": null,
    "documentsUrl": ["https://ted.europa.eu/en/notice/-/detail/423565-2026"],
    "noticeUrl": "https://ted.europa.eu/en/notice/-/detail/423565-2026",
    "leadScore": 60,
    "scrapedAt": "2026-06-19T00:00:00.000Z"
}
```

A contract **award** adds an `award` object: `{ "winnerName": "SOFTEAM", "winnerCountry": "France", "winnerSize": "medium", "awardValue": 2800000, "currency": "EUR" }`.

A **buyerLead** promotes the buyer to the top level with `tenderCount`, `maxContractValue`, `sampleTitles`, `sampleNoticeUrls` and a `leadScore`. A **supplierLead** carries `supplierName`, `awardsWon`, `totalAwardValue` and `buyersWonFrom`.

### Automate & schedule

Run this actor on autopilot and pull results into your own stack:

- **[Apify API](https://docs.apify.com/api/v2)** — start runs, fetch datasets, and manage schedules over REST.
- **[apify-client for JavaScript](https://docs.apify.com/api/client/js/)** and **[apify-client for Python](https://docs.apify.com/api/client/python/)** — official SDKs.
- **[Schedules](https://docs.apify.com/platform/schedules)** — run it daily/hourly with `monitorMode` on to capture only newly published tenders and awards; perfect for bid alerts and lead pipelines.
- **[Webhooks](https://docs.apify.com/platform/integrations/webhooks)** — trigger downstream actions (CRM import, Slack alert, email sequence) the moment a run finishes.

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

const client = new ApifyClient({ token: 'MY_APIFY_TOKEN' });

const run = await client.actor('scrapesage/global-tenders-scraper').call({
    mode: 'tenders',
    sources: ['ted', 'uk', 'worldbank'],
    query: 'cyber security',
    countries: ['DE', 'GB'],
    onlyOpenDeadlines: true,
    extractBuyerLeads: true,
    maxResults: 500,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Got ${items.length} tenders & buyer leads`);
```

### Integrate with any app

Connect the dataset to 5,000+ apps — no code required:

- **[Make](https://docs.apify.com/platform/integrations/make)** — multi-step automation scenarios.
- **[Zapier](https://docs.apify.com/platform/integrations/zapier)** — push new buyer leads straight into your CRM.
- **[Slack](https://docs.apify.com/platform/integrations/slack)** — get notified when a monitored search finds new tenders.
- **[Google Drive / Sheets](https://docs.apify.com/platform/integrations/drive)** — auto-export every run to a spreadsheet.
- **[Airbyte](https://docs.apify.com/platform/integrations/airbyte)** — pipe results into your data warehouse.
- **[GitHub](https://docs.apify.com/platform/integrations/github)** — trigger runs from commits or releases.

### Use with AI assistants (MCP)

The output is clean, LLM-ready JSON. Call this actor from Claude, ChatGPT, or any agent framework through the **[Apify MCP server](https://docs.apify.com/platform/integrations/mcp)** — ask your assistant to "find open IT tenders in Germany over €100k and list the buyers' contact emails" and let it run this scraper for you.

### Agent-ready: autonomous payments (x402 & Skyfire)

This actor is **agent-ready** — AI agents can discover it, run it, and **pay for it autonomously**, with no Apify account and no human in the loop. It uses [pay-per-event](https://docs.apify.com/platform/actors/publishing/monetize/pay-per-event) pricing and [limited permissions](https://docs.apify.com/platform/actors/development/permissions), so it qualifies for Apify's agentic-payment standards:

- **[x402](https://docs.apify.com/platform/integrations/x402)** — an open, HTTP-native payment protocol. Agents pay per run in USDC on the Base network directly through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp) — no account, no API key.
- **[Skyfire](https://docs.apify.com/platform/integrations/skyfire)** — agent-to-service payments for fully autonomous AI-agent workflows.

Building an AI agent, MCP tool, or autonomous data pipeline? This scraper is ready to plug in and pay as it goes.

### More scrapers from scrapesage

Build a complete **public-sector & B2B intelligence stack**:

- **[SAM.gov Scraper](https://apify.com/scrapesage/sam-gov-scraper)** — US federal contract opportunities (the US sibling to this actor).
- **[USAspending Scraper](https://apify.com/scrapesage/usaspending-scraper)** — US federal awards, recipients & contractor leads.
- **[US Federal Grants Scraper](https://apify.com/scrapesage/us-federal-grants-scraper)** — Grants.gov, NIH & NSF funding opportunities.
- **[Companies House Scraper](https://apify.com/scrapesage/companies-house-scraper)** — verify UK buyers & suppliers (directors, PSCs, filings).
- **[French Company Scraper](https://apify.com/scrapesage/french-company-scraper)** — SIRENE firmographics, executives & B2B leads.
- **[US Business Formation Scraper](https://apify.com/scrapesage/us-business-formation-scraper)** — newly registered US companies as fresh B2B leads.
- **[SEC EDGAR Scraper](https://apify.com/scrapesage/sec-edgar-scraper)** — US public-company filings & financials.
- **[Website Contact Scraper](https://apify.com/scrapesage/website-contact-scraper)** — enrich any buyer or supplier domain with emails, phones & socials.

### Tips

- **Go deeper than the cap**: each source returns hundreds of thousands of notices. Split runs by `country`, `cpvCodes` or date window to exhaust a large market, and raise `maxResults`.
- **Fresh leads**: combine `publishedAfter` (or `monitorMode`) with `extractBuyerLeads` to build a daily pipeline of brand-new contracting authorities.
- **CPV cheat-sheet**: `72` IT services · `48` software · `45` construction · `33` medical · `79` business services · `71` engineering · `85` health · `80` education.
- **Awards = intel**: set `mode: "awards"` + `extractSupplierLeads` to map who dominates a sector and what they charge.
- **Proxies**: the default Apify proxy is plenty — these are clean public/government APIs.

### FAQ

**Which countries are covered?** TED covers the EU 27 plus EEA (Norway, Iceland, Liechtenstein) and more; UK Find a Tender covers the post-Brexit United Kingdom; the World Bank source covers donor-funded procurement across 100+ developing countries in Africa, Asia, Latin America and beyond.

**Do I need an API key or login?** No. All three sources are official, free, keyless APIs (EU TED v3, UK Find a Tender OCDS, World Bank procurement API). No browser, no cookies.

**What's the difference between tenders and awards?** A tender (contract notice) is a live opportunity you can bid on; an award (contract award notice) records who won and for how much — use it for competitor and pricing intelligence.

**How do I monitor for new tenders automatically?** Turn on `monitorMode` and create a [Schedule](https://docs.apify.com/platform/schedules) (e.g. daily). The actor remembers everything it has already returned and emits only new notices — and it runs *alongside* Apify's scheduler, never against it.

**Can I export to Google Sheets, CSV, or Excel?** Yes — one click in the dataset view, or automatically on every run via the [Google Drive integration](https://docs.apify.com/platform/integrations/drive).

**Where do the buyer emails come from?** Directly from the official procurement notices — contracting authorities publish their contact email, phone and address as part of the tender. This actor simply normalizes them across sources.

**Is scraping public procurement data legal?** This actor collects publicly available data from official government and multilateral procurement portals. You are responsible for using the data in compliance with applicable laws (e.g. GDPR/CCPA for personal data) and each source's terms.

**A value field is null — why?** Many tenders genuinely don't publish an estimated value until award (or at all), and the World Bank notices don't include contract values. Fields are `null` only when the source doesn't provide the data, never because the scraper skipped them.

### Need help?

Open an issue on the actor's **Issues** tab, or visit the [Apify help center](https://help.apify.com/). Feature requests are welcome — this actor is actively maintained.

# Actor input Schema

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

'Open tenders' = live opportunities you can still bid on (newest first). 'Contract awards' = who won, for how much (market & competitor intelligence). 'Both' returns tenders and awards together.

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

Which official procurement registries to pull from. TED = the EU 27 + EEA (Tenders Electronic Daily). UK = the UK Find a Tender Service (post-Brexit). World Bank = donor-funded tenders across 100+ developing countries. Combine any/all in one run.

## `query` (type: `string`):

Free-text search across title and description (e.g. 'cloud hosting', 'school construction', 'cyber security'). Applied as a full-text query on TED and matched client-side on UK & World Bank. Leave empty to rely on country / CPV filters or to pull everything newest-first.

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

Filter by buyer/project country. Accepts ISO codes (DE, FR, GB, KE) or names (Germany, Kenya). TED filters by buyer country; World Bank by project country; UK is included only when GB / United Kingdom is in the list (or the list is empty).

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

Filter by Common Procurement Vocabulary code. Use a 2-digit division for a whole sector (72 = IT services, 45 = construction, 33 = medical, 79 = business services) or a full 8-digit code. TED filters server-side; UK matches client-side. World Bank has no CPV and is skipped when this filter is set.

## `publishedAfter` (type: `string`):

Only notices published on/after this date — the key to fresh, high-intent opportunities. Example: 2026-06-01.

## `publishedBefore` (type: `string`):

Only notices published on/before this date (TED only).

## `onlyOpenDeadlines` (type: `boolean`):

Drop tenders whose submission deadline has already passed — keep only opportunities you can still bid on.

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

Keep only tenders/awards whose estimated or awarded value is at least this amount (in the notice's own currency — values are not converted). Notices that don't publish a value are kept.

## `extractBuyerLeads` (type: `boolean`):

Also output one deduplicated lead record per contracting authority (buyer) — name, email, phone, website, full address, how many tenders they ran, biggest contract value and a lead score. Ideal for selling INTO the public sector.

## `extractSupplierLeads` (type: `boolean`):

Also output one deduplicated lead record per winning supplier (from contract awards) — company, country, number of awards won, total awarded value and the buyers they won from. Ideal for competitor intel & partner prospecting.

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

Maximum number of tender/award records to emit (split evenly across the selected sources). Buyer/supplier leads are emitted in addition to this limit.

## `deduplicateResults` (type: `boolean`):

Emit each notice (by source + notice id) only once per run.

## `monitorMode` (type: `boolean`):

Remember notices returned in previous runs and emit ONLY new ones. Pair with Apify Schedules to capture freshly published tenders and awards automatically (daily/hourly). Works alongside — not instead of — the built-in scheduler.

## `monitorStoreName` (type: `string`):

Named key-value store holding the 'already seen' ids for monitoring mode. Use a different name per tracked scope (e.g. one per country or keyword).

## `maxConcurrency` (type: `integer`):

Maximum parallel API requests.

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

Proxy settings. The TED, UK and World Bank APIs are clean public/government endpoints, so the default Apify proxy is plenty.

## Actor input object example

```json
{
  "mode": "tenders",
  "sources": [
    "ted",
    "uk",
    "worldbank"
  ],
  "query": "cloud software",
  "countries": [],
  "cpvCodes": [],
  "onlyOpenDeadlines": false,
  "minValue": 0,
  "extractBuyerLeads": false,
  "extractSupplierLeads": false,
  "maxResults": 200,
  "deduplicateResults": true,
  "monitorMode": false,
  "monitorStoreName": "global-tenders-monitor",
  "maxConcurrency": 4,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All scraped records in the default dataset.

# 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 = {
    "query": "cloud software"
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapesage/global-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 = { "query": "cloud software" }

# Run the Actor and wait for it to finish
run = client.actor("scrapesage/global-tenders-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "query": "cloud software"
}' |
apify call scrapesage/global-tenders-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=scrapesage/global-tenders-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

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