Etimad Tender Radar — Saudi Government Tenders (Arabic-safe) avatar

Etimad Tender Radar — Saudi Government Tenders (Arabic-safe)

Pricing

from $5.00 / 1,000 tender delivereds

Go to Apify Store
Etimad Tender Radar — Saudi Government Tenders (Arabic-safe)

Etimad Tender Radar — Saudi Government Tenders (Arabic-safe)

Search live Saudi government tenders from Etimad with Arabic text repaired, so keyword filters actually match. Clean JSON: agency, activity, deadlines (Gregorian + Hijri), fees in SAR, direct tender URL.

Pricing

from $5.00 / 1,000 tender delivereds

Rating

0.0

(0)

Developer

Mohanad Alshaka

Mohanad Alshaka

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

a day ago

Last modified

Categories

Share

Search live Saudi government tenders published on Etimad, the Ministry of Finance procurement platform, and get them back as clean JSON, CSV or Excel.

Filter by keyword, government agency, tender type, activity and closing deadline. Schedule it to run every morning and you have a tender-alert feed for your sector.

Why this Actor exists

Etimad publishes a large share of tender names in Arabic Presentation Forms-B (Unicode U+FE70–U+FEFF) instead of standard Arabic letters. They look identical on screen and are a different set of code points underneath.

Taken verbatim from the live feed:

published : ﺇﺳﺘﻜﻤﺎﻝ ﺃﻋﻤﺎﻝ ﺇﻧﺎﺭﺓ ﻃﺮﻳﻖ ﺣﺎﺋﻞ ﺟﺒﺔ ﺍﻟﻤﺮﺣﻠﺔ ﺍﻟﺜﺎﻧﻴﺔ
searching for "أعمال" -> no match

Any pipeline that filters the raw feed silently drops these tenders, and nothing in the output tells you it happened. In a sample of 12 live tenders taken on 13 September 2026, 4 needed repair.

This Actor normalises every text field before matching, so:

  • أعمال matches tenders published in presentation forms
  • انارة matches إنارة, اعمال matches أعمال (alef and hamza variants)
  • مستشفي matches مستشفى, صيانه matches صيانة
  • diacritics, tatweel (ـ) and Arabic-Indic digits (٢٠٢٦) are handled

The original wording is never thrown away. Every record carries a raw object with the exact text as Etimad published it, so you can still search the source portal for it.

Output

One record per tender:

{
"tenderId": 1103165,
"referenceNumber": "260939003389",
"tenderNumber": "4800167238",
"tenderName": "إستكمال أعمال إنارة طريق حائل جبة المرحلة الثانية",
"agencyName": "أمانة منطقة حائل",
"branchName": "منافسات حايل",
"tenderActivityName": "مقاولات الإنشاءات العامة (التشييد و بناء المرافق العامة) - إنشاء الطرق",
"tenderTypeName": "منافسة عامة",
"raw": {
"tenderName": " ﺇﺳﺘﻜﻤﺎﻝ ﺃﻋﻤﺎﻝ ﺇﻧﺎﺭﺓ ﻃﺮﻳﻖ ﺣﺎﺋﻞ ﺟﺒﺔ ﺍﻟﻤﺮﺣﻠﺔ ﺍﻟﺜﺎﻧﻴﺔ "
},
"submitionDate": "2026-09-13T10:13:10.658Z",
"lastEnqueriesDate": "2026-09-23T10:13:10.658Z",
"lastOfferPresentationDate": "2026-09-29T06:59:00.000Z",
"offersOpeningDate": "2026-09-29T07:00:00.000Z",
"lastOfferPresentationDateHijri": "1448-04-18",
"remainingDays": 15,
"isOpen": true,
"currency": "SAR",
"conditionalBookletPriceSar": 500,
"financialFeesSar": 500,
"url": "https://tenders.etimad.sa/Tender/DetailsForVisitor?STenderId=..."
}

Notes on the fields:

  • Dates come back twice: ISO-8601 UTC (lastOfferPresentationDate) and the Hijri date exactly as Etimad publishes it (lastOfferPresentationDateHijri).
  • All amounts are Saudi riyals. The currency field states this explicitly and the field names carry the Sar suffix.
  • url links straight to the tender page on Etimad.
  • isOpen is derived from the remaining time Etimad reports, so a closed tender is easy to drop.

Input

FieldWhat it does
keywordsWords matched against tender name, agency, branch and activity, after Arabic normalisation. Empty returns everything the other filters allow.
matchModeany (default) or all.
agencyContainsKeep only tenders from agencies or branches whose name contains this text.
tenderTypeIds1 منافسة عامة, 2 شراء مباشر, 5 المزايدة العكسية الالكترونية, 6 المنافسة على مرحلتين (المرحلة الاولى), 8 تأهيل لاحق.
tenderActivityIds19 business activities read from Etimad's own lookup: 9 الاتصالات وتقنية المعلومات, 2 المقاولات, 11 الرعاية الصحية والنقاهة, and so on. Sub-activity IDs work too.
tenderAreaIdsThe 13 Saudi regions from Etimad's منطقة التنفيذ lookup: 1 الرياض, 2 مكة المكرمة, 5 المنطقة الشرقية, and so on.
publishDateIdEtimad's publish-date window. Narrower IDs return fewer, newer tenders.
onlyOpenDrop tenders whose offer deadline has passed. On by default.
minRemainingDays / maxRemainingDaysDeadline window. Set maxRemainingDays: 7 for a closing-soon digest.
maxItemsHard cap on delivered tenders, and therefore on cost.

Example: IT tenders, public competition, Riyadh and Eastern Province, closing within 30 days

{
"tenderTypeIds": ["1"],
"tenderActivityIds": ["9"],
"tenderAreaIds": ["1", "5"],
"onlyOpen": true,
"maxRemainingDays": 30,
"maxItems": 500
}

Example: everything a specific municipality published this week

{
"agencyContains": "أمانة منطقة حائل",
"publishDateId": "4",
"onlyOpen": true,
"maxItems": 300
}

Pricing

Pay per tender delivered to your dataset. You are only charged for tenders that pass your filters and are actually stored, and maxItems caps the spend of any run.

Reliability

Etimad answers bursts of requests with HTTP 429. This Actor spaces its requests out and retries with exponential backoff, honouring Retry-After when present, so a throttled page is retried instead of being reported as an empty result.

Notes and limits

  • Data comes from Etimad's public visitor endpoint. No login, no credentials, no personal data.
  • Tender documents themselves (كراسة الشروط) are not downloaded; the record links to the tender page where they are obtained.
  • Etimad reports roughly 288,000 tenders in total across all statuses, so always set filters and maxItems.
  • Field availability follows the source: fields Etimad leaves empty are returned as null rather than guessed.

Development

npm install
npm test # Arabic normalisation test suite
node src/main.js # local run, reads storage/key_value_stores/default/INPUT.json