Turkey EKAP Tenders Scraper | Turkish Public Tenders avatar

Turkey EKAP Tenders Scraper | Turkish Public Tenders

Pricing

from $1.00 / 1,000 tenders

Go to Apify Store
Turkey EKAP Tenders Scraper | Turkish Public Tenders

Turkey EKAP Tenders Scraper | Turkish Public Tenders

Search Turkish public tenders on EKAP by keyword, province, tender type, status or IKN. One row per tender with procuring entity, tender date, status and documents; add details for announcement text, OKAS codes, lots, estimated value and contract result. Daily new-only feed.

Pricing

from $1.00 / 1,000 tenders

Rating

0.0

(0)

Developer

Philip Kirkbride

Philip Kirkbride

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

18 hours ago

Last modified

Categories

Features

Limited permissions

Share

Turkey EKAP Tenders Scraper

Turkish public tenders are announced on EKAP, the national electronic procurement platform run by the Public Procurement Authority (Kamu İhale Kurumu). Every central and local authority publishes its invitations there, which makes EKAP the single place to follow Turkish public buying — roughly two million tender records, growing every day.

This actor searches EKAP for you and saves one clean row per tender, ready for a spreadsheet, a database or an alerting workflow.

What you can do with it

  • Bid teams follow the tenders they can supply: a keyword in the title, a province, a tender type, and the nearest tender date first.
  • Tender-alert services run it on a schedule with Only new or changed since the last run and forward new tenders to email, Slack, a CRM or a spreadsheet.
  • Market research and aggregators sweep a province, a type or a status, with tender details on, and compare authorities, estimated values and contract results.

Quick start

Open tenders with the nearest tender date first — the Console prefill, 20 rows:

{"maxItems": 20}

Works tenders in Ankara, nearest first:

{"keyword": "", "province": "Ankara", "tenderType": "works", "maxItems": 50}

Cybersecurity service tenders with the announcement text, lots and contract result:

{
"keyword": "siber güvenlik",
"keywordScope": "all",
"status": ["announced"],
"includeDetails": true,
"maxItems": 50
}

One tender by its IKN, with details:

{"ikn": "2026/271215", "includeDetails": true}

The 20-row Console sample costs about $0.025 and each 50-row example about $0.055, with or without tender details — see Price.

What you get

Each row carries the tender's own identity and the facts EKAP shows on the search result:

  • IKN — the tender's stable registration number, for example 2026/271215; use it to identify and de-duplicate a tender
  • Source record id — EKAP's own handle for the tender in this response; it can change between reads, so the IKN is the stable identity
  • Title — as published, in Turkish
  • Procuring entity — the authority running the tender
  • Province — where the tender belongs
  • Tender type — goods, works, service or consultancy
  • Procedure and status — for example "Contract Signed", "Result Announcement Published" or "Tender Canceled"; the procedure also gets an English label when EKAP's own procedure code is one of the fixed ones
  • Tender date and time — the bid opening, in Turkish local time
  • Documents — how many tender documents EKAP lists, with their ids and dates

Ask for tender details and each row also gets the announcement text, the place where the work happens, the tender venue, the district and parent authority, the OKAS item codes, and — when EKAP has published the result — the lots, the estimated value, the winning contractor and the contract value.

Everything is delivered exactly as EKAP shows it, including Turkish characters. Nothing is translated, guessed or filled in: a field EKAP leaves empty is null in the row.

All filters are optional. An empty input follows open tenders whose tender date is still ahead (from the moment the run starts), nearest first.

FilterWhat it does
Keyword + where to lookWords in the tender title (default), the announcement text, the specification, or everywhere
Tender number (IKN)One exact tender
ProvinceA Turkish province name, for example Ankara or İstanbul
Tender typeGoods, works, service or consultancy
StatusAny combination of preliminary announcement, open for participation, offers evaluated, evaluation completed, result published, contract signed, canceled, canceled before the announcement, approval not given. Open tenders are selected by default; choose All statuses to search every status
Announcement date, tender dateDate ranges
OrderNearest tender date first (default), newest announcement first, or latest tender date first
Maximum tendersHow many rows to save (50 by default; the Console prefills 20). With tender details on, a run stops at 2,000 tenders

Good to know

  • Turkish tender dates are in Turkey time (UTC+03:00 all year); saved dates say so explicitly.
  • EKAP does not publish an estimated value for most tenders; it appears in detail mode only when the authority has published one, together with the currency it printed (TRY in practice).
  • A search that matches nothing finishes successfully with zero rows and a plain message.
  • Tender dates and statuses change while a tender is live. Run the actor again to refresh them.

Use recordKey (ekap:<ikn>) to identify and update a tender across runs. The underlying ikn is EKAP's stable tender registration number. sourceRecordId is the source's per-response detail handle and can change; it is retained for provenance and for the actor's detail requests.

Use it as a daily feed

Turn on Only new or changed since the last run (onlyNewSinceLastRun) and run the Actor on a schedule with the same input. It then returns only tenders this search has not delivered before, or whose watched fields changed since the last run, so there is nothing to deduplicate on your side.

  • Every returned row carries changeType (new or changed) and changedFields.
  • The first run has no saved history, so it returns everything and reports feed.firstRun in the run's OUTPUT.
  • The history lives in the named key-value store turkey-ekap-tenders-scraper-feed-state, one record per search. Leave stateKey empty to name the record from the input, so different searches keep separate histories; set a name to share one or to start a fresh feed.
  • An entry leaves the history once its deadline is more than 90 days past and it has not been delivered in the last 90 days, so the history stays bounded.
  • The watched fields are the title, the tender date, the status, the estimated value and the documents.

