# Bangladesh e-GP Tenders & Contract Awards (eprocure.gov.bd) (`a-g-d/bd-egp`) Actor

Live tenders and contract awards (Notifications of Award) from Bangladesh's national e-GP portal (eprocure.gov.bd) as English-keyed JSON: tender ID, title, ministry, procuring entity, method, publication and closing times, winner, contract value in BDT and links to the portal pages.

- **URL**: https://apify.com/a-g-d/bd-egp.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

## Bangladesh e-GP Tenders & Contract Awards (eprocure.gov.bd)

Live tenders and contract awards from Bangladesh's national e-Government Procurement
portal, [eprocure.gov.bd](https://www.eprocure.gov.bd), as clean, English-keyed JSON.

- **Live tenders** (`recordType: "tenders"`, the default): every tender currently open on
  e-GP, newest publication first, with the tender ID, reference number, full title,
  procurement nature, type and method, the ministry, division, organization and procuring
  entity, publication and closing times, amendment status and a link to the notice.
- **Contract awards** (`recordType: "awards"`): awarded contracts from the portal's
  Notification of Award list, newest contract signing first, with the tender and lot IDs,
  title, ministry, procuring entity, district, method, advertisement time, signing date,
  the contractor the contract was awarded to and the contract value in taka, with a link
  to the award page.

### Who needs this

- **Contractors and suppliers** bidding for Bangladeshi public contracts who want new
  tenders in their field every morning instead of paging through the portal by hand.
- **Tender-alert services and bid consultants** building feeds, email digests or
  WhatsApp/Telegram alerts.
- **Market-entry and trade teams** sizing public demand for works, goods and services by
  ministry and agency.
- **Analysts, journalists and researchers** studying public procurement: who buys what,
  by which method, and which companies win contracts of what size, where.
- **Sales and competitive-intelligence teams** tracking which companies win which
  contracts from which agencies.
- **AI agents and automations** that need a stable schema instead of a 2010-era JSP site.

### Input

| Field                | Type    | Default     | Description                                                                                                                                                                        |
| -------------------- | ------- | ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `recordType`         | string  | `"tenders"` | `tenders` for live tenders, `awards` for contract awards. One run returns one record type.                                                                                         |
| `keyword`            | string  | `""`        | Tenders: matched against the title, reference number and tender ID. Awards: matched by the portal against the package description (title). Case-insensitive.                       |
| `ministry`           | string  | `""`        | Only records whose ministry contains this text, e.g. `Health` or `Ministry of Education`. Case-insensitive.                                                                        |
| `organization`       | string  | `""`        | Only records whose division, organization or procuring entity contains this text, e.g. `LGED`, `Bangladesh Railway`, `Roads and Highways`.                                         |
| `procurementNature`  | string  | all         | **Tenders only**: `goods`, `works`, `services` or `physicalServices`.                                                                                                              |
| `method`             | string  | all         | Procurement method code: `OTM`, `LTM`, `RFQ`, `RFQU`, `RFQL`, `DPM`, `TSTM`, `OSTETM`, `QCBS`, `LCS`, `SFB`, `SBCQ`, `SSS`, `IC`, `DC`, `CSO`.                                     |
| `district`           | string  | all         | **Awards only**: the procuring entity's district, as the portal spells it (e.g. `Cumilla`, `Norshingdi`, `Cox's Bazar`).                                                           |
| `publishedSince`     | string  | `""`        | **Tenders only**: tenders published after this point. A relative span (`24 hours`, `7 days`, `2 weeks`), a date (`2026-09-20`, midnight Bangladesh time) or an ISO-8601 timestamp. |
| `signedSince`        | string  | `""`        | **Awards only**: contracts signed on or after the Bangladesh calendar day of this point. Same formats as `publishedSince`.                                                         |
| `maxItems`           | integer | `100`       | Stop after this many tenders or awards (1-50,000), newest first.                                                                                                                   |
| `proxyConfiguration` | object  | no proxy    | Optional Apify Proxy. Not needed normally; use it only if runs fail with connection errors.                                                                                        |

A filter that does not apply to the chosen record type is ignored, and the run log says
so. Examples:

```json
{ "publishedSince": "24 hours", "procurementNature": "works", "maxItems": 500 }
```

```json
{ "recordType": "awards", "district": "Dhaka", "method": "OTM", "signedSince": "7 days" }
```

Every live tender: leave the filters empty and set `maxItems` to about 5,000 (the portal
lists roughly 4,000 live tenders at a time).

### Output

One dataset item per live tender or per awarded contract. Every item has a `recordType`
field, `tender` or `award`; a run stores one record type only, so a run's dataset is
homogeneous. Keys are English; text is kept exactly as the portal publishes it (English
or Bangla), trimmed and with HTML entities decoded. Times are ISO-8601 in Bangladesh time
(`+06:00`), the signing date is a calendar day (`YYYY-MM-DD`), and `fetchedAt` is UTC.
The Output tab on this page documents every field. The dataset has two table views:
"Tenders" and "Awards".

A real tender (captured 2026-09-26):

```json
{
  "recordType": "tender",
  "tenderId": "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",
  "procurementNature": "goods",
  "procurementNatureLabel": "Goods",
  "isFrameworkAgreement": false,
  "procurementType": "NCT",
  "procurementTypeLabel": "National Competitive Tendering",
  "method": "OTM",
  "methodLabel": "Open Tendering Method",
  "ministry": "Ministry of Health and Family Welfare",
  "division": "Health Services Division",
  "organization": "Directorate General of Health Services (DGHS)",
  "procuringEntity": "Shaheed Suhrawardy Medical College Hospital , Dhaka",
  "publishedAt": "2026-09-25T23:30:00+06:00",
  "closingAt": "2026-10-12T13:30:00+06:00",
  "status": "Live",
  "amendmentCount": 0,
  "detailUrl": "https://www.eprocure.gov.bd/resources/common/ViewTender.jsp?id=1320555&h=t",
  "sourceUrl": "https://www.eprocure.gov.bd/TenderDetailsServlet",
  "fetchedAt": "2026-09-26T14:06:07.913Z"
}
```

A real award (captured 2026-09-26):

```json
{
  "recordType": "award",
  "tenderId": "1296078",
  "lotId": "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)",
  "ministry": "Ministry of Local Government, Rural Development and Co-operatives",
  "division": "Local Government Division",
  "procuringEntity": "Office of the Executive Engineer, LGED, Bhola",
  "method": "OTM",
  "methodLabel": "Open Tendering Method",
  "district": "Bhola",
  "advertisedAt": "2026-06-17T10:30:00+06:00",
  "contractSignedOn": "2026-09-24",
  "winnerName": "KE-SS (JV)",
  "contractValueBdt": 185320000,
  "contractValueCrore": 18.532,
  "contractValueText": "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-26T14:06:11.117Z"
}
```

#### About contract values

The award list publishes each contract's value in **crore taka** (1 crore = 10,000,000
BDT) rounded to three decimals. `contractValueCrore` keeps that figure as published and
`contractValueBdt` converts it to taka exactly, digit by digit, so it is precise to
10,000 BDT: the award above is 185,324,700 BDT on its award page and 18.532 crore
(185,320,000 BDT) in the list. The exact price is on the page `detailUrl` points to.
`contractValueText` keeps the cell as printed, so a value in another currency or format
is never lost (its numbers are then `null`).

#### About award dates

The award list is ordered by the date the contract was **signed** (`contractSignedOn`),
which comes after the Notification of Award itself; the award page shows both. A tender
with several lots has one award per lot, keyed by `lotId`.

### Pricing

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

- **`tender-notice`**: one per live tender 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. It stores each page before it is charged and stops cleanly when your spending
limit is reached, so you never pay for data you cannot see.

### Data source and politeness

The data comes from the public, login-free lists of the national e-GP portal run by the
Bangladesh Public Procurement Authority (BPPA): the "All Tenders" page (Live tab) and the
Notification of Award search. The actor:

- sends **one request at a time with at least 2 seconds between requests**, with an honest
  User-Agent that names the actor;
- reads large pages (up to 500 rows) so a typical run needs only a few requests;
- retries connection resets, timeouts and server errors with exponential backoff inside a
  fixed budget, and stops with a clear error if the portal keeps refusing;
- stops shortly before the run's timeout and keeps what it has stored;
- never logs in, never touches the captcha-protected parts of the site and never downloads
  tender documents.

The portal's terms state that its content is copyrighted by BPPA. The actor publishes
metadata and links only, not documents; follow `detailUrl` for the official page and
documents.

### Data and privacy

The output is company and award metadata exactly as the 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 does not enrich, profile or combine records with other sources, does not guess
personal attributes, and does not output phone numbers, e-mail addresses or the
beneficial-ownership details shown on individual award pages. If you process names of
individuals, you are responsible for doing so lawfully.

### Limitations

- **Tenders are live tenders only**: the list the portal shows as "Live" (including
  amended ones). Closed, archived and cancelled tenders are not included.
- **Filters the portal cannot apply are applied by the actor.** Keyword, ministry and
  organization for tenders, and ministry, organization, method and district for awards,
  are matched on the newest records. For awards, a run with such filters reads at most the
  newest 50,000 awards; add `signedSince` or a keyword to reach further back.
- **Award titles have no commas**: the award list strips them from package descriptions
  (for example `25000 Copies` for `25,000 Copies`). The award page keeps the original.
- **Garbled characters are the portal's own**: some descriptions contain mis-encoded
  characters (such as `â??`) in the portal itself; the actor keeps them as published.
- **The tender list has no district and the award list has no procurement nature**, so
  those filters apply to one record type each.
- **Advertisement time**: a few awards carry free text instead of a date; `advertisedAt`
  is then `null`.
- Method names are given only where the portal spells them out; `DC`, `CSO`, `RFQU` and
  `RFQL` have a `null` `methodLabel`.
- The lists are read newest first while the portal keeps publishing; a record that moves
  between pages during a run is stored once.

# Changelog

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

# Actor input Schema

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

Live tenders (the default): every tender currently open on e-GP. Contract awards: awarded contracts from the Notification of Award list, newest contract signing first. One run returns one record type.

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

Tenders: matched against the title, reference number and tender ID. Awards: matched by the portal against the package description (title). Case-insensitive; leave empty for all records.

## `ministry` (type: `string`):

Only records whose ministry contains this text, e.g. "Health" or "Ministry of Education". Case-insensitive. Leave empty for all ministries.

## `organization` (type: `string`):

Only records whose division, organization or procuring entity contains this text, e.g. "LGED", "Bangladesh Railway" or "Roads and Highways". Case-insensitive. (The award list names the division and procuring entity only.)

## `procurementNature` (type: `string`):

Tenders only: goods, works, services or physical services. Leave empty for all. Ignored for awards (the award list does not show it).

## `method` (type: `string`):

Only records under this procurement method. Leave empty for all methods.

## `district` (type: `string`):

Awards only: the district of the procuring entity, as the portal spells it. Ignored for tenders (the tender list does not show it).

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

Tenders only: keep tenders published after this point. A relative span like "24 hours" or "7 days", a date like "2026-09-20" (midnight Bangladesh time) or an ISO-8601 timestamp. Leave empty for every live tender.

## `signedSince` (type: `string`):

Awards only: keep contracts signed on or after the Bangladesh calendar day of this point. A relative span like "7 days", a date like "2026-09-01" or an ISO-8601 timestamp. Leave empty to start from the newest award with no lower bound.

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

Stop after storing this many tenders or awards (newest first).

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

Optional. The actor talks to eprocure.gov.bd directly; use Apify Proxy only if runs fail with connection errors.

## Actor input object example

```json
{
  "recordType": "tenders",
  "keyword": "",
  "ministry": "",
  "organization": "",
  "publishedSince": "",
  "signedSince": "",
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Filled by runs with recordType "tenders" (the default): one item per live tender matching the input filters, newest publication first: tender ID, reference number, title, procurement nature, type and method, ministry, division, organization and procuring entity, publication and closing times in Bangladesh time (+06:00), status and a link to the notice page.

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

Filled by runs with recordType "awards": one item per awarded contract (lot), newest contract signing first: tender and lot IDs, reference number, title, ministry and division, procuring entity, method, district, advertisement time, signing date, the contractor it was awarded to and the contract value in BDT (and in crore as published), with a link to the award page.

# 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 = {
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("a-g-d/bd-egp").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 = {
    "maxItems": 20,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("a-g-d/bd-egp").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 '{
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call a-g-d/bd-egp --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,a-g-d/bd-egp"
        }
    }
}
```

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/WjFpnXhOqjv0qeMdi/builds/twhKoNGbUvHnKP8JF/openapi.json
