Etimad Tender Radar — Saudi Government Tenders (Arabic-safe)
Pricing
from $5.00 / 1,000 tender delivereds
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
Maintained by CommunityActor 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
currencyfield states this explicitly and the field names carry theSarsuffix. urllinks straight to the tender page on Etimad.isOpenis derived from the remaining time Etimad reports, so a closed tender is easy to drop.
Input
| Field | What it does |
|---|---|
keywords | Words matched against tender name, agency, branch and activity, after Arabic normalisation. Empty returns everything the other filters allow. |
matchMode | any (default) or all. |
agencyContains | Keep only tenders from agencies or branches whose name contains this text. |
tenderTypeIds | 1 منافسة عامة, 2 شراء مباشر, 5 المزايدة العكسية الالكترونية, 6 المنافسة على مرحلتين (المرحلة الاولى), 8 تأهيل لاحق. |
tenderActivityIds | 19 business activities read from Etimad's own lookup: 9 الاتصالات وتقنية المعلومات, 2 المقاولات, 11 الرعاية الصحية والنقاهة, and so on. Sub-activity IDs work too. |
tenderAreaIds | The 13 Saudi regions from Etimad's منطقة التنفيذ lookup: 1 الرياض, 2 مكة المكرمة, 5 المنطقة الشرقية, and so on. |
publishDateId | Etimad's publish-date window. Narrower IDs return fewer, newer tenders. |
onlyOpen | Drop tenders whose offer deadline has passed. On by default. |
minRemainingDays / maxRemainingDays | Deadline window. Set maxRemainingDays: 7 for a closing-soon digest. |
maxItems | Hard 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
nullrather than guessed.
Development
npm installnpm test # Arabic normalisation test suitenode src/main.js # local run, reads storage/key_value_stores/default/INPUT.json