CV.ee Scraper
Pricing
from $1.49 / 1,000 results
CV.ee Scraper
Scrape job listings from CV.ee (CV-Online Estonia). Returns structured data with salary, location, work type and apply URL. No API key required.
Pricing
from $1.49 / 1,000 results
Rating
0.0
(0)
Developer
Unfenced Group
Actor stats
1
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Extract job listings from CV.ee (CV-Online Estonia) — the leading job board in Estonia with 4,000+ active vacancies. Returns structured data including salary, location, work type, and apply URL. No API key required.

Why use this scraper?
- Full dataset access — scrape all 4,000+ active Estonian job listings or filter by keyword
- Structured salary data — numeric
salaryMin/salaryMaxfields, no string parsing required - Cross-run deduplication — 90-day fingerprint cache prevents duplicate results across consecutive runs
- Optional HTML descriptions — enable
fetchDetailsto retrieve the full rich-text job description and direct apply URL - No API key required — runs out of the box with no credentials or registration
Input parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
keyword | string | "" | Search keyword or job title. Leave empty to retrieve all listings. |
maxItems | integer | 200 | Maximum number of results to return. Set to 0 for unlimited. |
fetchDetails | boolean | false | Fetch each vacancy's detail page for HTML description, direct apply URL, and resolved category names. |
daysOld | integer | — | Only return listings published within the last N days. |
locale | string | "en" | Site language variant: en (English), et (Estonian), ru (Russian). Affects UI language only. |
startUrls | array | [] | Custom CV.ee search URLs. Overrides the keyword field when provided. |
Output fields
Each result in the dataset contains:
| Field | Type | Description |
|---|---|---|
jobId | string | Unique vacancy ID |
title | string | Job title |
company | string | Employer name |
companyId | string | Employer ID |
description | string | Plain-text job description (always present) |
descriptionHtml | string|null | HTML description (populated when fetchDetails: true) |
url | string | Vacancy page URL |
applyUrl | string|null | Direct apply URL (populated when fetchDetails: true; null for modal-based applications) |
location | string|null | Town name |
town | string|null | Town name |
county | string|null | County name (e.g. Harjumaa) |
country | string | Always "Estonia" |
workTypes | array | Work type codes: FULL_TIME, PART_TIME, FULL_TIME_WITH_SHIFTS, FIXED_TERM, FREELANCE, PRACTICE |
remoteWork | boolean | Whether remote work is available |
remoteWorkType | string|null | ON_SITE, HYBRID, or FULLY_REMOTE |
salaryMin | number|null | Minimum salary (EUR) |
salaryMax | number|null | Maximum salary (EUR) |
salaryCurrency | string|null | Currency code (EUR or null if no salary data) |
salaryPeriod | string|null | monthly or hourly |
publishDate | string | ISO 8601 publish date |
renewedDate | string|null | ISO 8601 renewal date |
expirationDate | string|null | ISO 8601 expiration date |
quickApply | boolean | Whether quick apply is enabled |
categories | array | Numeric category IDs from listing |
categoriesResolved | array|null | Human-readable category codes, e.g. ["INFORMATION_TECHNOLOGY"] (populated when fetchDetails: true) |
languages | array | Numeric language requirement IDs |
languagesResolved | array|null | ISO language codes, e.g. ["en", "et"] (populated when fetchDetails: true) |
keywords | array | Employer-specified keywords |
scrapedAt | string | ISO 8601 scrape timestamp |
💰 Structured salary data — machine-ready
Salary is returned as numeric fields — no regex required on your end:
| Field | Type | Example |
|---|---|---|
salaryMin | number | null | 3500 |
salaryMax | number | null | 5000 |
salaryCurrency | string | null | "EUR" |
salaryPeriod | string | null | "monthly" |
Most competing scrapers return salary as a raw string (e.g. "€3,500 – €5,000"), leaving the parsing to you. This scraper delivers numeric fields directly — ready for WHERE salaryMin > 50000 queries or salary distribution charts.
Example output
{"jobId": "1546586","title": "Business Analyst (Regulatory Reporting)","company": "Luminor","companyId": "1693","description": "Join our team as a Business Analyst...","descriptionHtml": null,"url": "https://cv.ee/en/vacancy/1546586","applyUrl": null,"location": "Tallinn","town": "Tallinn","county": "Harjumaa","country": "Estonia","workTypes": ["FULL_TIME"],"remoteWork": true,"remoteWorkType": "HYBRID","salaryMin": 3200,"salaryMax": 4000,"salaryCurrency": "EUR","salaryPeriod": "monthly","publishDate": "2026-03-30T11:29:34.634+00:00","renewedDate": null,"expirationDate": "2026-04-13T23:59:59.999+00:00","quickApply": false,"categories": [7, 23, 33],"categoriesResolved": null,"keywords": [],"scrapedAt": "2026-04-09T16:45:00.000Z"}
Performance
| Scenario | Speed | Memory |
|---|---|---|
Keyword search, fetchDetails: false | ~1,000 results/min | 256 MB |
Full site crawl, fetchDetails: false | ~1,000 results/min | 256 MB |
Any search, fetchDetails: true | ~60 results/min | 256 MB |
Pricing
$1.49 per 1,000 results — usage-based, no flat subscription.
Competitors charge $30–$49/month regardless of volume. With this scraper, scraping 500 results costs $0.75.
Known limitations
- Location and work-type filtering happen client-side — the
keywordfield is the primary server-side filter. For location-specific searches, include the city name in your keyword (e.g.keyword: "developer Tallinn"). - Apply URL is
nullfor vacancies using CV.ee's built-in application modal. The vacancyurlalways works. - Categories are numeric IDs in list-only mode; enable
fetchDetails: truefor human-readable category names. - CV.ee primarily covers Estonia. International listings are limited.
Technical details
Built and maintained by unfenced-group. For custom integrations, bulk data access, or multi-country job board coverage, contact info@unfencedgroup.nl.
Part of the unfenced-group European job board scraper portfolio — 50+ job boards, one consistent output schema.