Romanian Public Contracts Scraper (e-licitatie.ro / SEAP) avatar

Romanian Public Contracts Scraper (e-licitatie.ro / SEAP)

Pricing

from $20.00 / 1,000 results

Go to Apify Store
Romanian Public Contracts Scraper (e-licitatie.ro / SEAP)

Romanian Public Contracts Scraper (e-licitatie.ro / SEAP)

Scrape Romanian public procurement from e-licitatie.ro (SEAP/ANAP): tender notices and awarded contracts. Filter by keyword, CPV code, date range and contracting authority. Includes contract values in RON, deadlines and winners.

Pricing

from $20.00 / 1,000 results

Rating

0.0

(0)

Developer

Oaida Adrian

Oaida Adrian

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Find Romanian public procurement contracts by supplier CUI/CIF, keyword, CPV code, date range or contracting authority, from e-licitatie.ro (SEAP/SICAP). Each awarded contract comes with the winner name, a digits-only winner CUI, the contract value in RON, the CPV code, the authority and the award date.

For: bid teams tracking who wins in their CPV niche, KYC and supplier-vetting teams checking a company's public-sector track record, and procurement watchdogs and data journalists following public money in Romania.

Try it: {"mode": "awarded", "keyword": "drumuri", "dateFrom": "2026-09-01", "maxItems": 3}, or a single company's wins: {"supplierCui": "RO 16231761", "dateFrom": "2026-10-01"}

NoticeContracting authorityWinner (winnerCui)Value (RON)Award date
CAN1165172Compania Națională de Administrare a Infrastructurii Rutiere SAOPTGROUP (31039205)867,440.002026-03-06
CAN1154760Compania Națională de Administrare a Infrastructurii Rutiere SARainbow Company Eco (44661136)10,327,350.002025-09-19
SCNA1138025Comuna BudeștiTERRA ROMANIA UTILAJE DE CONSTRUCTII S.R.L. (13813188)391,140.002026-10-07

Real output, fetched 15 Oct 2026. Every row links to its notice on e-licitatie.ro. winnerCui is now digits only; the source's own spelling (RO31039205, RO 13813188, ...) stays in winnerCuiRaw.

Price: $0.02 per notice, plus a $0.01 run start at the default 1 GB memory. $20.02 per 1,000 notices (max 500 per run, so 2 runs).

Used this for a bid, a vetting check or a story? A short review on the Apify Store helps others find it.

About the data

Romanian public procurement, both tenders and awarded contracts, comes from e-licitatie.ro, the official national platform run by ANAP (Agenția Națională pentru Achiziții Publice), the successor to SEAP.

All data comes from the platform's own public JSON API — no login, no cookies, no browser required.

Why scrape Romanian public procurement?

Romania publishes every public tender and every awarded contract on e-licitatie.ro. That is a massive, structured stream of business intelligence:

  • Sales intelligence — find authorities buying exactly what you sell, with deadlines and budget ceilings, weeks before the award.
  • Competitive analysis — see who wins contracts in your niche, at what price (winner + awarded value in RON for every published award).
  • Market research — track CPV categories over time, estimate market size, watch infrastructure, IT, health, agriculture spending.
  • Journalism & research — monitor public money flows, detect award patterns, build datasets for analysis.

The native-language advantage: titles and descriptions are in Romanian, and the CPV classification matches EU-wide coding, so you can join with EU TED data.

How it works

  1. Build a filter: free-text keyword (Romanian), CPV code/prefix, publication date range (YYYY-MM-DD), contracting authority (partial name), mode, and optionally the supplier (winner) CUI.
  2. The actor queries the public search API (POST /api-pub/NoticeCommon/GetCNoticeListFiltered/ for tenders, POST /api-pub/NoticeCommon/GetCANoticeList/ for awarded contracts) with the same headers the web app sends (Referer + Origin + X-Requested-With — the API rejects hotlink requests without them).
  3. With fetchDetails on (default), each result is enriched from the notice view endpoints: full description, authority contact details, CPV name, and — for awarded contracts — the winner and awarded value via C_PUBLIC_CANotice + GetCANoticeContracts.
  4. With supplierCui, every awarded notice's contracts are checked for that winner (see below). Only matching notices are enriched, returned and charged.
  5. Results are pushed to the default dataset as JSON.