With the flag off (the default) the Actor returns every match, exactly as before.

Output example

One row per tender, with the detail fields filled in when tender details are requested (announcementText is shortened here; the actor delivers the first 4,000 characters):

{
"recordKey": "ekap:2026/1369336",
"sourceRecordId": "599f5dec2df18ec8b400b4a126e68df71bf2b25ac05ac7208b0e460f9d3c38a4",
"ikn": "2026/1369336",
"title": "Masaüstü Bilgisayar Alımı",
"procuringEntity": "EMNİYET GENEL MÜDÜRLÜĞÜ DESTEK HİZMETLERİ DAİRE BAŞKANLIĞI",
"province": "ANKARA",
"tenderType": "Mal",
"tenderTypeCode": "1",
"tenderTypeLabel": "goods",
"procedure": "TENDER_SEARCH.MAIN.PAGEITEM.TENDER_TYPE TENDER_SEARCH.ENUMERATIONS.SEARCH_METHOD.OPEN",
"procedureLabel": "Open procedure",
"procedureCode": "1",
"statusCode": "15",
"status": "Result Announcement Published",
"tenderDate": "2026-09-17T14:00:00+03:00",
"eTender": true,
"documentCount": 0,
"documents": [],
"publishedAt": "2026-08-18T00:00:00+03:00",
"announcementTitle": "MASAÜSTÜ BİLGİSAYAR SATIN ALINACAKTIR",
"announcementText": "MASAÜSTÜ BİLGİSAYAR SATIN ALINACAKTIR Masaüstü Bilgisayar Alımı mal alımı 4734 sayılı Kamu İhale Kanununun 19 uncu maddesine göre açık ihale usulü ile ihale edilecektir…",
"announcementTextTruncated": true,
"workLocation": "Emniyet Genel Müdürlüğü Trafik Başkanlığı Deposu Ankara adresine tek parti halinde teslim edilecektir.",
"tenderPlace": "Emniyet Genel Müdürlüğü Destek Hizmetleri Daire Başkanlığı 4 Nolu Satın Alma Şube Müdürlüğü Ayrancı Mah. Dikmen Cad. No:6 O Blok 2. Kat Oda No: 6 Çankaya / ANKARA",
"topAuthority": "İÇİŞLERİ BAKANLIĞI",
"subAuthority": "EMNİYET GENEL MÜDÜRLÜĞÜ",
"district": "ÇANKAYA",
"okasCodes": [{"code": "30213300", "name": "Masaüstü bilgisayar"}],
"lots": [
{
"name": "Masaüstü Bilgisayar Alımı",
"highestBidText": "32.210.000,00 TRY",
"lowestBidText": "24.445.000,00 TRY",
"estimatedValueText": "336.916.050,00 TRY",
"estimatedValue": 336916050.0
}
],
"contract": {
"contractor": "LN BİLGİSAYAR VE DANIŞMANLIK HİZMETLERİ SANAYİ VE TİCARET ANONİM ŞİRKETİ",
"contractDate": "2026-11-02",
"valueText": "24,445,000.00 TRY",
"value": 24445000.0,
"highestBidText": "32,210,000.00 TRY",
"lowestBidText": "24,445,000.00 TRY",
"estimatedValueText": "336.916.050,00 TRY",
"estimatedValue": 336916050.0,
"currency": "TRY"
},
"estimatedValue": 336916050.0,
"estimatedValueText": "336.916.050,00 TRY",
"currency": "TRY",
"observedAt": "2026-11-04T22:39:51.823637+03:00",
"detailsParsed": true,
"detailsError": null
}

Amounts keep EKAP's own text (valueText) beside a number (value), because EKAP prints the same amount in both 1,486,307.76 TRY and 14.608.282,00 TRY style.

Price

You pay for what you get: $0.001 per saved tender, plus a run-start charge of $0.005 per GB of memory — the default 512 MB run is one start charge, so $0.005. Tender details are included in the same price; they only make the run longer (about one extra request per tender).

RunTendersCost
Console sample (20 open tenders)20$0.025
One province and type for a month50$0.055
A province sweep with details200$0.205
Every open tender nationwide1,000$1.005

The start charge applies even when a search saves nothing, and a tender that is not saved is not charged. Platform usage is included in the price.

Questions people ask

Which tenders are still open? Keep the default statuses, "Preliminary announcement published" and "Tender announcement published (open for participation)", and the default order, tender date soonest first.

What does a run cost? $0.001 for each saved tender plus one run-start charge of $0.005 for the default 512 MB run: the 20-row Console sample costs $0.025, 200 tenders cost $0.205 and 1,000 cost $1.005. Tenders that are not saved are not charged.

Can I run it on a schedule? Yes. Save the input, add a schedule in the Apify Console — daily is usual for tender alerts — and choose where the results should go (email, webhook, Google Sheets or your own server). Turn on Only new or changed since the last run so the feed carries no duplicates.

How long does a run with details take? Details add about one request per tender, so a 50-tender detailed run takes a few minutes. For a large sweep, leave details off and read the tenders you care about by IKN afterwards.

Can I follow one authority? Search a keyword in the title, or use the province filter together with a keyword for the authority's typical subject.

Do I need an EKAP account? No. Only public search results are read.

Are tender documents downloaded? No. The row tells you how many documents EKAP lists and when they were published; the documents themselves stay on EKAP.

EKAP is the official public procurement platform of the Republic of Türkiye. This actor reads its public search results.