# Public Tenders & Contract Awards, 7 Countries (`a-g-d/emerging-tenders`) Actor

Public tenders and contract awards from the national e-procurement portals of Vietnam, Bangladesh, Bhutan, Pakistan, Uzbekistan, Ghana and Tunisia in one normalised JSON schema: buyer, title, category, procedure, dates with local offsets, exact local-currency amounts, winners and links.

- **URL**: https://apify.com/a-g-d/emerging-tenders.md
- **Developed by:** [Aloever Dulay](https://apify.com/a-g-d) (community)
- **Categories:** Lead generation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 tender notices

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

## Public Tenders & Contract Awards, 7 Countries

Public tender notices and contract awards from the national e-procurement portals of
**Vietnam, Bangladesh, Bhutan, Pakistan, Uzbekistan, Ghana and Tunisia**, in one normalised
JSON schema. One input, one run, seven portals read concurrently, one record shape: country,
buyer, title, category, procedure, dates with the country's real time offset, exact amounts
in the local currency, winners, links, and the full source record for anything else.

- **Tenders** (`recordType: "tenders"`, the default): open tender notices from every selected
  country, newest first per country.
- **Contract awards** (`recordType: "awards"`): awarded contracts and published results from
  every selected country except Tunisia, whose portal publishes no award results the actor can
  read, newest first per country.

The same data as the seven per-country actors, read by the same code, but you pay this actor's
events once and never a second actor.

### Who needs this

- **Suppliers, contractors and consultants** bidding across South Asia, Southeast Asia,
  Central Asia and Africa who want one morning feed instead of seven portals.
- **Tender-alert services and bid consultants** building multi-country feeds, digests or
  alerts on one schema.
- **Market-entry, trade and development-finance teams** sizing public demand and following
  who wins what, where, at what price.
- **Analysts, journalists and researchers** studying public procurement across emerging
  markets without writing seven scrapers.
- **AI agents and automations** that need a stable schema instead of seven portals in six
  languages and three date formats.

### Countries and portals

| Country    | Portal                                                 | `source`     | Tenders                                | Awards                                              | Time offset |
| ---------- | ------------------------------------------------------ | ------------ | -------------------------------------- | --------------------------------------------------- | ----------- |
| Vietnam    | [muasamcong.mpi.gov.vn](https://muasamcong.mpi.gov.vn) | `muasamcong` | open tender notices (TBMT)             | published contractor-selection results (KQLCNT)     | +07:00      |
| Bangladesh | [eprocure.gov.bd](https://www.eprocure.gov.bd)         | `bd-egp`     | live tenders                           | Notifications of Award, one per lot                 | +06:00      |
| Bhutan     | [egp.gov.bt](https://www.egp.gov.bt)                   | `bt-egp`     | live tenders                           | Notifications of Award, one per contract            | +06:00      |
| Pakistan   | [epms.ppra.gov.pk](https://epms.ppra.gov.pk)           | `ppra-epms`  | active tenders                         | awarded contracts                                   | +05:00      |
| Uzbekistan | [etender.uzex.uz](https://etender.uzex.uz)             | `uzex`       | open tenders, then open selections     | completed deals                                     | +05:00      |
| Ghana      | [ghaneps.gov.gh](https://www.ghaneps.gov.gh)           | `ghaneps`    | tenders open for bids (Bid Submission) | awarded contracts, one per tender, lot and supplier | +00:00      |
| Tunisia    | [tuneps.tn](https://www.tuneps.tn)                     | `tuneps`     | open tender notices                    | none (skipped with a note in the run report)        | +01:00      |

### Input

| Field                | Type     | Default     | Description                                                                                                                                        |
| -------------------- | -------- | ----------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
| `recordType`         | string   | `"tenders"` | `tenders` or `awards`. One run returns one record type.                                                                                            |
| `countries`          | string\[] | all seven   | Any of `VN`, `BD`, `BT`, `PK`, `UZ`, `GH`, `TN`. Fetched concurrently, one worker per country.                                                     |
| `keyword`            | string   | `""`        | Case-insensitive text filter, applied the way each portal applies its own (see below). Portals index text in their own language.                   |
| `publishedSince`     | string   | `""`        | An ISO date (`2026-09-20`, midnight in each country's own time) or an ISO-8601 timestamp. Tenders filter on publication, awards on the award date. |
| `maxItemsPerCountry` | integer  | `50`        | Stop each country after this many records (1-2,000), newest first.                                                                                 |
| `proxyConfiguration` | object   | no proxy    | Optional Apify Proxy. Not needed normally; Vietnam's portal sometimes resets datacenter connections, where a residential group helps.              |

Examples:

```json
{ "countries": ["VN", "PK", "GH"], "keyword": "hospital", "maxItemsPerCountry": 100 }
```

```json
{ "recordType": "awards", "publishedSince": "2026-09-01", "maxItemsPerCountry": 200 }
```

#### How the keyword and date filters apply per country

Each portal applies what it can; the actor applies the rest itself, reading newest first and
stopping at the first page older than `publishedSince` where a list is sorted by date.

| Country    | `keyword`                                                                                                     | `publishedSince`                                                                                                      |
| ---------- | ------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- |
| Vietnam    | by the portal, on the notice number and package name (Vietnamese)                                             | by the portal, on the notice's publication time (tenders) or the result's (awards); without a date, the trailing year |
| Bangladesh | tenders: by the actor, on title, reference number and tender ID; awards: by the portal, on the package title  | tenders: by the portal by day, then the exact time by the actor; awards: by the actor on the contract signing date    |
| Bhutan     | as Bangladesh                                                                                                 | as Bangladesh (awards on the notification-of-award date)                                                              |
| Pakistan   | by the portal, on titles, descriptions and numbers (a match need not be in `title`)                           | by the portal, by advertisement day (tenders) or publication day (awards)                                             |
| Uzbekistan | by the portal, on the lot name (Uzbek or Russian)                                                             | tenders: by the actor on the publication time; awards: by the portal by day, then the exact time by the actor         |
| Ghana      | tenders: by the portal on the title, re-checked by the actor; awards: by the actor on title, supplier and lot | by the actor, on the publication time (tenders) or award time (awards)                                                |
| Tunisia    | by the portal, on the French title                                                                            | by the portal, on the publication time                                                                                |

### Output

One dataset item per tender notice or per contract award. Every item has a `recordType`
(`tender` or `award`), a `country` (ISO 3166-1 alpha-2) and a `source` (the portal's short
name). Text is kept exactly as each portal publishes it, in its own language and script.
Dates are ISO-8601 with the country's real offset; where a portal prints only a day the value
stays a date (`YYYY-MM-DD`). Amounts are exact numbers in the local currency, never converted.
`raw` holds the full record exactly as the country's own actor stores it, so nothing is lost.
The Output tab on this page documents every field; the dataset has "Tenders" and "Awards"
views.

Common fields: `recordType`, `country`, `source`, `sourceId`, `referenceNo`, `title`, `buyer`,
`buyerCode`, `category`, `procedure`, `status`, `detailUrl`, `sourceUrl`, `fetchedAt`, `raw`.

Tenders add `publishedAt`, `deadlineAt`, `openingAt`, `estimatedValue`, `currency`, `valueText`.
Awards add `awardedOn`, `winnerName`, `winnerCode`, `amount`, `currency`, `amountText`.

#### What each field holds, per country

| Field                       | Vietnam                                 | Bangladesh                       | Bhutan                       | Pakistan                        | Uzbekistan                     | Ghana                            | Tunisia             |
| --------------------------- | --------------------------------------- | -------------------------------- | ---------------------------- | ------------------------------- | ------------------------------ | -------------------------------- | ------------------- |
| `sourceId`                  | notice id                               | tender ID / lot ID               | tender ID / contract ID      | tender / contract number        | trade ID / deal ID             | tender ID (shared by its awards) | notice number       |
| `referenceNo`               | notice number (IB…)                     | reference number                 | reference number             | reference number                | 14-digit lot number            | none                             | buyer reference     |
| `buyer` / `buyerCode`       | investor / its code                     | procuring entity / none          | procuring agency / none      | office / none                   | customer / taxpayer number     | procuring entity / none          | buyer / buyer code  |
| `category`                  | procurement field                       | procurement nature               | procurement category         | sector                          | none                           | none                             | category (French)   |
| `procedure`                 | selection method                        | method name                      | method name                  | none                            | `tender` or `selection`        | procedure                        | procedure (French)  |
| `publishedAt`               | notice publication time                 | publication time                 | publication time             | advertisement day               | publication time               | publication time                 | publication time    |
| `deadlineAt`                | bid closing time                        | closing time                     | closing time                 | closing time                    | offers due                     | bid submission deadline          | submission deadline |
| `openingAt`                 | bid opening time                        | none                             | none                         | none                            | none                           | none                             | opening time        |
| `estimatedValue`            | package price (VND)                     | none                             | none                         | none                            | starting price (in `currency`) | none                             | none                |
| `awardedOn`                 | result publication time                 | contract signing date            | notification-of-award date   | day EPMS published the contract | time the deal was concluded    | award date and time              | n/a                 |
| `winnerName` / `winnerCode` | joint venture or winners / portal codes | winner / none                    | winner / none                | winner / none                   | supplier / taxpayer number     | supplier / none                  | n/a                 |
| `amount`                    | winning price (VND)                     | contract value (BDT, from crore) | contract value (BTN, exact)  | awarded amount (PKR)            | deal cost (in `currency`)      | award amount (as printed)        | n/a                 |
| `amountText`                | none                                    | crore figure as printed          | million Nu figure as printed | "Rs." figure as printed         | none                           | amount with code as printed      | n/a                 |

Notes:

- **Vietnam winners**: a joint venture is named by its joint-venture name; several distinct
  winners of a multi-lot package are joined with `; `. `winnerCode` joins the portal's own
  list of winner codes, which is not aligned one-to-one with the names (`raw` has both lists).
- **Bangladesh amounts** are converted exactly from the published crore figure (precise to
  10,000 BDT); **Bhutan amounts** are read exactly from the portal's advanced award search
  (`raw.contractValueExact` says whether the exact figure matched the list).
- **Uzbekistan** `tenders` are open tenders first and then, up to the same maximum, open
  selections of the best offers (`procedure` tells them apart). Amounts are in each lot's own
  currency (UZS, USD, EUR and others as published).
- **Ghana** awards share the tender's `sourceId`; the lot and supplier in the record tell
  them apart.

A real Bangladesh tender, normalised (captured 2026-09-26):

```json
{
  "recordType": "tender",
  "country": "BD",
  "source": "bd-egp",
  "sourceId": "1320555",
  "referenceNo": "ShSmch/Breakfast/Diet/2026-2027/G-9C-F/E Notice",
  "title": "ShSmch/Breakfast/Diet/26-27/G-9,C-F, PROCUREMENT OF DIET FOR BREAKFAST FOR ADMITTED PATIENT ( GROUP-A, CATEGORY-F) OF SHAHEED SUHRAWARDY MEDICAL COLLEGE & HOSPITAL, DHAKA FINANCIAL YEAR- 2026-2027",
  "buyer": "Shaheed Suhrawardy Medical College Hospital , Dhaka",
  "buyerCode": null,
  "category": "Goods",
  "procedure": "Open Tendering Method",
  "status": "Live",
  "publishedAt": "2026-09-25T23:30:00+06:00",
  "deadlineAt": "2026-10-12T13:30:00+06:00",
  "openingAt": null,
  "estimatedValue": null,
  "currency": null,
  "valueText": null,
  "detailUrl": "https://www.eprocure.gov.bd/resources/common/ViewTender.jsp?id=1320555&h=t",
  "sourceUrl": "https://www.eprocure.gov.bd/TenderDetailsServlet",
  "fetchedAt": "2026-09-26T13:42:31.000Z",
  "raw": {
    "recordType": "tender",
    "tenderId": "1320555",
    "ministry": "Ministry of Health and Family Welfare",
    "…": "…"
  }
}
```

A real Bangladesh award, normalised (captured 2026-09-26):

```json
{
  "recordType": "award",
  "country": "BD",
  "source": "bd-egp",
  "sourceId": "2056490",
  "referenceNo": "APP ID : 216678",
  "title": "Widening & Strengthening of Hazirhat HQ- Ramnawaj GC road at ch. 0.00- 7900m including 03 Nos. 2-vent 3.00mx3.00m RCC Box Culvert at 1148m 4036m & 7008m under Upazila: Monpura District: Bhola (Road ID No. 509652002 Salvage Materials Cost Tk 634374.00)",
  "buyer": "Office of the Executive Engineer, LGED, Bhola",
  "buyerCode": null,
  "category": null,
  "procedure": "Open Tendering Method",
  "status": null,
  "awardedOn": "2026-09-24",
  "winnerName": "KE-SS (JV)",
  "winnerCode": null,
  "amount": 185320000,
  "currency": "BDT",
  "amountText": "18.532",
  "detailUrl": "https://www.eprocure.gov.bd/resources/common/ViewAwardedContracts.jsp?pkgLotId=2056490&tenderid=1296078",
  "sourceUrl": "https://www.eprocure.gov.bd/SearchNoaServlet",
  "fetchedAt": "2026-09-26T13:43:05.000Z",
  "raw": {
    "recordType": "award",
    "tenderId": "1296078",
    "lotId": "2056490",
    "contractValueCrore": 18.532,
    "…": "…"
  }
}
```

#### The run report

The default key-value store holds an `OUTPUT` record with, per requested country, how many
records were stored and charged, how many portal requests and retries it took, how long it
ran, why it stopped, and the error message when a portal failed or refused. A country that
errors or answers with a verification page is reported there and in the run's status
message; the other countries carry on. A portal that stops answering altogether (no response
for 2 minutes) is reported the same way, with stop reason `stalled`, so one hanging portal
never holds up the rest of the run. The run fails only when every requested country fails.

### Pricing

Pay per event, charged only for records actually stored in your dataset:

- **`tender-notice`**: one per tender notice stored.
- **`award-result`**: one per contract award stored.

A run charges one of the two, depending on `recordType`; the actor defines no start event of
its own. Each country's rows are stored before they are charged and every country stops
cleanly when your spending limit is reached, so you never pay for data you cannot see.

### Data sources and politeness

The data comes from the public, login-free lists of the seven national portals, read by the
same code as the per-country actors: one worker per country, each sending **one request at a
time with at least 1-2 seconds between requests** (each portal's own pace), an honest
User-Agent that names the actor, retries with exponential backoff inside a fixed budget, a
clear error when a portal keeps refusing, and a clean stop shortly before the run's timeout.
When the platform's DNS cannot resolve the Bangladesh or Bhutan portal, the actor asks public
resolvers (1.1.1.1, 8.8.8.8) and then the portal's own nameservers, and keeps that answer for
the run.
The actor never logs in, never solves or works around a CAPTCHA (a verification page stops
that country at once), never downloads tender documents, and never uses the credential-gated
Pakistan e-PADS gateway.

Terms differ per portal: Bangladesh's and Bhutan's say their content is copyrighted by the
procurement authority; the others state no reuse conditions. The actor publishes metadata and
links only, not documents; follow `detailUrl` for the official page and documents.

### Data and privacy

The output is buyer, tender and award metadata exactly as each government publishes it by law.
Contracts are often awarded to sole proprietorships named after their owner, so `winnerName`
can be a person's name: the actor keeps it as published and adds nothing to it. It keeps each
source actor's privacy rules: Uzbek taxpayer numbers are published only for legal entities,
never for individuals or individual entrepreneurs; Bhutan winners' addresses, Tunisian buyer
staff names and any e-mail addresses or phone numbers in free text are left out; beneficial
owners and contact officers are never read. It does not enrich, profile or combine records
with other sources. If you process names of individuals, you are responsible for doing so
lawfully.

### Limitations

- **Tenders are open tenders only** in every country (live, active, in bid submission or with
  a deadline ahead); closed and archived tenders are not read.
- **Tunisia has no awards**: its award observatory is walled behind a CAPTCHA, so `awards`
  runs skip Tunisia with a note in the run report.
- **Vietnam needs a publication window**: without `publishedSince` the actor asks for the
  trailing year, which covers every open notice; for awards it reads newest result first by
  splitting the window, at the cost of a few extra requests.
- **Estimated values** are published only by Vietnam and Uzbekistan; the other lists print
  none, so `estimatedValue` is `null` there.
- **Per-country speed differs.** Ghana serves 10 rows per page 2-5 seconds apart and Tunisia
  needs one request per notice, so large `maxItemsPerCountry` values run into the run timeout
  there; the run then ends successfully with what it stored, and the report says why.
- **`sourceId` is the portal's own key**: unique per record everywhere except Ghana awards
  (one `sourceId` per tender, several awards) and Tunisia addenda (the same notice number,
  `raw.modificationSeq` differs).
- Garbled characters, missing dates and free text instead of numbers are the portals' own;
  the actor keeps text as published and sets the numeric or date field to `null`.

# Changelog

This Actor's version history is a separate document: https://apify.com/a-g-d/emerging-tenders/changelog.md

# Actor input Schema

## `recordType` (type: `string`):

Tenders (the default): open tender notices from every selected country. Awards: contract awards and published results (Tunisia is skipped: its portal publishes no award results the actor can read). One run returns one record type.

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

The countries to read, each from its national e-procurement portal, fetched concurrently. Leave empty or select all for all seven.

## `keyword` (type: `string`):

Case-insensitive text filter, applied the way each portal applies its own: on the portal for Vietnam, Uzbekistan, Tunisia, Ghana tenders and Bangladesh/Bhutan awards (title, or title and notice number) and for Pakistan (titles, descriptions and numbers); by the actor on the title, reference number and tender ID of Bangladesh/Bhutan tenders and on the title, supplier and lot of Ghana awards. Portals index text in their own language (Vietnamese, French for Tunisia, Uzbek or Russian for Uzbekistan). Leave empty for all records.

## `publishedSince` (type: `string`):

Only records published (tenders) or awarded (awards) at or after this point: an ISO date like "2026-09-20" (midnight in each country's own time) or an ISO-8601 timestamp. Applied by the portal where it can (Vietnam, Pakistan, Tunisia, Bangladesh and Bhutan tenders by day, Uzbekistan awards by day) and by the actor elsewhere, reading newest first and stopping at the first page older than the date. Leave empty for no lower bound.

## `maxItemsPerCountry` (type: `integer`):

Stop each country after storing this many records (newest first). The run stores up to this many times the number of countries.

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

Optional. The actor talks to the seven portals directly; use Apify Proxy only if a portal keeps refusing connections from the platform (Vietnam's portal sometimes resets datacenter connections; a residential group helps there).

## Actor input object example

```json
{
  "recordType": "tenders",
  "countries": [
    "VN",
    "BD",
    "BT",
    "PK",
    "UZ",
    "GH",
    "TN"
  ],
  "keyword": "",
  "publishedSince": "",
  "maxItemsPerCountry": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `tenders` (type: `string`):

Filled by runs with recordType "tenders" (the default): one item per tender notice from each requested country, newest first per country: country and portal, source ID, reference number, title, buyer, category, procedure, status, publication time, deadline and opening time with the country's offset, estimated value in the local currency where published, links and the full source record.

## `awards` (type: `string`):

Filled by runs with recordType "awards": one item per contract award from each requested country (Tunisia has no award source), newest first per country: country and portal, source ID, reference number, title, buyer, procedure, the award date each portal publishes, the winner and its public code where published, the awarded amount in the local currency, links and the full source record.

## `report` (type: `string`):

The OUTPUT record: per requested country, how many records were stored and charged, how many portal requests and retries it took, how long it ran, why it stopped, and the error message when a portal failed or refused.

# 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": [
        "VN",
        "BD",
        "BT",
        "PK",
        "UZ",
        "GH",
        "TN"
    ],
    "maxItemsPerCountry": 5,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("a-g-d/emerging-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 = {
    "countries": [
        "VN",
        "BD",
        "BT",
        "PK",
        "UZ",
        "GH",
        "TN",
    ],
    "maxItemsPerCountry": 5,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("a-g-d/emerging-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 '{
  "countries": [
    "VN",
    "BD",
    "BT",
    "PK",
    "UZ",
    "GH",
    "TN"
  ],
  "maxItemsPerCountry": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call a-g-d/emerging-tenders --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,a-g-d/emerging-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/v7HbAApqMZNQ2Lnwe/builds/jeQrAxPUGf7OIVC7i/openapi.json