Contracts won by one company (supplierCui)

{"supplierCui": "14399840"} returns the awarded contracts won by that company. Several codes work too: ["16231761", "25204073"] or "16231761, 25204073".

  • Validation: the same CUI check as our other Romanian actors. The optional RO prefix, dots, spaces and dashes are accepted, and the check digit is verified. An invalid code becomes an error item for that input ({"inputSupplierCui": "16231762", "error": "... check digit is 2, expected 1 ..."}). If no code is valid, the run fails with that message.
  • Matching: e-licitatie.ro stores the winner's fiscal code in several formats (RO31039205, RO 14234540, 26386852). The actor compares digits only, and checks the lead winner and every consortium member of every contract in the notice.
  • This is a client-side filter. e-licitatie.ro's search API has no parameter for the winner. Its awarded-notice list ignores winnerFiscalNumber/winnerCif/supplierCif (tested 15 Oct 2026). So the actor walks the newest awarded notices that match your other filters and checks each one's contracts, one request per notice. Only matches are charged.
    • maxScanNotices (default 1,000, max 3,000) caps how many notices are checked per run. The run log tells you when the cap was hit.
    • To reach older contracts, narrow the scan with dateFrom/dateTo, cpvCode, keyword or authority.
  • supplierCui implies mode: awarded, because tenders have no winner yet.
  • Each matching record also carries supplierContractValueRon: the sum of the contracts in that notice won by your supplier(s).

Input

FieldTypeDescription
keywordstringFree text in the contract title/object (e.g. infrastructura, drumuri, medicamente). Empty = latest notices.
cpvCodestringCPV code or prefix (e.g. 45233140-2 or 45233100).
dateFrom / dateTostringPublication date range, YYYY-MM-DD.
authoritystringContracting authority partial name (e.g. Primaria, Consiliul Local).
modestringtenders (participation notices, default), awarded (contract awards with winners), or both.
fetchDetailsboolEnrich each notice with description, authority contact and winners. Default true.
maxItemsintMax results to return (default 50, max 500).
supplierCuistring or arrayOnly awarded contracts won by this CUI/CIF (one or several). Client-side filter, see above.
maxScanNoticesintsupplierCui only: max awarded notices checked per run (default 1,000, max 3,000).

Example input:

{
"keyword": "drumuri",
"cpvCode": "45233140-2",
"dateFrom": "2026-01-01",
"mode": "both",
"maxItems": 100
}

Output

One dataset item per notice. Key fields:

FieldDescription
contractIdInternal notice/contract ID (cNoticeId / caNoticeId).
noticeNoPublic notice number (e.g. CN1047952, SCNA1135873).
titleContract title (Romanian).
descriptionShort description of the object (when fetchDetails).
authorityContracting authority name (with CUI/fiscal prefix).
authorityCuiAuthority fiscal number (CUI).
cpvCodeCPV code + name (e.g. 45233140-2 - Lucrari de drumuri).
acquisitionTypeFurnizare / Servicii / Lucrari.
procedureTypeLicitatie deschisa, Procedura simplificata, etc.
estimatedValueRonEstimated value in RON (tenders).
contractValueRonAwarded value in RON (awarded contracts).
publicationDateNotice publication timestamp.
deadlineTender receipt deadline (tenders).
awardDateAward date (awarded contracts).
statusProcedure/notice state (Publicat, Atribuita, Anulata...).
winnerNameWinning supplier name (the matched supplier when supplierCui is set).
winnerCuiWinner CUI, digits only (e.g. 31039205); null for non-Romanian ids.
winnerCuiRawWinner fiscal code exactly as published (RO31039205, RO 14234540, ...).
winnerWinner caption as published (may list all consortium members); kept for compatibility.
winnersEvery awarded contract in the notice: contractNo, contractDate, contractValueRon, winnerName, winnerCui, winnerCuiRaw, plus consortium when several firms won together.
supplierContractValueRonsupplierCui only: total RON value of the contracts in this notice won by your supplier(s).
sourceUrlLink to the notice on e-licitatie.ro.
scrapedAtExtraction timestamp (UTC).

