DEV Community

Cover image for Scraping Romanian Public Contracts: A Native-Language Tender & Awarded Deals Scraper
Oaida Adrian
Oaida Adrian

Posted on

Scraping Romanian Public Contracts: A Native-Language Tender & Awarded Deals Scraper

Romania publishes every public tender and awarded contract through e-licitatie.ro — the successor to the old SEAP system. The data is public, the opportunities are real (millions of RON in awards every month), and almost nobody outside Romania is building on it. Being native-language gives us an edge no English-first competitor has.

The gap

The niche's existing actors are thin: the top reference has single-digit runs. Tenders come with deadlines and award values, but most scrapers stop at the listing page. Ours goes deeper — tenders and awarded contracts, with detail enrichment, CPV classification, and winner + CUI (company ID) extraction.

The source

The Angular SPA at e-licitatie.ro calls its own JSON API — but it 403s without the right headers:

POST api-pub/NoticeCommon/GetCNoticeListFiltered/   # tenders
POST api-pub/NoticeCommon/GetCANoticeList/          # awarded contracts
Enter fullscreen mode Exit fullscreen mode

The trick: the API requires a Referer of https://e-licitatie.ro/pub plus Origin and X-Requested-With. Missing referer, instant 403 "Access Denied: Referrer cannot be null". Detail enrichment needs GetSection21View (description, CPV, estimated value — keyed off the item's own sysNoticeTypeId, not the noticeId) and GetSection1View for the contracting authority. Winners come from GetCANoticeContracts — and its filter payload is strict: a bare payload 400s.

The native-language advantage

Romanian titles, Romanian descriptions, CPV codes joined to EU TED. The reference actors are English-first and miss the nuance — e.g., distinguishing licitație deschisă (open tender) from achiziție directă (direct award). Our output carries the original Romanian fields untouched, so downstream users can do their own analysis without a translation layer.

The smoke test

  • Tenders: keyword infrastructura, dateFrom 2026-01-01 → 5 items, 5/5 complete — real titles, authorities, CPV names, estimated RON values, deadlines, status
  • Awarded: keyword drumuri, dateFrom 2026-06-01 → 4 items, including winner ROUTE CENTER CONSTRUCT (CUI 29170569) with a contract value of 4,822,401.88 RON and an award date

The honest bits

  • Authority filtering is client-side containment — the API ignores authority text server-side
  • Some CAN (award) records show zero value and no winner — that's data-side, the tender was annulled
  • Publication dates are what the portal publishes; actual contract signatures can lag

Try it

👉 Romanian Public Contracts Scraper on Apify Store

More from me

While you're here, these might be worth a read:

Top comments (0)