Ukraine Prozorro Tenders API – English, CPV & Daily Alerts
Pricing
from $2.40 / 1,000 tenders
Ukraine Prozorro Tenders API – English, CPV & Daily Alerts
Ukraine public tenders from the official Prozorro API for foreign contractors and reconstruction work: CPV, keywords, delivery oblast, UAH value, deadlines, links. Daily only-new alerts. JSON, CSV, Excel.
Pricing
from $2.40 / 1,000 tenders
Rating
0.0
(0)
Developer
Kamil Kaczmarek
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Ukraine public tenders from Prozorro, the official e-procurement system of Ukraine, as clean rows with English field names: title, buyer, delivery oblast, CPV codes, value in UAH, status, bid deadline and a link to the tender on prozorro.gov.ua. Filter by CPV code, keywords, oblast and value, keep only tenders still open for bids, and schedule an only-new daily alert. Built for foreign contractors, suppliers and consultants following Ukraine reconstruction tenders.
Data is read live from the Prozorro public API during each run. No login, no API key, no website scraping.
Need Czechia, Slovakia, Hungary or EU TED tenders in the same run? Use EU TED Tenders API – Czech, Slovak, Hungarian & Prozorro.
Use with AI agents (MCP)
Agents can call this Actor through the Apify MCP server:
{"mcpServers": {"apify": {"url": "https://mcp.apify.com?tools=enterprising_hamster/ukraine-prozorro-tenders"}}}
- "Which construction tenders were published on Prozorro in the last day?" →
{"cpvCodes": ["45000000-7"], "lastDays": 1, "maxItems": 50} - "Find open Ukrainian tenders for generators and energy equipment." →
{"keywords": ["генератор", "енергетичн", "energy"], "lastDays": 1, "maxItems": 50} - "Show reconstruction works in Kharkiv oblast above 1 million UAH." →
{"cpvCodes": ["45"], "regions": ["Харківська область"], "minValueUah": 1000000, "lastDays": 1}
What data can you get
| Field | Meaning |
|---|---|
id, tenderId | Prozorro internal id and the public tender number such as UA-2026-10-31-000509-a |
title, titleEn | Title in Ukrainian; titleEn only when the buyer published an English title (rare) |
description | Tender description, only with includeDetails |
procuringEntity | Buyer (contracting authority) name |
region | Delivery oblast(s) from the tender items, comma-joined; null when the items carry no delivery region |
cpv, cpvCodes | cpv is the item code that matched your cpvCodes filter (the first item code without a filter); cpvCodes lists every item code |
value, currency | Expected value and currency as published |
status | Prozorro status, e.g. active.tendering (bids open) or active.enquiries (questions period) |
tenderPeriod.start, tenderPeriod.end | Bid submission period; end is the bid deadline |
url | https://prozorro.gov.ua/tender/{tenderId} |
publishedAt | Publication time with offset |
Example row (title shortened):
{"tenderId": "UA-2026-10-31-000509-a","title": "Послуга з усунення аварій в житловому фонді (поточний ремонт електромереж …)","procuringEntity": "ДЕПАРТАМЕНТ З ПИТАНЬ САМООРГАНІЗАЦІЇ НАСЕЛЕННЯ ДНІПРОВСЬКОЇ МІСЬКОЇ РАДИ","region": "Дніпропетровська область","cpv": "45310000","cpvCodes": ["45310000"],"value": 463400,"currency": "UAH","status": "active.tendering","tenderPeriod": { "start": "2026-10-31T15:22:12.888456+02:00", "end": "2026-11-16T00:00:00+02:00" },"url": "https://prozorro.gov.ua/tender/UA-2026-10-31-000509-a","publishedAt": "2026-10-31T15:22:44.072836+02:00"}
Direct awards without competition (reporting, negotiation, negotiation.quick) are excluded.
Input
| Field | Default | Meaning |
|---|---|---|
lastDays | 1 | Tenders published in the last N days (1–90) |
cpvCodes | [] | CPV prefixes, e.g. 45000000-7 or 45 for construction works, 09310000 for electricity |
keywords | [] | Any of these words in the title, description or item descriptions; case- and accent-insensitive; most tenders are written in Ukrainian, so use Ukrainian words |
regions | [] | Delivery oblasts as Prozorro writes them, e.g. Київська область, Харківська область |
minValueUah, maxValueUah | none | Value bounds; tenders without a value or in another currency are dropped when a bound is set |
onlyOpen | true | Only tenders in active.enquiries or active.tendering |
includeDetails | false | Adds description (charged as tender-with-details) |
maxItems | 50 | Maximum rows saved per run (1–10,000) |
onlyNew, stateKey | false | Skip tenders delivered by earlier runs with the same key |
maxRequestsPerSecond | 5 | Request rate to Prozorro (0.2–5) |
{} returns up to 50 open tenders published in the last day; our test run took 20 seconds.
Daily alert of new tenders
- Save the input as a task with
onlyNew: true,lastDays: 1and your ownstateKey(a secret field, use one key per alert). Two ready-made tasks: daily construction tenders (CPV 45) and daily energy and generator tenders. - Schedule it in Schedules, for example
0 7 * * *. - Send the results onward with an integration: e-mail, Slack, Google Sheets, Make, Zapier, n8n or a webhook on Run succeeded.
{"cpvCodes": ["45000000-7"],"lastDays": 1,"onlyOpen": true,"maxItems": 200,"onlyNew": true,"stateKey": "ua-construction-daily","maxRequestsPerSecond": 5}
How long a run takes
Prozorro's list feed has no CPV or keyword filter, so with cpvCodes, keywords or regions the Actor opens every open tender changed in the window and filters it after. Test runs on Sunday 2026-11-01: CPV 45 with lastDays: 1 took 78 s (12 tenders), energy keywords with lastDays: 1 took 79 s (8 tenders). CPV 45 with lastDays: 3 reached the 900 s timeout after saving 165 tenders. Weekdays carry more tenders than weekends.
- For a daily alert keep
lastDays: 1. - For a backfill of several days, keep the default Timeout of 3600 s or raise it in Run options. Rows saved before a timeout stay in the dataset and are charged once.
Pricing (pay per event)
| Event | Price (USD) | When |
|---|---|---|
tender | 0.003 | Each saved tender |
tender-with-details | 0.006 | Each saved tender when includeDetails is on |
50 tenders cost $0.15 ($0.30 with details). Higher Apify plans pay less: SILVER $0.0027 and GOLD $0.0024 per tender. Tenders skipped by onlyNew or by your filters are not charged. Set a maximum charge per run to cap spending.
FAQ
Is there an official Prozorro API? Yes, the public API at public-api.prozorro.gov.ua (docs). This Actor walks its list feed, opens each tender and turns it into a flat row.
Is reuse allowed? Prozorro data is open: it may be copied and reused, including commercially, with a link to the source (prozorro.gov.ua/openprocurement). Every row carries url.
Why is titleEn usually missing? English titles exist only when the buyer filled title_en; most tenders are published in Ukrainian only. Use Ukrainian keywords for filtering and a translation step downstream.
Why is region sometimes empty? The oblast comes from the items' delivery address. Some buyers leave it out; those tenders do not match a regions filter.
Does it cover awarded contracts? Set onlyOpen: false to include later stages (qualification, awarded, complete, cancelled). Direct awards are always excluded.
Limitations
- No server-side CPV filter on Prozorro's list, so filtered windows longer than a day are slow (see above).
- The only-new memory keeps 50,000 tender ids per
stateKey. - Values are not converted between currencies.
Disclaimer
Unofficial tool. Not affiliated with or endorsed by Prozorro or the Ministry of Economy of Ukraine. Always check the tender at its source before you bid.
Development
python3 -m venv .venv.venv/bin/pip install -r requirements.txt -r requirements-dev.txt.venv/bin/python -m pytest -q
Fixtures under tests/fixtures/ are static samples, not live responses.