# World Bank Tenders & Contract Awards Feed (daily alerts) (`moment-data/world-bank-tenders-feed`) Actor

New World Bank-financed tenders, consultant calls (EOIs) and contract awards from 140+ countries, from the official World Bank API. Filter by country, region, goods/works/consulting, keyword or value; get deadlines, estimates, winning companies and contract prices.

- **URL**: https://apify.com/moment-data/world-bank-tenders-feed.md
- **Developed by:** [Luke Miller](https://apify.com/moment-data) (community)
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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

## World Bank Tenders & Contract Awards Feed: New Bids, Consultant EOIs & Awards Daily

Get every new **World Bank-financed procurement notice** (invitations for bids, consultant requests for expressions of interest and contract awards across 140+ borrower countries) as clean JSON/CSV/Excel. Filter by **country, region, goods/works/consulting, keyword, international competition or estimated value**, and run it on a schedule with **"new since last run"** mode so you only get (and pay for) notices you have not seen.

Built on the **official World Bank procurement notices API**: no API key, no login, no scraping of web pages.

### Who it's for

- **Contractors, suppliers and consulting firms** bidding on development-bank projects: a daily list of new tenders and EOIs in your countries and sectors, with deadlines and World Bank estimates.
- **Business development teams and bid consultants**: separate saved searches per client or region (`stateKey`), delivered to Slack, email, Google Sheets or a CRM through Apify integrations.
- **Market intelligence**: contract awards show which companies win which contracts, where, and for how much.
- **Researchers, journalists and NGOs** following development finance by country or sector.

### What you get

- **Opportunity**: title, notice type, bid reference, procurement group (goods / works / consulting / non-consulting) and method, market approach (international vs national), UNSPSC categories, language.
- **Project and financing**: country, region, project ID and name, IDA/IBRD financing IDs, sectors, implementing agency and its website.
- **Money and dates**: World Bank estimate (USD), submission deadline and time, posting date.
- **Awards**: awarded companies (organisations only), their countries, signed contract price and currency, award notification date, contract duration.
- **Links**: official notice page and project page.

### Quick start

1. Click **Try for free** and run the default input `{}`: the 30 newest notices from the last 7 days (10 bids, 10 EOIs, 10 awards) in a few seconds.
2. Narrow it down, for example open goods and works tenders in Kenya and Nigeria:

```json
{ "noticeKinds": ["bids"], "countries": ["KE", "NG"], "procurementGroups": ["goods", "works"], "onlyOpen": true, "maxItems": 100 }
```

3. For alerts, set `"mode": "sinceLastRun"` and **schedule** the Actor daily. Each run returns only notices you have not received yet.

#### More recipes

- International solar opportunities above $1M: `{ "keywords": ["solar"], "internationalOnly": true, "minEstimatedValueUsd": 1000000, "lookbackDays": 30 }`
- Consulting EOIs in West and Central Africa: `{ "noticeKinds": ["eoi"], "regions": ["Western And Central Africa"] }`
- Who is winning in South Asia: `{ "noticeKinds": ["award"], "regions": ["South Asia"], "maxItems": 200 }`
- Events, communications and awareness campaigns: `{ "keywords": ["communication campaign", "awareness campaign", "event management", "communication"] }`

### Input

| Field | Default | Description |
|---|---|---|
| `mode` | `window` | `window` = stateless lookback; `sinceLastRun` = only notices not delivered before (per `stateKey`) |
| `noticeKinds` | `["bids","eoi","award"]` | also `plan` (general procurement notices) |
| `lookbackDays` | 7 | posting-date window (1-120) |
| `countries` | all | 2-letter ISO codes of the project country |
| `regions` | all | World Bank region names |
| `procurementGroups` | all | `goods`, `works`, `consulting`, `nonConsulting` |
| `keywords` | none | full-text, any of the words / quoted phrases |
| `internationalOnly` | false | only international competition |
| `onlyOpen` | false | bids/EOIs with a deadline today or later |
| `minEstimatedValueUsd` | none | World Bank estimate at least this (USD) |
| `maxItems` | 30 | max notices per run, newest first |
| `stateKey` | `default` | separate saved state per saved search |

### Output (example, real records posted Oct 29, 2026)

```json
[
  {
    "noticeId": "OP00478184",
    "noticeKind": "bids",
    "noticeType": "Invitation for Bids",
    "publishedDate": "2026-10-29",
    "title": "Travel Agency",
    "country": "Tuvalu",
    "countryCode": "TV",
    "region": "East Asia And Pacific",
    "projectId": "P179599",
    "projectName": "Pacific Islands Regional Oceanscape Program - Second Phase for Economic Resilience: Tuvalu",
    "financing": [
      "IDAE2750"
    ],
    "sectors": [
      "Fisheries",
      "Public Administration - Agriculture, Fishing & Forestry"
    ],
    "procurementGroup": "Non-consulting Services",
    "procurementMethod": "Request for Quotations",
    "marketApproach": "Open / International",
    "bidReference": "TV-TFD-559145-NC-RFQ",
    "estimatedValue": 30000,
    "estimatedValueCurrency": "USD",
    "deadline": "2026-11-13 16:30",
    "deadlineDate": "2026-11-13",
    "implementingAgency": "Tuvalu Fisheries Department",
    "agencyWebsite": "https://tuvalufisheries.tv/",
    "unspscCategories": [
      "Travel agents"
    ],
    "language": "English",
    "noticeVersion": 1,
    "noticeUrl": "https://projects.worldbank.org/en/projects-operations/procurement-detail/OP00478184",
    "projectUrl": "https://projects.worldbank.org/en/projects-operations/project-detail/P179599",
    "source": "World Bank procurement notices API (CC BY 4.0)"
  },
  {
    "noticeId": "OP00478015",
    "noticeKind": "award",
    "noticeType": "Contract Award",
    "publishedDate": "2026-10-29",
    "title": "Procurement of Consultancy Services for the Comprehensive Review, Revision, and Development of Governance and Operational Documents for Office of the Auditor General",
    "country": "Somalia, Federal Republic of",
    "countryCode": "SO",
    "region": "Eastern And Southern Africa",
    "projectId": "P177298",
    "projectName": "Somalia Enhancing Public Resource Management Project",
    "financing": [
      "IDAE1360"
    ],
    "sectors": [
      "Central Government (Central Agencies)"
    ],
    "procurementGroup": "Consulting Services",
    "procurementMethod": "Consultant Qualification  Selection",
    "marketApproach": "Open / National",
    "bidReference": "SO-MOF-511345-CS-CQS",
    "estimatedValue": 295000,
    "estimatedValueCurrency": "USD",
    "deadline": null,
    "deadlineDate": null,
    "implementingAgency": "Federal Government of Somalia Ministry of Finance",
    "agencyWebsite": null,
    "unspscCategories": [
      "Strategic planning consultation services",
      "Organizational structure consultation",
      "Process and procedures management consultation service"
    ],
    "language": "English",
    "noticeVersion": 1,
    "noticeUrl": "https://projects.worldbank.org/en/projects-operations/procurement-detail/OP00478015",
    "projectUrl": "https://projects.worldbank.org/en/projects-operations/project-detail/P177298",
    "suppliers": [
      "TALO CONSULTING LTD"
    ],
    "supplierCountries": [
      "Somalia, Federal Republic of"
    ],
    "suppliersWithheld": 0,
    "contractValue": 297350,
    "contractCurrency": "USD",
    "awardNotificationDate": "2025-12-30",
    "contractDuration": "6 Months",
    "source": "World Bank procurement notices API (CC BY 4.0)"
  }
]
```

A run summary is saved to the `OUTPUT` record: window, total matches per notice kind, filters dropped and suppliers withheld.

### Data source, timing and fair use

- Source: **World Bank procurement notices** (projects.worldbank.org) via the public World Bank Search API, licensed **CC BY 4.0** (attribution: The World Bank). This Actor is not affiliated with or endorsed by the World Bank.
- Notices are posted on working days and usually appear in the API 1-3 days after their posting date, which is why the default window is 7 days and sinceLastRun keeps a 5-day overlap (deduplicated, so you never get a notice twice).
- Requests are few and sequential (one API page per notice kind for a default run) with retries and back-off.
- **Privacy**: contact names, emails, phone numbers, addresses, rejected bidders and beneficial-ownership details in the notices are **never output**. Awarded suppliers are output **only when clearly an organisation** (legal form such as Ltd, SARL, S.A., PLC, Ltda; institutional names; single-word brands). Individual consultants and possible sole traders are withheld and counted in `suppliersWithheld`; the contract price is still shown.
- Award prices are in the contract currency; estimates are in US dollars.

### Pricing

Pay per event (Apify takes care of billing; you only pay for what is delivered):

| Event | Price | Charged |
|---|---|---|
| `apify-actor-start` | $0.005 | once per run |
| `notice-record` | $0.003 | per notice delivered |

A default test run (30 notices) costs about $0.095. A daily filtered alert (~10 notices/day) costs about $0.035/day. `maxItems` and Apify's *max cost per run* cap your spend; the Actor stops delivering when your budget is reached, so you are never charged for more than you set. No separate platform-usage charges: compute is included in the event prices.

### FAQ

**Does it cover other development banks (ADB, AfDB, IDB)?** No, World Bank (IBRD/IDA) financed procurement only. For EU public tenders see our EU TED tenders feed.

**Why is an award missing the supplier name?** The winner was an individual consultant or may be a sole trader, so the name is withheld for privacy. The notice link has the full official text.

**Why do some notices have dates a few days back?** `publishedDate` is the World Bank posting date; the API usually lists notices 1-3 days later.

**Which languages?** Notices are published in the language of the borrower (English, French, Spanish, Portuguese, Russian, Arabic ...). Keywords match the notice text as written.

**Can I backfill?** Yes, up to 120 days with `lookbackDays` and a higher `maxItems`.

# Actor input Schema

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

window (default): notices posted in the lookback window, no saved state. sinceLastRun: only notices not delivered before for this State key; use this for daily schedules.

## `noticeKinds` (type: `array`):

bids: invitations for bids / prequalification (goods, works, services). eoi: requests for expressions of interest (consulting firms). award: contract award notices with winning companies and contract prices. plan: general procurement notices (upcoming pipelines).

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

Posting-date window. The World Bank posts notices on working days with a 1-3 day lag, so 7 days always has data. Also the first-run window in sinceLastRun mode.

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

2-letter ISO codes of the project country, e.g. KE, NG, IN, PH, UA. Empty = all countries (incl. multi-country / regional projects).

## `regions` (type: `array`):

World Bank region names, e.g. 'Eastern And Southern Africa', 'Western And Central Africa', 'South Asia', 'East Asia And Pacific', 'Europe And Central Asia', 'Latin America And Caribbean', 'Mid East,North Africa,Afg,Pak'.

## `procurementGroups` (type: `array`):

Empty = all. goods, works (civil works), consulting (consulting services), nonConsulting (non-consulting services).

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

Full-text search, any of these words or quoted phrases, e.g. 'solar', 'ambulance', 'event management'. Notices can be in English, French, Spanish, Portuguese or other languages.

## `internationalOnly` (type: `boolean`):

Keep only notices open to international bidders (excludes national-market procurement).

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

Keep only bids / EOIs whose submission deadline is today or later.

## `minEstimatedValueUsd` (type: `integer`):

Keep notices whose World Bank estimate is at least this many US dollars. Notices without an estimate are dropped when set.

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

Maximum notices delivered (and charged) per run, split fairly between notice kinds. Newest first.

## `stateKey` (type: `string`):

Only for sinceLastRun: separate saved state per saved search, e.g. 'east-africa-solar'.

## Actor input object example

```json
{
  "mode": "window",
  "noticeKinds": [
    "bids",
    "eoi",
    "award"
  ],
  "lookbackDays": 7,
  "countries": [],
  "regions": [],
  "procurementGroups": [],
  "keywords": [],
  "internationalOnly": false,
  "onlyOpen": false,
  "maxItems": 30,
  "stateKey": "default"
}
```

# Actor output Schema

## `notices` (type: `string`):

One record per World Bank procurement notice.

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

Window, matches per notice kind, filters dropped, suppliers withheld.

# 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 = {
    "countries": [],
    "keywords": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("moment-data/world-bank-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 = {
    "countries": [],
    "keywords": [],
}

# Run the Actor and wait for it to finish
run = client.actor("moment-data/world-bank-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 '{
  "countries": [],
  "keywords": []
}' |
apify call moment-data/world-bank-tenders-feed --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,moment-data/world-bank-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/SsgKKR1OF0pYx3X59/builds/ppFBJ1YUd1amsph7v/openapi.json
