# World Bank Infrastructure Tenders & Verified Contract Awards (`afkdigital/newapi23-world-bank-infrastructure-tenders`) Actor

World Bank-financed project tenders and contract-award leads. Contractor and amount only when project ID and borrower contract reference match. Sources: World Bank Procurement Notice (DS00979) and IPF Contract Awards (DS00005), CC BY 4.0; attribution and license in README.

- **URL**: https://apify.com/afkdigital/newapi23-world-bank-infrastructure-tenders.md
- **Developed by:** [AFK Digital](https://apify.com/afkdigital) (community)
- **Categories:** Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$7.00 / 1,000 verified world bank procurement leads

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 Infrastructure Tenders & Verified Contract Awards

**NEWAPI23 | v0.1.0 | World Bank-funded projects | Official public datasets**

Find infrastructure and development-project bid opportunities, procurement notices, expressions of interest and **strictly linked** contract-award records using public data from the World Bank Group. Search by borrower country, relevant sector, keywords and dates. No account, proxy or scraped personal contact list is needed to access the source feeds.

### Verified sources and scope

- **Tender notices:** [The World Bank: Procurement Notice (DS00979)](https://financesone.worldbank.org/procurement%20notice/DS00979), provided by World Bank Finances One. Official machine-readable endpoint:
  `https://datacatalogapi.worldbank.org/dexapps/fone/api/apiservice?datasetId=DS00979&resourceId=RS00909&top=100&skip=0&type=json`.
- **Tender/project cross-checks:** [Projects & Operations Procurement](https://projects.worldbank.org/en/projects-operations/procurement) search index at `https://search.worldbank.org/api/v2/procnotices` and [Projects API](https://search.worldbank.org/api/v2/projects); used to verify notice ID and resolve project name. The raw DS00979 sector field is preserved verbatim; missing sectors remain `null`.
- **Project-financed contract results:** [World Bank: Contract Awards in Investment Project Financing since FY2020 (DS00005)](https://financesone.worldbank.org/contract-awards-in-investment-project-financing/DS00005) and the official project `https://search.worldbank.org/api/contractdata` feed. The source describes borrower-financed projects, not procurement undertaken by the World Bank institution itself.
- **Excluded:** [Corporate Procurement Contract Awards (DS00028)](https://financesone.worldbank.org/d/DS00028) concerns World Bank Group's internal purchasing and is not used.

Data were checked live on October 23, 2026. Notices can arrive with publication/indexing lag; World Bank records can be incomplete, modified, canceled or delayed.

### Modes

#### `tenders` (default)

Returns live official tender/EOI/prequalification/general notices. Excludes `Contract Award` notices. The output includes `notice_id`, `project_id`, `project_name`, `country`, `sector`, `notice_type`, `publication_date`, `bid_deadline`, `official_url` and `observed_at`. Deadline dates are ISO `YYYY-MM-DD`. A local clock time is included when the source explicitly supplies one, but **no timezone is guessed**. A notice without a sector returns `sector: null`, not a made-up sector.

#### `awards` (only source-verified matches)

Returns an award **only if** the official project contract-data record has an actual positive total contract amount, an identified winning supplier, and its `projectid` **and full borrower contract reference** match exactly one **official `Contract Award` notice**. All three fields must pass. A shared project ID alone is not sufficient. Mismatches and ambiguous records are excluded. Output adds the official contract URL, linked award notice URL, contractor name, contract amount, currency, contract ID and match evidence. If a source record is missing data the actor skips it; it never substitutes project budgets for awarded contract values.

The World Bank's contract award data already expresses contract values in **USD**. The Actor does **not** perform any currency conversion, create exchange rates or assert exchange dates. See the official DS00005 data dictionary: World Bank amounts reflect committed USD using US Treasury exchange rates at the Bank's no-objection point. The source does not provide individual rate evidence for every contract in this Actor; consult the original contract for further currency detail.

Award records are **not** a complete list of contracts or subcontract awards; a source mismatch can legitimately result in zero returned items. A sector filter is not available for awards in this version (it will yield zero rather than mislabel a procurement category as a sector).

### Input example

```json
{
  "mode": "tenders",
  "countries": ["Kenya", "Ethiopia"],
  "keywords": ["construction", "road"],
  "daysBack": 14,
  "maxResults": 25,
  "maxScanned": 1500,
  "maxCostUsd": 0.5
}
```

`countries` accepts borrower country names or two-letter codes; multiple countries use OR logic. `keywords` are case-insensitive OR matches on description/project name. Optional `sectorKeyword` matches only the source-published World Bank sector text. Optional `noticeTypes` can restrict non-award notice categories. `publishedFrom`/`publishedTo` and `deadlineFrom`/`deadlineTo` use inclusive `YYYY-MM-DD` boundaries. A 14-day window is the default.

Filtering happens before emitting and billing. `maxScanned` is a hard safety bound: if it is reached before all matches are found, `SUMMARY.stopReason` indicates a partial scan. The actor keeps a per-run `CHECKPOINT` in Apify's default key-value store, tracking scanned pages and emitted ID pairs to resume after interruption. Dataset output is append-only.

### Outputs & price

Every unique valid notice or strictly linked award yields one flat row in the **default Apify Dataset**. Use the Output tab or download the same dataset as **JSON or CSV** (`?format=json` or `?format=csv`). Run metadata is available in the default key-value store at `SUMMARY`.

**Target price: $0.007 per unique record**, or **$7.00 per 1,000 records**, under Apify's *Pay per event* model with `apify-default-dataset-item` set to $0.007. An additional synthetic `apify-actor-start` event may cost $0.00005 per run with 256–512MB memory. No charge is made for duplicate, rejected, or unlinked records. Actual listing prices must be checked in Apify's Pricing tab before buying. `maxCostUsd`, `maxResults` and the Apify platform run spending limit stop the Actor when its permitted records are exhausted; invalid inputs are rejected without a paid result.

The default input has `maxResults=25`, `daysBack=14`, `maxScanned=1500` and `maxCostUsd=0.50`. Standard runs are designed for under five minutes; unusual source outages or highly narrow filters may cause a partial scan, with its reason disclosed.

### License and attribution

**Source: The World Bank: Procurement Notice (DS00979); and, for verified contract awards, The World Bank: Contract Awards in Investment Project Financing (DS00005).** Both are marked **Creative Commons Attribution 4.0 International**. Copyright and data attribution belong to the original publisher. License: https://creativecommons.org/licenses/by/4.0/ . Terms: https://www.worldbank.org/ext/en/legal/terms-conditions/datasets . Commercial reuse requires keeping appropriate credit and a link to the license, indicating changes, and observing the World Bank's applicable dataset terms. This Actor normalizes dates, filters records and joins project notices; it is an independent tool, not endorsed by the World Bank. The original source links are retained in every output.

Always consult the issuing procurement authority for binding deadlines, corrections and bid instructions. This tool does not supply legal/procurement advice and intentionally excludes direct contact lists for private individuals.

# Actor input Schema

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

tenders uses official Procurement Notice DS00979; awards returns only official project contract awards strictly linked by project ID and borrower reference.

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

Country names or two-letter country codes (for example Kenya, Ethiopia, KE, ET). Leave empty for worldwide.

## `sectorKeyword` (type: `string`):

Substring matched only to an actual published World Bank sector. Not a procurement category. Awards currently return zero with sector filter.

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

Case-insensitive keywords matched to notice description and verified project name, OR logic.

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

Supported non-award types, e.g. Invitation for Bids or Request for Expression of Interest; empty allows all tender-side types.

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

YYYY-MM-DD; inclusive. Awards filter on matched official award-notice publication date.

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

YYYY-MM-DD; inclusive.

## `deadlineFrom` (type: `string`):

YYYY-MM-DD inclusive; applies to tenders. Awards have no open bid deadline.

## `deadlineTo` (type: `string`):

YYYY-MM-DD inclusive; applies to tenders.

## `daysBack` (type: `integer`):

Used when publishedFrom is omitted.

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

One billable result = unique project+notice or linked project+contract.

## `maxScanned` (type: `integer`):

Stops excessive upstream reads when filters are narrow; incomplete scans are reported in SUMMARY.

## `maxCostUsd` (type: `number`):

Conservative cap including the standard $0.00005 start-event reserve; per unique result is $0.007.

## Actor input object example

```json
{
  "mode": "tenders",
  "countries": [],
  "keywords": [],
  "noticeTypes": [],
  "daysBack": 14,
  "maxResults": 25,
  "maxScanned": 1500,
  "maxCostUsd": 0.5
}
```

# Actor output Schema

## `json` (type: `string`):

No description

## `csv` (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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("afkdigital/newapi23-world-bank-infrastructure-tenders").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("afkdigital/newapi23-world-bank-infrastructure-tenders").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 '{}' |
apify call afkdigital/newapi23-world-bank-infrastructure-tenders --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,afkdigital/newapi23-world-bank-infrastructure-tenders"
        }
    }
}
```

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/SxFxoVZ5cKSpU8gvt/builds/fxpvP61kCfd1kSjxq/openapi.json
