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
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:
- I Built a Canada Product Recalls & Safety Alerts Scraper That Reads Open Government Data
- I Built a Telegram Members Scraper That Reads Public Chat Stats Without Login
- Building a WHOIS & DNS Lookup Tool: Domain Intelligence in One API Call
- Building an AI Web Crawler That Outputs LLM-Ready Content Chunks
- Building a Real-Time Press Release Monitor with Python and RSS Aggregation
- Building a Universal Property Listing Scraper with Python and JSON-LD
- Tracking Tech Sentiment in Real-Time with VADER and Python
- How I Built a Product Hunt Scraper That Tracks Launches in Real-Time
- 5 APIs Every Developer Needs for Content Processing
- How to Extract Clean Content From Any Website Sitemap
- Scraping 187,000 Romanian Businesses: Building a B2B Lead Generation Tool
- Make Any Website AI-Readable: Generating llms.txt Files with Python
- I Built an RSS Aggregator That Extracts Full Article Content
Top comments (0)