Etimad APItenders.etimad.sa ↗
Access Saudi government tenders from tenders.etimad.sa. List 9,000+ public RFPs, get tender details, and retrieve award results via 3 structured endpoints.
What is the Etimad API?
The Etimad Tenders API provides access to over 9,000 public Saudi government procurement opportunities from tenders.etimad.sa across 3 endpoints. Use list_tenders to paginate through current RFPs sorted by submission date, get_tender_details to pull structured fields for a specific tender including agency name, contract duration, and reference number, and get_tender_awarding_results to check whether a tender has been awarded and to whom.
curl -X GET 'https://api.parse.bot/scraper/0646094a-9d3e-4a24-9900-127441f6da21/list_tenders?page=1&page_size=6&publish_date_id=5' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace tenders-etimad-sa-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
from parse_apis.etimad_saudi_government_tenders_api import Etimad, Tender, TenderSummary, AwardingResult
etimad = Etimad()
# List recent tenders with automatic pagination
for tender_summary in etimad.tendersummaries.list(publish_date_id="5", limit=12):
print(tender_summary.tender_name, tender_summary.agency_name, tender_summary.remaining_days)
# Get full detail for one tender
detail = tender_summary.details()
print(detail.tender_name, detail.government_agency, detail.contract_duration)
# Check awarding results
for award in tender_summary.awarding_results.list():
print(award.message)
# Direct lookup by tender_id_string
full_tender = etimad.tenders.get(tender_id_string="D6lj5E83dUApvNo8HT4i1A==")
print(full_tender.tender_name, full_tender.tender_type, full_tender.reference_number)
List all public government tenders with pagination. Returns tender listings sorted by submission date (newest first). Over 9,000 tenders available. Each page returns up to 6 results (server-enforced cap). Paginates via integer page counter.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number (starts at 1). |
| page_size | integer | Results per page (max 6, values above 6 are capped to 6). |
| publish_date_id | string | Date filter ID. Accepted values: '5' for all dates. |
{
"type": "object",
"fields": {
"page": "integer current page number requested",
"tenders": "array of tender summary objects",
"page_size": "integer results per page",
"total_count": "integer total number of tenders matching the filter",
"current_page": "integer current page as reported by the upstream API"
},
"sample": {
"data": {
"page": 1,
"tenders": [
{
"tender_id": 1076084,
"inside_ksa": null,
"agency_name": "الهيئة السعودية للمياه",
"branch_name": "إدارة الشراء",
"buying_cost": 500,
"tender_name": "توريد قطع غيار",
"activity_name": "تجارة قطع الغيار الجديدة",
"tender_number": "60020126",
"financial_fees": 500,
"remaining_days": 16,
"tender_type_id": 1,
"invitation_cost": 200,
"remaining_hours": 6,
"submission_date": "2026-06-11T00:52:38.6666232",
"reference_number": "260539006546",
"tender_id_string": "2Msmk90Zv6en0ekRBOssw==",
"tender_status_id": 4,
"tender_type_name": "منافسة عامة",
"last_enquiries_date": "2026-06-21T00:52:38.6664836",
"offers_opening_date": "2026-06-27T10:00:00",
"conditional_booklet_price": 0,
"last_offer_presentation_date": "2026-06-27T09:59:00"
}
],
"page_size": 6,
"total_count": 8328,
"current_page": 1
},
"status": "success"
}
}About the Etimad API
Tender Listings
The list_tenders endpoint returns paginated summaries of all publicly visible government tenders on the Etimad platform. Each call returns up to 6 results per page (server-enforced cap), with the total_count field indicating how many tenders match the active filter. Pagination is controlled via the page integer parameter, starting at 1. The publish_date_id parameter accepts '5' to retrieve tenders across all dates. The tender_id_string field in each result is the key you pass to the detail and awarding endpoints.
Tender Details
Passing a tender_id_string to get_tender_details returns a structured object with Arabic-labeled fields reflecting the Etimad portal's detail page. These include اسم المنافسة (tender name), رقم المنافسة (tender number), الرقم المرجعي (reference number), الجهة الحكوميه (issuing government agency), الغرض من المنافسة (stated purpose), نوع المنافسة (tender type), مدة العقد (contract duration), and حالة المنافسة (status). A top-level status field also returns the badge text from the portal page.
Award Results
The get_tender_awarding_results endpoint returns an awards array for completed tenders where results have been announced. For tenders still in progress, the awards array will be empty and the message field will contain an Arabic-language status string indicating results are pending. This lets you programmatically distinguish between awarded and open tenders without needing to parse detail page text.
The Etimad API is a managed, monitored endpoint for tenders.etimad.sa — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when tenders.etimad.sa changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official tenders.etimad.sa API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Monitor new Saudi government RFPs daily by paginating
list_tendersand trackingtotal_countchanges. - Build a procurement dashboard that maps each tender's
الجهة الحكوميه(agency) to open contract opportunities. - Filter awarded contracts using
get_tender_awarding_resultsto analyze which suppliers win government business. - Track contract durations (
مدة العقد) across tender categories to benchmark typical procurement timelines. - Alert business development teams when tenders matching a target agency appear in new listing pages.
- Cross-reference
الرقم المرجعيreference numbers against internal procurement databases for compliance reporting. - Identify tender types (
نوع المنافسة) most frequently issued by specific government bodies.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does tenders.etimad.sa have an official developer API?+
What does get_tender_details return and are the field names in English?+
اسم المنافسة (tender name), الجهة الحكوميه (government agency), مدة العقد (contract duration), الغرض من المنافسة (purpose), and حالة المنافسة (status). There is also a top-level English status string and the queried tender_id_string.How many results does list_tenders return per page, and can I increase it?+
page_size parameter accepts higher values, but they are capped at 6 by the platform. To retrieve more tenders, increment the page parameter and make additional requests.Does the API support searching or filtering tenders by agency, category, or keyword?+
publish_date_id). Filtering by government agency, tender type, or keyword is not currently exposed. The API covers listing, detail lookup, and award results. You can fork it on Parse and revise to add filtering parameters if those fields are available from the source.Can I retrieve the list of bidders or submitted bids for a tender, not just the final award?+
get_tender_awarding_results endpoint returns final award data once announced. You can fork the API on Parse and revise it to add an endpoint targeting bidder or submission data if that information is publicly accessible on the portal.