Malaysia Government Tenders API — MyProcurement, English-Keyed
Pricing
from $2.00 / 1,000 records
Malaysia Government Tenders API — MyProcurement, English-Keyed
Malaysian government tenders, quotations, requisitions and award results from MyProcurement (Ministry of Finance) — English field names, original Malay values, optional detail-page enrichment (eligibility, document price, briefing dates).
Pricing
from $2.00 / 1,000 records
Rating
0.0
(0)
Developer
Celest Jux
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Structured, English-keyed feed of Malaysian government procurement notices from the official MyProcurement portal (myprocurement.treasury.gov.my), operated by the Kementerian Kewangan (Ministry of Finance) — English field names over the original Malay values, with optional detail-page enrichment: eligibility text, document-sale price, and briefing/site-visit dates.
Pengiklanan perolehan kerajaan Malaysia — iklan tender, sebut harga, requisition dan keputusan, dalam format berstruktur.
What you get
| Field | Type | Notes |
|---|---|---|
id | string | Portal hash id (from the detail URL) |
type | enum | tender / quotation / requisition / result_tender / result_quotation |
referenceNo | string | Tender / quotation number as published |
title | string | Original Malay title |
ministry | string?null | As shown on the portal (Malay, uppercase) |
agency | string?null | As shown on the portal |
procurementCategory | string?null | Bekalan / Kerja / Perkhidmatan Bukan Perunding / Perkhidmatan Perunding |
kodBidang | string[]?null | Field codes, e.g. ["B01","B04"] |
advertisedDate | date?null | ISO YYYY-MM-DD |
closingDate | date?null | ISO YYYY-MM-DD |
resultDate | date?null | Award decision date (result types) |
displayedResultDate | date?null | Date the result was published (result types) |
indicativePriceMYR | number?null | null when the portal shows "Tiada Maklumat" |
awardees | array?null | [{name, acceptedPriceMYR}] (result types) |
briefings | array | [{date, venue, note?}] — note when details enabled |
siteVisits | array | [{date, venue, note?}] |
detailUrl | string | Absolute portal URL |
scrapedAt | datetime | ISO 8601 UTC |
extraFields | object | Any other label/value pairs the portal exposed — nothing is dropped |
With Include detail pages on, each record is enriched from its detail page:
| Field | Notes |
|---|---|
submissionOffice | Tempat Tender Diterima |
eligibilityText | Taraf Kelayakan (free text, e.g. CIDB registration) |
twoEnvelope | true / false / null |
notes | Catatan Iklan |
description | Deskripsi Perolehan |
documentSale | {place, date, priceMYR, paymentMethod} |
centreResponsible, validityPeriodDays, advertisementLocality, ... | Quotation-specific fields |
mofRegistrationNo, rocRegistrationNo, acceptanceLetterDate | Awardee registration (result detail pages) |
Missing values are null — never empty strings, never invented.
Input
{"types": ["tender", "quotation"],"keyword": "SEKOLAH","includeDetails": true,"onlyNew": true,"maxItems": 1000}
| Key | Type | Default | Notes |
|---|---|---|---|
types | array | ["tender","quotation"] | Any of: tender, quotation, requisition, result_tender, result_quotation |
keyword | string | — | Title contains (portal-side filter) |
ministries | array | — | Exact names from the portal dropdown — see below |
procurementCategories | array | — | Bekalan / Kerja / Perkhidmatan Bukan Perunding / Perkhidmatan Perunding |
kodBidang | array | — | e.g. ["B01"] or ["060101"] — each value is a separate portal query |
advertisedFrom / advertisedTo | date | — | YYYY-MM-DD, Tarikh Pelawaan range (advertisements only) |
closingAfter | date | — | Skip notices closing on/before this (client-side) |
includeDetails | bool | false | Fetch each notice's detail page |
onlyNew | bool | false | Only records not pushed by your previous run (KV-backed) |
maxItems | int | 1000 | Hard cap |
maxTotalChargeUsd | number | 0 | Pay-per-event budget cap; actor stops cleanly when reached |
Ministries (exact spellings accepted by the portal)
Jabatan Perdana Menteri · Kementerian Pertanian dan Keterjaminan Makanan · Kementerian Komunikasi dan Multimedia · Kementerian Pertahanan · Kementerian Digital · Kementerian Perdagangan Dalam Negeri dan Kos Sara Hidup · Kementerian Ekonomi · Kementerian Pendidikan · Kementerian Peralihan Tenaga dan Transformasi Air · Kementerian Pembangunan Usahawan dan Koperasi · Kementerian Kewangan · Kementerian Luar Negeri · Kementerian Kesihatan · Kementerian Pendidikan Tinggi · Kementerian Dalam Negeri · Kementerian Perumahan dan Kerajaan Tempatan · Kementerian Sumber Manusia · Kementerian Kementerian Pelaburan, Perdagangan dan Industri · Kementerian Perpaduan Negara · Kementerian Sumber Asli dan Kelestarian Alam · Kementerian Kementerian Perladangan dan Komoditi · Kementerian Kemajuan Desa dan Wilayah · Kementerian Sains, Teknologi dan Inovasi · Kementerian Pelancongan, Seni dan Budaya · Kementerian Pengangkutan · Kementerian Pembangunan Wanita, Keluarga dan Masyarakat · Kementerian Kerja Raya · Kementerian Belia dan Sukan
(The doubled "Kementerian Kementerian" in two names is exactly as the portal spells them.)
Pricing (pay per event)
| Event | Price |
|---|---|
record — each notice pushed | $0.002 ($2.00 / 1,000) |
detail — extra per record with details on | $0.001 ($1.00 / 1,000) |
A full tender pull without details ≈ $2.24. Set maxTotalChargeUsd to bound your spend.
Notes & limits
- Public data only — this actor reads publicly listed procurement notices.
No login, no bypassing of access controls. Requests are rate-limited and honestly
labelled (
CelestJux-MyTenders/1.0). - Source: MyProcurement only. ePerolehan (the ministry's primary system) is not covered yet — it is a separate JSF-based portal, planned for a future version.
- MyProcurement itself notes its listings may lag ePerolehan; for time-critical bidding, verify on ePerolehan before relying on closing dates.
- Archives are not included in this version (open notices and recent results only).
- Results datasets: the portal sometimes re-issues the same notice or points two reference numbers at one detail page; the actor deduplicates identical notices and keeps distinct reference numbers even when the portal merges their detail pages.
- Values are kept in original Malay; field keys are English and stable.
Limitations / known walls
- If the portal introduces captcha/challenge pages, the actor fails loudly and stops — it does not attempt evasion.
- Server-side date filters apply to advertisements only (the results endpoint ignores them).