Catalog / Tenders & public contracts
TENDERS & PUBLIC CONTRACTS · SAUDI ARABIA
Etimad Saudi Tenders
Search Saudi government tenders on Etimad: reference, title, agency, type, status, region, publish date, question and bid deadlines, envelope opening, document price and award results.
About this data
Search Saudi government tenders on Etimad: reference, title, agency, type, status, region, publish date, question and bid deadlines, envelope opening, document price and award results. Filter by keyword, agency, type, status, region and date for tender alerts.
From the actor’s Apify Store listing. The per-call endpoint may return a bounded subset; its own description is below.
Buy per call over x402
One endpoint at api.ssh.autos. Each call is one JSON POST, paid in USDC with no account or API key, and answered in the same HTTP response.
POST /v1/sa/etimad/tenders
Rows include tender references, titles, agencies and branches, tender types, publication dates, question and bid deadlines, document prices in SAR, activities and source URLs.
Fetch one results page with up to 10 Etimad tenders.
Filter by keyword, reference number, tender type and status.
Envelope-opening dates and tender numbers appear when published.
No tender detail pages are requested.
Input
Send a JSON body to POST https://api.ssh.autos/v1/sa/etimad/tenders.
| Field | Type | Required | Notes |
|---|---|---|---|
keyword | string | optional | up to 50 characters |
referenceNumber | string | optional | up to 20 characters |
status | string | optional | one of any, open, closed, offersOpening, offersExamination, awarding, awarded; default "any" |
tenderType | string | optional | one of any, publicTender, directPurchase, limitedTender, reverseAuction, twoStageFirst, twoStageSecond, publicTenderOldSystem, directPurchaseOldSystem, frameworkAgreement, designContest, nationalTransformation, revenueSharing, majorCompanies; default "any" |
maxResults | integer | optional | 1–10; default 10 |
Returned fields
The answer is JSON: records, a list of up to 10, and summary, the run status and counts. Each record has these 58 fields; a field the source does not publish comes back null.
58 fields per record
| Field | Type | Notes |
|---|---|---|
tenderKey | string | Unique key: source:tender:referenceNumber (e.g. tenders.etimad.sa:tender:261039009384). One row per tender. |
referenceNumber | string | Etimad reference number, e.g. '261039009384'. |
tenderNumber | string | Agency's own tender number as printed, e.g. '21/2026'. |
tenderId | integer | Etimad numeric tender id. |
agency | string | Government agency name (Arabic as published). |
agencyCode | string | 12-digit Etimad agency code, when published on the row. |
branch | string | Agency branch or procurement unit. |
tenderType | string | Procurement method as published, e.g. 'منافسة عامة'. |
tenderTypeEnglish | string | English name of the procurement method, e.g. 'Public tender'. |
tenderTypeId | integer | Etimad tender type id. |
status | string | Tender status as published, e.g. 'معتمدة' (approved) or 'تم اعتماد الترسية' (award approved). Always filled when details are on; often empty otherwise. |
statusId | integer | Etimad status id. |
isOpenForBids | boolean | True while the bid submission deadline is still in the future. |
regions | array of strings | Regions where the work is carried out (Arabic). From the detail page when details are on; otherwise the regions you filtered on, or null. |
regionsEnglish | array of strings | English names of the regions, e.g. 'Riyadh', 'Eastern Province'. |
insideKsa | boolean | True when the work is inside Saudi Arabia, when published on the row. |
publishedAt | string | Publication time, ISO 8601 with the Riyadh offset (+03:00). |
questionsDeadline | string | Last day for bidder questions, ISO 8601 (+03:00). |
bidDeadline | string | Bid submission deadline, ISO 8601 (+03:00). |
envelopeOpeningAt | string | Offer (envelope) opening time, ISO 8601 (+03:00). |
bidDeadlineHijri | string | Bid deadline in the Hijri calendar, YYYY-MM-DD as published. |
remainingDays | integer | Whole days left until the bid deadline (0 when closed). |
documentPrice | number | Price of the tender documents (conditions booklet plus fees), SAR. |
currency | string | Currency of the amounts: SAR. |
activity | string | Tender activity as published, e.g. 'تقنية المعلومات'. |
activityId | integer | Etimad activity id of the row. |
isExternalPortal | boolean | True for tenders run on a partner procurement portal; these have no public detail page, and url points to a reference search. |
url | string | Tender page on tenders.etimad.sa. |
purpose | string | Purpose of the tender (details). |
contractDuration | string | Contract duration as published, e.g. '9 أسبوع' (details). |
insuranceRequired | boolean | Whether insurance is a requirement (details). |
submissionMethod | string | How offers are submitted, e.g. one file for technical and financial offers (details). |
initialGuarantee | string | Initial guarantee requirement (details). |
initialGuaranteeAddress | string | Where the initial guarantee is delivered (details). |
finalGuaranteePercent | number | Final guarantee, percent of contract value (details). |
awardNumber | string | Award number, when published (details). |
offersExaminationAt | string | Offer examination date, ISO 8601 (details). |
standstillDays | integer | Standstill period in days before the award (details). |
expectedAwardDate | string | Expected award date, YYYY-MM-DD (details). |
workStartDate | string | Expected start of works or services, YYYY-MM-DD (details). |
questionsStartDate | string | First day for bidder questions, YYYY-MM-DD (details). |
maxAnswerDays | integer | Maximum days for the agency to answer questions (details). |
openingPlace | string | Where offers are opened (details). |
classificationField | string | Required contractor classification field (details). |
executionPlace | string | Inside or outside Saudi Arabia (details). |
cities | array of strings | Cities where the work is carried out (details). |
executionDetails | string | Extra notes on the execution place (details). |
activities | array of strings | Tender activities (details). |
includesSupplyItems | boolean | Whether the tender includes supply items (details). |
constructionWorks | array of strings | Construction works listed (details). |
maintenanceWorks | array of strings | Maintenance and operation works listed (details). |
bidders | array of objects | Suppliers that submitted offers, for tenders at the award stage (details). |
awardedSuppliers | array of objects | Awarded suppliers with offer and award values (details). |
awardedValue | number | Total award value, SAR (details, awarded tenders). |
detailsError | string | Why details could not be read for this tender, when details are on. |
sourceQuery | string | The filters this run searched, or 'latest'. |
source | string | Source site (tenders.etimad.sa). |
scrapedAt | string | UTC ISO 8601 collection time. |
Example call
npx agentcash@latest fetch https://api.ssh.autos/v1/sa/etimad/tenders -m POST -b '{"maxResults": 10}'
The example values come from the API spec or the actor’s own sample input. Running it is a paid call.
What is and isn’t charged
You pay the call price for
- An answer, including a definitive “not found” or an empty result.
- Confirmed no matches returns records: [] (charged: it is an answer).
Free
- Invalid input (422), busy (503), source failure (502), timeout (504) and calls whose client hung up are never charged.
- Invalid input and source failures are not charged.
Prefer a subscription? Run it on Apify
This data source is a public actor on the Apify Store: Etimad Saudi Tenders Scraper. Run it with your Apify account and plan for larger, scheduled or exported runs; it may offer more input options than the per-call endpoint.
How x402 payment works
- Your client sends the request. The API answers
402 Payment Requiredwith the price and where to pay. - The client pays from its own wallet: USDC on Base or Solana over x402, or over MPP on Tempo. No account, sign-up or API key.
- The client retries with the payment attached and gets the JSON answer in the same call. You are only charged for answers.
The AgentCash CLI in the example does all three steps for you and pays from your AgentCash wallet. Any x402 or MPP client works the same way.
Machine-readable: openapi.json · llms.txt