# Thai Government Procurement (e-GP) & New Company Feed (`chatuporn/thai-procurement-company-feed`) Actor

Clean Thai government procurement contracts (e-GP, FY2558-2568) linked to DBD company registrations: winner age, capital and dissolution, risk signals such as brand-new winners, and the contracts won by each new company. Official open data only.

- **URL**: https://apify.com/chatuporn/thai-procurement-company-feed.md
- **Developed by:** [Chatuporn Duangthong](https://apify.com/chatuporn) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.003 / result

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## Thai Government Tender Alerts & Procurement Data (e-GP + DBD)

**Get new Thai government tenders within minutes** (invitations to bid, draft TORs, reference prices, winners) filtered by your keywords and sent to Slack, Discord, Telegram, LINE or your own webhook. Plus clean, English-keyed data on **Thai government procurement contracts** and **new / dissolved Thai companies**, straight from the official open-data portals, **linked to each other**: see how old a contract winner was when it signed, and which brand-new companies are already winning government work. No scraping, no logins, no API keys.

| Mode | Source | Coverage |
|---|---|---|
| Tender alerts | The official e-GP announcement feed of the Comptroller General's Department | New announcements, collected every few minutes, kept for 45 days |
| Procurement contracts | e-GP contract datasets published by DGA on [data.go.th](https://data.go.th) | Fiscal years 2565–2568 (Oct 2021 – Sep 2025), about 4–5 million contracts per year |
| New / dissolved companies | Monthly juristic-person files from [Open-DBD](https://opendata.dbd.go.th) | Every month since January 2022 |

### Tender alerts

Pick **Tender alerts** as *What to fetch*, add your keywords, and schedule the Actor (for example every hour, in Apify Console → Schedules). Each announcement is sent once.

- **What you get:** invitations to bid (ประกาศเชิญชวน), draft TORs open for comment (ร่างเอกสารประกวดราคา), reference prices, procurement plans, winner announcements, cancellations and changes. Choose the types you want; the default is draft TORs and invitations.
- **Keyword matching that works in Thai.** Spaces and letter case are ignored, so `กล้องวงจรปิด` also matches `กล้อง วงจรปิด`. Add exclude words to cut noise.
- **Track competitors with contract data.** To follow what a company wins, use *Procurement contracts* with *Winner name contains* and *Only items not delivered before*: contracts come with the winner, price and DBD company details.
- **Delivered where you work.** Slack or Discord webhook, Telegram bot, LINE Official Account (Messaging API), or any URL as JSON. Every alert is also in the run's dataset, so Apify integrations (email, Google Sheets, Zapier, Make) work too.
- **English labels.** Announcement types and procurement methods come in Thai and English (`announcementTypeEn`, `procurementMethodEn`); titles stay in Thai as published.
- **Pay per alert.** You pay for each alert delivered plus a small start fee per run; a run that finds nothing new costs only the start fee.

**Alert me about CCTV and computer tenders, but not rentals**

```json
{ "mode": "tenderAlerts", "alertKeywords": ["กล้องวงจรปิด", "CCTV", "คอมพิวเตอร์"], "alertExcludeKeywords": ["เช่า"], "telegramBotToken": "...", "telegramChatId": "..." }
```

**Road construction invitations in Chiang Mai, e-bidding only**

```json
{ "mode": "tenderAlerts", "alertKeywords": ["ก่อสร้างถนน"], "alertAgencyContains": "เชียงใหม่", "alertTypes": ["D0"], "alertMethods": ["e-bidding"] }
```

**Draft TORs for medical equipment, to a Slack channel**

```json
{ "mode": "tenderAlerts", "alertKeywords": ["ครุภัณฑ์การแพทย์", "เครื่องมือแพทย์"], "alertTypes": ["B0"], "webhookUrl": "https://hooks.slack.com/services/..." }
```

### Why use this instead of the raw files?

The raw files are hard to use. This Actor fixes them for you:

- **Shifted columns fixed.** In the FY2568 files, every value after the province sits three columns early (the tax ID is in the "coordinates" column, the contract amount is in the "contract no." column, and so on). The Actor detects the layout row by row and puts every value back in the right field.
- **Thai dates → ISO dates.** `21 มิ.ย. 67`, `1-ก.พ.-67` and `2569-09-09` all become `2024-06-21`-style dates in the Gregorian calendar.
- **Tax IDs repaired or flagged.** Leading zeros lost by numeric columns are restored. IDs the publisher damaged (`1.05543E+11`) are flagged as `corrupted_in_source` instead of being passed on as wrong numbers.
- **Fast search from a pre-built index.** Indexed fiscal years are served from a cleaned copy of the e-GP files, split by year and province, with a lookup table of contract winners. A province search returns in seconds instead of minutes, and a keyword can be searched across the whole country.
- **Thai keyword search that works.** The portal's own search can't split Thai words, so it misses most matches (in a test, 1 hit instead of 13). The Actor matches Thai text itself.
- **Contracts linked to company registrations.** Every contract won by a company gets a `winnerCompany` object: legal form and registration year (read from the registration number, even when the source damaged it), and for companies registered or dissolved since January 2022 the DBD registration date, capital, business objective and dissolution date. Each company in the company modes gets a `govContracts` summary of the contracts it won.
- **Risk signals.** Filter for contracts whose winner was less than a year old, registered after the project was announced, or dissolved before the contract ended. These are signals for review, not proof of wrongdoing.
- **DBD dates fixed.** The monthly DBD files mix five date formats, swap day and month in some months, and pad files with empty rows. The Actor reads them all correctly and drops the empty rows.
- **Privacy built in.** Contracts won by private individuals are always returned without a name or ID (`winnerType: "individual"`), and are never linked to anything.
- **Alerts.** Turn on **Only items not delivered before** and schedule the Actor: each run returns only what earlier runs with the same filters have not returned yet.

### Examples

**All CCTV purchases in Chiang Rai, FY2568**

```json
{ "mode": "procurement", "fiscalYears": [2568], "province": "เชียงราย", "keyword": "กล้องวงจรปิด" }
```

**Every contract a company won since FY2565** (FY2568 supports tax ID; older years need the name)

```json
{ "mode": "procurement", "fiscalYears": [2565, 2566, 2567, 2568], "winnerName": "พอร์ทัลเน็ท" }
```

**Construction contracts above 50 million baht from one agency**

```json
{ "mode": "procurement", "fiscalYears": [2568], "agency": "กรมทางหลวงชนบท", "projectType": "จ้างก่อสร้าง", "minAmountThb": 50000000 }
```

**New IT companies in Bangkok, last 3 months** (objective codes starting with 62)

```json
{ "mode": "newCompanies", "lastMonths": 3, "province": "กรุงเทพมหานคร", "objectiveCodePrefixes": ["62"] }
```

**Monthly alert of dissolved companies with capital ≥ 5 million baht** (schedule monthly)

```json
{ "mode": "dissolvedCompanies", "minCapitalThb": 5000000, "onlyNew": true }
```

**Contracts won by companies less than a year old, nationwide**

```json
{ "mode": "procurement", "fiscalYears": [2567, 2568], "riskFlags": ["company_under_1_year_at_contract"] }
```

**Companies registered in the last 3 years that already won government contracts**

```json
{ "mode": "newCompanies", "lastMonths": 36, "onlyWithGovContracts": true }
```

**Dissolved contractors, with contracts still running when they dissolved**

```json
{ "mode": "dissolvedCompanies", "lastMonths": 60, "onlyWithGovContracts": true }
```

### Output

#### Tender alert

```json
{
  "announcementId": "4f0c5d0b8f1a2e3c9d7b",
  "announcementType": "D0",
  "announcementTypeTh": "ประกาศเชิญชวน",
  "announcementTypeEn": "Invitation to bid",
  "projectId": "69109356032",
  "title": "ประกวดราคาจ้างก่อสร้างถนนคอนกรีตเสริมเหล็ก หมู่ที่ 5 ด้วยวิธีประกวดราคาอิเล็กทรอนิกส์ (e-bidding)",
  "procurementMethod": "ประกวดราคาอิเล็กทรอนิกส์ (e-bidding)",
  "procurementMethodEn": "e-bidding",
  "announcedDate": "2026-11-02",
  "documentUrl": "https://process5.gprocurement.go.th/egp-template-service/dwnt/view-pdf-file?templateId=...",
  "firstSeenAt": "2026-11-02T02:15:04+00:00",
  "matchedKeywords": ["ก่อสร้างถนน"]
}
```

The feed gives the title, method, date, project number and a link to the announcement document. Agency and place names usually appear in the title, which keywords and *Agency or place contains* search. The project number is the same one used later in the contract data.

#### Procurement contract

```json
{
  "projectId": "68029406709",
  "projectName": "ประกวดราคาจ้างก่อสร้างอาคารผู้ป่วยนอก ...",
  "projectType": "จ้างก่อสร้าง",
  "agency": "โรงพยาบาลเชียงรายประชานุเคราะห์",
  "procurementMethod": "ประกวดราคาอิเล็กทรอนิกส์ (e-bidding)",
  "fiscalYearBE": 2568,
  "fiscalYearCE": 2025,
  "budgetThb": 332232400,
  "referencePriceThb": 331651733.93,
  "agreedPriceThb": 321800000,
  "province": "เชียงราย",
  "district": "เวียงป่าเป้า",
  "projectStatus": "ระหว่างดำเนินการ",
  "latitude": 19.9021,
  "longitude": 99.8287,
  "winnerType": "juristic",
  "winnerTaxId": "0103513015053",
  "winnerTaxIdQuality": "ok",
  "winnerName": "ห้างหุ้นส่วนจำกัด จ. ธนุกิจ",
  "contractNo": "284/2568",
  "contractSignedDate": "2025-08-13",
  "contractEndDate": "2028-07-28",
  "contractAmountThb": 321800000,
  "sourceLayout": "fy2568_shifted",
  "winnerCompany": {
    "registrationNo": "0103513015053",
    "legalForm": "limited_partnership",
    "registeredYearBE": 2513,
    "registeredYearSource": "registrationNo",
    "dbdName": null,
    "registeredDate": null,
    "registeredCapitalThb": null,
    "dissolvedDate": null,
    "matchedBy": null,
    "companyAgeDaysAtContract": null,
    "contractToCapitalRatio": null
  },
  "riskFlags": [],
  "source": { "publisher": "...", "portal": "https://data.go.th", "license": "Creative Commons Attribution (CC BY)" }
}
```

`winnerTaxIdQuality` is one of `ok`, `corrupted_in_source`, `masked_in_source`, `missing`, `invalid` or `redacted_individual`. When it is `corrupted_in_source`, `winnerTaxIdDamaged` keeps the damaged value (`1.05543E+11`), which still shows the legal form and registration year.

**`winnerCompany`** is `null` for individuals. For a winner found in the DBD files it also has `dbdName`, `registeredDate`, `registeredCapitalThb`, `objectiveCode`, `objective`, `province` and `dissolvedDate`, plus:

- `matchedBy`: `taxId`, or `name` for years whose source lost the tax IDs. A name match is used only when the name is unique among DBD companies, the company existed when the contract was signed, and its number agrees with what is left of the damaged ID. In a check on FY2568, where both are known, name matching picked the right company in 1,308 of 1,308 cases.
- `companyAgeDaysAtContract`: days from registration to contract signing.
- `contractToCapitalRatio`: contract amount divided by registered capital.

**`riskFlags`** can contain `company_under_1_year_at_contract`, `registered_after_project_announced`, `company_dissolved` and `dissolved_before_contract_end`.

#### Company registration

```json
{
  "registrationNo": "0103569010090",
  "name": "หจ.กริศน์ ดาต้า",
  "eventType": "registration",
  "eventDate": "2026-09-11",
  "registeredCapitalThb": 100000,
  "objectiveCode": "62023",
  "objective": "ประกอบกิจการที่ปรึกษาด้านเทคโนโลยีสารสนเทศ ...",
  "address": "1548/43 ซอย พหลโยธิน 34",
  "subdistrict": "เสนานิคม",
  "district": "จตุจักร",
  "province": "กรุงเทพมหานคร",
  "postcode": "10900",
  "month": "2026-09",
  "govContracts": null
}
```

**`govContracts`** is `null` when the company won nothing in the indexed years. Otherwise:

```json
{
  "contracts": 10,
  "totalThb": 3353216469.0,
  "firstContractSignedDate": "2024-04-09",
  "lastContractSignedDate": "2025-06-04",
  "daysFromRegistrationToFirstContract": 77,
  "byFiscalYear": { "2567": { "contracts": 4, "totalThb": 235382489.0 }, "2568": { "contracts": 6, "totalThb": 3117833980.0 } },
  "matchedBy": "taxId",
  "recentContracts": [ { "projectId": "66089621472", "projectName": "...", "agency": "การไฟฟ้าส่วนภูมิภาค", "contractSignedDate": "2025-06-04", "contractAmountThb": 2938220000.0, "fiscalYearBE": 2568 } ]
}
```

Dissolved companies also get `contractsEndingAfterDissolution`.

### Good to know

- **How fresh are alerts?** The Actor's publisher reads the official e-GP feed every few minutes and keeps every new announcement for 45 days. Your scheduled run picks up whatever arrived since your last run. When the e-GP feed is down, the run log says how old the latest data is.
- **Coverage of alerts.** Alerts come from the public e-GP announcement feed, which shows the latest announcements of each type nationwide. It does not list every announcement of every agency, so treat alerts as an early-warning feed, not a complete register; every contract still appears later in the procurement contract mode, with the winner and price.
- **Freshness follows the publisher.** e-GP files on data.go.th are refreshed in batches (the FY2568 file was last updated in July 2026). FY2569 will appear when DGA publishes it; the Actor picks up new years automatically, and the index is checked for changed files every month. DBD files are monthly.
- **Speed.** Searches on indexed years by province or winner usually finish in seconds. A keyword search across a whole country-year reads every row of that year and takes a few minutes.
- **Coverage follows the index.** The portals do not accept requests from cloud servers, so the Actor answers from its pre-built copy of the data, refreshed monthly. A search for a fiscal year that is not in the copy stops with a message listing the years that are.
- **Tax IDs for FY2565–2567.** Most winner IDs in those source files were damaged before publication. Search those years by winner name; company links for those years are matched by name (see `matchedBy`).
- **Thai names.** Province, agency and project type must match the Thai spelling used in e-GP, e.g. `กรุงเทพมหานคร`, not `Bangkok`.
- **What the company link covers.** DBD publishes monthly files of registrations and dissolutions since January 2022, so registration dates, capital and objectives are known for companies registered since then, and dissolution dates for companies dissolved since then. Older companies still get their legal form and registration year from the registration number. Company links and risk flags come from the pre-built index.
- **Risk signals are not accusations.** A young winner can be a legitimate new subsidiary or a partnership converted to a company. Check the source records before drawing conclusions.

### Data sources and licences

- Tender alerts: the public e-GP announcement feed and announcement pages of กรมบัญชีกลาง (Comptroller General's Department), gprocurement.go.th.
- e-GP procurement contracts: สำนักงานพัฒนารัฐบาลดิจิทัล (องค์การมหาชน) / ภาษีไปไหน, with data from the Comptroller General's Department, published on data.go.th under **Creative Commons Attribution**.
- Juristic-person registrations: กรมพัฒนาธุรกิจการค้า, published on opendata.dbd.go.th under **Open Data Common**.

Every output row carries a `source` field with the publisher and licence. Please keep the attribution when you republish the data.

This Actor is not affiliated with or endorsed by any Thai government agency.

# Actor input Schema

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

Government procurement contracts from e-GP, fresh tender announcements for alerts, or monthly company registrations from the Department of Business Development (DBD).

## `fiscalYears` (type: `array`):

Thai fiscal years, e.g. 2568 = Oct 2024 - Sep 2025. Available: 2565-2568.

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

Thai or English, e.g. คอมพิวเตอร์, ถนน, CCTV.

## `winnerTaxId` (type: `string`):

Juristic person ID of the winning company. Note: the FY2565-2567 source files damaged most IDs, so use winner name for those years.

## `winnerName` (type: `string`):

Part of the winning company's Thai name, e.g. พอร์ทัลเน็ท.

## `agency` (type: `string`):

e.g. การไฟฟ้าส่วนภูมิภาค

## `projectType` (type: `string`):

Exact e-GP project type.

## `minAmountThb` (type: `integer`):

Agreed price (or budget if missing).

## `maxAmountThb` (type: `integer`):

Agreed price (or budget if missing).

## `excludeIndividuals` (type: `boolean`):

Contracts won by private individuals are always redacted (no name, no ID). Turn this on to drop them entirely.

## `riskFlags` (type: `array`):

Keep a contract when its winner shows at least one of these signals in the DBD company files. These are signals for review, not evidence of wrongdoing. Needs the pre-built index; covers winners registered or dissolved since January 2022.

## `alertKeywords` (type: `array`):

Alert when the announcement title contains any of these, e.g. คอมพิวเตอร์, กล้องวงจรปิด, CCTV, ก่อสร้างถนน, จังหวัดเชียงใหม่. Spaces and letter case are ignored. Empty = every announcement of the chosen types.

## `alertExcludeKeywords` (type: `array`):

Skip announcements whose title contains any of these.

## `alertTypes` (type: `array`):

Empty = draft TORs and invitations to bid.

## `alertMethods` (type: `array`):

Empty = every method.

## `alertAgencyContains` (type: `string`):

e.g. กรมทางหลวง, เทศบาล, เชียงใหม่. Checked against the announcement title.

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

How many days of announcements to check. With 'Only new alerts' on, each announcement is sent once.

## `alertOnlyNew` (type: `boolean`):

Send each announcement once across scheduled runs with the same filters.

## `webhookUrl` (type: `string`):

Slack and Discord webhook URLs get readable messages; any other URL gets a JSON POST with all alerts. Optional: alerts are always in the dataset, and you can also use Apify integrations (email, Zapier, Make).

## `telegramBotToken` (type: `string`):

From @BotFather. Needs the chat ID below.

## `telegramChatId` (type: `string`):

Your chat, group or channel ID.

## `lineChannelAccessToken` (type: `string`):

Messaging API channel access token of your LINE Official Account. Needs the recipient ID below.

## `lineTo` (type: `string`):

The user ID (U...) or group ID (C...) to push alerts to.

## `province` (type: `string`):

Applies to both modes, e.g. เชียงราย, กรุงเทพมหานคร.

## `months` (type: `array`):

YYYY-MM in CE or BE, e.g. 2026-09 or 2569-09. Leave empty to use the latest months.

## `lastMonths` (type: `integer`):

How many of the most recent monthly DBD files to read.

## `objectiveCodePrefixes` (type: `array`):

DBD objective codes (TSIC-based), e.g. 62 for IT services, 41 for building construction.

## `minCapitalThb` (type: `integer`):

Keep companies with at least this registered capital.

## `nameContains` (type: `string`):

Part of the company's Thai name.

## `onlyWithGovContracts` (type: `boolean`):

Keep only companies found as winners in the indexed e-GP years. Every company comes with a govContracts summary when the index is available.

## `onlyNew` (type: `boolean`):

Remembers what earlier runs with the same filters returned. Use with a schedule for alerts.

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

0 = no limit.

## `useIndex` (type: `boolean`):

Keep this on. The Actor answers from its pre-built copy of the data; the portals do not accept requests from cloud servers.

## `linkCompanies` (type: `boolean`):

Adds winnerCompany and riskFlags to contracts, and govContracts to companies. Turn off for the plain source fields only.

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

Not needed for these official portals. Leave off.

## `buildIndex` (type: `boolean`):

Publisher only. Ignored without the admin key.

## `adminKey` (type: `string`):

Publisher only.

## `collectLive` (type: `boolean`):

Publisher only. Ignored without the admin key.

## `collectStore` (type: `string`):

Publisher only. The key-value store the collector writes to.

## `collectDeptCodes` (type: `array`):

Publisher only. 4-digit e-GP department codes polled in addition to the national feeds.

## `buildFiscalYears` (type: `array`):

Empty = every year on data.go.th.

## `forceRebuild` (type: `boolean`):

Publisher only. Re-download files even if data.go.th did not change them.

## `buildCompanyLinks` (type: `boolean`):

Publisher only. Match contract winners to DBD companies after building.

## `buildMaxFilesPerYear` (type: `integer`):

Publisher only, for testing.

## `buildMaxRowsPerFile` (type: `integer`):

Publisher only, for testing.

## Actor input object example

```json
{
  "mode": "procurement",
  "fiscalYears": [
    2568
  ],
  "excludeIndividuals": false,
  "lookbackDays": 2,
  "alertOnlyNew": true,
  "lastMonths": 1,
  "onlyWithGovContracts": false,
  "onlyNew": false,
  "maxItems": 1000,
  "useIndex": true,
  "linkCompanies": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "buildIndex": false,
  "collectLive": false,
  "forceRebuild": false,
  "buildCompanyLinks": true
}
```

# Actor output Schema

## `results` (type: `string`):

Every item of the run: contracts in procurement mode, companies in the company modes.

## `procurement` (type: `string`):

Table view of contracts: project, agency, province, amounts, winner and dates.

## `riskSignals` (type: `string`):

Contracts with the winner's registration date, age at contract, capital, dissolution date and risk flags.

## `tenderAlerts` (type: `string`):

New e-GP announcements that matched your alert filters: type, title, method, project number and a link to the announcement.

## `companies` (type: `string`):

New or dissolved companies with their government-contract summary.

# 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 = {
    "fiscalYears": [
        2568
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("chatuporn/thai-procurement-company-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 = { "fiscalYears": [2568] }

# Run the Actor and wait for it to finish
run = client.actor("chatuporn/thai-procurement-company-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 '{
  "fiscalYears": [
    2568
  ]
}' |
apify call chatuporn/thai-procurement-company-feed --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,chatuporn/thai-procurement-company-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/0x3wlFNBxFiqmvDHG/builds/oWg1ECSyYBfLih5uD/openapi.json