Use cases

  • Bid pipeline: keyword + CPV + dateFrom for this month → a fresh list of relevant tenders with deadlines every morning.
  • Award monitoring: mode: awarded + your CPV → track winners and prices for competitive intelligence.
  • Research: pull 500 notices per run into a dataset for analysis.

Run it from your code

Call it on a schedule or from a pipeline — every run appends fresh notices to its own dataset:

curl -X POST "https://api.apify.com/v2/acts/darknezz~ro-public-contracts-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"keyword": "infrastructura", "dateFrom": "2026-08-01", "mode": "tenders", "maxItems": 100}'

From Python with the official SDK:

from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
run = client.actor("darknezz/ro-public-contracts-scraper").call(
run_input={"keyword": "infrastructura", "dateFrom": "2026-08-01",
"mode": "tenders", "maxItems": 100})
for notice in client.dataset(run["defaultDatasetId"]).iterate_items():
print(notice["title"], notice["authority"], notice["deadline"])

FAQ

Which data source is this? e-licitatie.ro — the official national procurement platform run by ANAP (successor to SEAP). All data comes from its public JSON API.

Does it include winners? Yes, in mode: awarded (or both). Every awarded notice returns winnerName, a digits-only winnerCui, winnerCuiRaw, the full winners list and contractValueRon.

Can I get all contracts won by one company? Yes. Set supplierCui to the company's CUI/CIF. It is a client-side filter (e-licitatie.ro has no search-by-winner parameter), so narrow by date or CPV to reach further back.

What does an empty search mean? A genuinely empty result set. Hard API failures (403 anti-hotlink, 400, invalid responses) fail the run loudly with a clear error — a zero-item run is never a swallowed error.

Why are some awarded values 0.0? The authority did not publish a value for that award; status (e.g. Anulata) clarifies the notice state.

How do I join with EU TED data? Match on cpvCode — the CPV classification is EU-wide, so Romanian notices join cleanly to TED's European dataset.

Is a login or proxy required? No — the public API works from any IP with the same headers the web app sends.

Pricing

Pay per event, so you only pay for what you extract:

EventPrice
result (one per notice returned)$0.02
apify-actor-start (per run, per GB of memory)$0.01 at the default 1 GB
  • A 50-notice harvest costs about $1.01, and a 500-notice one about $10.01.
  • 1,000 notices: $20.02 (2 runs of 500).
  • In supplierCui mode, notices that are scanned but don't match are not charged.
  • The start fee scales with memory: a run raised to 4 GB starts at $0.04.

No monthly fee.

Limitations

  • The platform caps a single unauthenticated search at ~3,000 results (searchTooLong); for wider windows, narrow by date range or CPV.
  • Titles/descriptions are as published by authorities — Romanian diacritics vary (some notices use ASCII transliteration).
  • Awarded-value fields are 0.0 when the authority did not publish a value.
  • The API is a live government service; occasional 5xx retries are handled automatically with backoff.
  • Hard API failures are loud, not silent: if e-licitatie.ro answers 403 (the anti-hotlink "Referrer cannot be null"), 400, or an empty/invalid response, the run FAILS with a clear error instead of exiting successfully with zero items. A zero-item run therefore means a genuinely empty search, never a swallowed error.
  • supplierCui is a client-side filter bounded by maxScanNotices and the platform's ~3,000-result search cap. An empty result means "not among the scanned notices", so widen or narrow the date/CPV window to go further.
StepToolInput → output
1. Find companiesRomanian Company Lookup by CUI/CIFCUI or keyword → CUI, VAT status, J-number, CAEN, address, website
2. Check the numbersRomanian Financial Statements by CUICUI → turnover, net profit, assets, employees per year
4. Watch for changesRomanian Registry Change MonitorCAEN code → new firms, deregistrations, status changes (daily)

All of these tools return the company CUI, so results join on that field.

Used this for a bid, a vetting check or a story? A short review on the Apify Store helps others find it.