# Vietnam Tender Intelligence (`donerightlabs/tender-intelligence`) Actor

Monitor Vietnam's national e-procurement portal (VNEPS) by keyword — get matching tenders (title, deadline, location) automatically. Theo dõi đấu thầu công Việt Nam theo từ khoá, tự động cập nhật.

- **URL**: https://apify.com/donerightlabs/tender-intelligence.md
- **Developed by:** [donerightlabs](https://apify.com/donerightlabs) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $500.00 / 1,000 keyword searcheds

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?

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

### Quick summary (English)

Monitors Vietnam's national e-procurement portal ([VNEPS](https://muasamcong.mpi.gov.vn)) by keyword and returns matching tenders as clean JSON: notice number, tender name, closing date, location, investment field.

**Input:** `keywords` (array of strings, required), `maxResultsPerKeyword` (integer, default 3), `onlyOpenTenders` (boolean, default `true` — only tenders still open for bidding).

**Pricing:** Pay-per-event — $0.05 per run + $0.50 per keyword searched (charged whether or not matches are found).

**Output field reference** (JSON keys are Vietnamese procurement terminology — real tender records never carry a `trang_thai` field; records that do are status/error notices, not tenders):

| JSON key | Meaning |
|---|---|
| `tu_khoa` | The keyword that matched this record |
| `ma_thong_bao` | Tender notice number (TBMT) |
| `ten_goi_thau` | Tender/package name |
| `hinh_thuc_du_thau` | Bidding method |
| `phuong_thuc_lua_chon` | Contractor selection method |
| `ngay_dong_thau` | Bid closing date/time (ISO 8601) |
| `linh_vuc_dau_tu` | Investment field (goods/construction/services) |
| `dia_diem` | Province/district |
| `trang_thai` | Only present on non-tender records: `loi_ky_thuat` (technical error, see `chi_tiet_loi`) or `co_the_con_du_lieu` (more results may exist beyond the limit, see `ghi_chu`) |

Full documentation below is in Vietnamese (the target user base for this Actor). The Input/Output schema tabs on this page are language-neutral and machine-readable.

***

### What does Vietnam Tender Intelligence do?

Vietnam Tender Intelligence giám sát thông tin đấu thầu công theo từ khoá trên
**Hệ thống mạng đấu thầu quốc gia (VNEPS)** — [muasamcong.mpi.gov.vn](https://muasamcong.mpi.gov.vn),
cổng đấu thầu chính thức của Bộ Tài chính Việt Nam. Actor trả về dữ liệu gói thầu dạng JSON sạch:
tên gói thầu, mã thông báo, ngày đóng thầu, địa điểm, lĩnh vực đầu tư.

### Why use Vietnam Tender Intelligence?

- Tự động hoá việc theo dõi gói thầu theo từ khoá, tính chi phí theo lượt dùng thực tế thay vì
  trả phí thuê bao cố định.
- Phù hợp cho: nhà thầu nhỏ muốn tự động dò gói thầu phù hợp ngành hàng, nhà cung cấp muốn theo
  dõi thị trường theo từ khoá cụ thể.
- Chạy trên Apify: có sẵn API, lịch chạy định kỳ (ví dụ chạy mỗi sáng để nhận gói thầu mới),
  tích hợp Zapier/Make/webhook.

### How to use Vietnam Tender Intelligence

1. Mở tab **Input**.
2. Nhập danh sách từ khoá cần theo dõi (ví dụ: "thiết bị y tế", "thi công sửa chữa").
3. Bấm **Start**.
4. Xem/tải kết quả ở tab **Output**.

### Input

| Trường | Kiểu | Mô tả |
|---|---|---|
| `keywords` | mảng chuỗi | Danh sách từ khoá gói thầu cần theo dõi |
| `maxResultsPerKeyword` | số | Giới hạn số gói thầu lấy về mỗi từ khoá (mặc định 3 — tăng lên nếu cần nhiều kết quả hơn) |
| `onlyOpenTenders` | true/false | Bật: chỉ lấy gói còn mở (mặc định). Tắt: lấy cả gói đã đóng thầu trong quá khứ |

```json
{
  "keywords": ["thiết bị y tế"],
  "maxResultsPerKeyword": 20
}
```

### Output

```json
{
  "tu_khoa": "thiết bị y tế",
  "ma_thong_bao": "IB2600407966",
  "ten_goi_thau": "Gói thầu số 100: Cung cấp, lắp đặt thiết bị y tế nhóm Điều trị - Can thiệp",
  "hinh_thuc_du_thau": "DTRR",
  "phuong_thuc_lua_chon": "1_MTHS",
  "ngay_dong_thau": "2026-09-09T09:00:00",
  "linh_vuc_dau_tu": "HH",
  "dia_diem": "Tỉnh Cà Mau - Phường Hòa Thành"
}
```

Có thể tải dataset dạng JSON, CSV, Excel, HTML.

#### Bản ghi đặc biệt (quan trọng nếu bạn xử lý dữ liệu tự động / bằng AI Agent)

Ngoài các bản ghi gói thầu bình thường ở trên, dataset có thể chứa 2 loại bản ghi đặc biệt — nhận diện qua field `trang_thai` (các bản ghi gói thầu bình thường KHÔNG có field này):

| `trang_thai` | Ý nghĩa | Field đi kèm |
|---|---|---|
| `loi_ky_thuat` | Từ khoá này gặp lỗi khi chạy, không lấy được dữ liệu | `chi_tiet_loi` |
| `co_the_con_du_lieu` | Đã lấy đúng bằng số lượng giới hạn (`maxResultsPerKeyword`) — có thể còn gói thầu khác chưa lấy hết | `ghi_chu` |

**Lưu ý về giới hạn 200 kết quả/từ khoá:** mỗi lần chạy chỉ lấy tối đa 200 gói thầu cho mỗi từ khoá (giới hạn kỹ thuật, không phân trang). Nếu 1 từ khoá thực tế có nhiều hơn 200 kết quả phù hợp, bạn sẽ thấy bản ghi `co_the_con_du_lieu` — khi đó có thể thu hẹp từ khoá (cụ thể hơn) thay vì chạy lại toàn bộ với số lượng lớn hơn, để tránh tốn thêm chi phí không cần thiết.

#### Bảng các trường dữ liệu

| Trường | Ý nghĩa |
|---|---|
| `tu_khoa` | Từ khoá bạn đã tra |
| `ma_thong_bao` | Số thông báo mời thầu (TBMT) |
| `ten_goi_thau` | Tên gói thầu |
| `hinh_thuc_du_thau` | Hình thức lựa chọn nhà thầu |
| `phuong_thuc_lua_chon` | Phương thức lựa chọn nhà thầu |
| `ngay_dong_thau` | Thời điểm đóng thầu |
| `linh_vuc_dau_tu` | Lĩnh vực đầu tư (hàng hoá/xây lắp/dịch vụ...) |
| `dia_diem` | Tỉnh/quận nơi thực hiện gói thầu |

**⚠️ Cam kết dữ liệu:** Actor chỉ xuất dữ liệu cấp gói thầu/hợp đồng (công khai theo quy định
đấu thầu) — không thu thập tên, số điện thoại, hay bất kỳ thông tin cá nhân nào.

### Pricing / chi phí ước tính

Actor tính phí theo mô hình **Pay-Per-Event** — chỉ trả cho đúng phần đã dùng, không có phí thuê bao cố định:

| Sự kiện | Khi nào tính phí | Giá |
|---|---|---|
| Search Session Start | 1 lần/lượt chạy | $0.05 |
| Keyword Searched | Mỗi từ khoá được xử lý (kể cả khi 0 kết quả) | $0.50 |

Ví dụ: chạy 1 lần với 5 từ khoá = $0.05 + 5 × $0.50 = **$2.55**.

### Tips

- **Không nên tắt hoặc đổi loại Proxy khỏi mặc định (Residential, Việt Nam).** Actor cần đúng loại này để kết nối ổn định tới hệ thống nguồn — tắt proxy hoặc đổi sang loại khác (Datacenter, không có tuỳ chọn IP Việt Nam) sẽ khiến actor gần như chắc chắn thất bại hoàn toàn. Nếu không truyền field `proxyConfiguration` khi gọi actor (qua API/AI Agent), giá trị mặc định đúng sẽ tự động được áp dụng.
- Mỗi lần chạy có chi phí thời gian khởi động cố định (~20-30 giây) cộng thêm thời gian xử lý từng từ khoá (thường 40 giây - 2 phút/từ khoá). Nếu cần kết quả nhanh (ví dụ tích hợp với AI Agent, ứng dụng thời gian thực), nên gọi **1-3 từ khoá/lần** thay vì nhồi nhiều từ khoá vào 1 lần chạy — thời gian tăng tuyến tính theo số từ khoá.

### FAQ

**Actor này có hợp pháp không?**
Dữ liệu lấy từ hệ thống đấu thầu công khai chính thức của Bộ Tài chính, chỉ trả về thông tin
gói thầu đã công bố công khai (không phải dữ liệu cá nhân).

**Kết quả không đầy đủ 100% có được hoàn tiền không?**
Do phụ thuộc vào tình trạng kết nối của hệ thống nguồn, thỉnh thoảng 1 từ khoá có thể gặp lỗi kỹ thuật tạm thời (xem bản ghi `trang_thai: loi_ky_thuat` trong Output). Nếu gặp tỷ lệ lỗi cao bất thường, vui lòng liên hệ qua tab Issues.

# Actor input Schema

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

Từ khoá gói thầu cần theo dõi trên Hệ thống mạng đấu thầu quốc gia (VNEPS), ví dụ: "thiết bị y tế".

## `maxResultsPerKeyword` (type: `integer`):

Giới hạn số gói thầu lấy về cho mỗi từ khoá.

## `onlyOpenTenders` (type: `boolean`):

Bật: chỉ trả về gói thầu có ngày đóng thầu từ hôm nay trở đi. Tắt: trả về cả gói đã đóng thầu trong quá khứ (hữu ích nếu muốn xem lịch sử/phân tích xu hướng).

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

Khuyến nghị bật Residential Proxy (Việt Nam) để tăng độ ổn định kết nối.

## Actor input object example

```json
{
  "keywords": [
    "thiết bị"
  ],
  "maxResultsPerKeyword": 3,
  "onlyOpenTenders": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyCountry": "VN"
  }
}
```

# Actor output Schema

## `results` (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 = {
    "keywords": [
        "thiết bị"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("donerightlabs/tender-intelligence").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 = { "keywords": ["thiết bị"] }

# Run the Actor and wait for it to finish
run = client.actor("donerightlabs/tender-intelligence").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 '{
  "keywords": [
    "thiết bị"
  ]
}' |
apify call donerightlabs/tender-intelligence --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,donerightlabs/tender-intelligence"
        }
    }
}

```

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/fkzE7LzvaTUO9RC3O/builds/0vCufFEwbLNM851kl/openapi.json
