CV.lv Job Scraper
Under maintenancePricing
from $1.20 / 1,000 results
CV.lv Job Scraper
Under maintenanceExtract structured job listings from CV.lv — Latvia's #1 job board. Filter by keyword, city, job category, and work schedule. Salary data (monthly/hourly), full descriptions, and dedup support included.
Pricing
from $1.20 / 1,000 results
Rating
0.0
(0)
Developer
Unfenced Group
Maintained by CommunityActor stats
1
Bookmarked
7
Total users
2
Monthly active users
4 days ago
Last modified
Categories
Share

Extract job listings from cv.lv at scale, in a clean, consistent structure ready for analysis, job boards, recruiting tools and market research. No API key required.
Why this scraper?
🎯 Built for Latvia
A dedicated Latvian scraper, not a global tool with a country dropdown. Search, locations and currency (EUR) are tuned for cv.lv.
📄 Complete job data
Full job title and description, direct listing URL and publish date for every record.
📍 Location fields
Structured location data for every listing, ready for filtering and analysis.
🔁 Repost & change detection
Every record carries isRepost and changeStatus, so daily feeds return genuinely new jobs instead of reposted duplicates.
Input parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
searchQuery | string | "developer" | Job title or keyword. Supports Latvian, Russian, and English. Example: 'programmētājs', 'vadītājs', 'developer', 'бухгалтер'. |
towns | array | (empty) | Filter by Latvian city name(s) or city ID(s). Accepts: 'Riga', 'Daugavpils', 'Jelgava', 'Liepaja', 'Jurmala', 'Valmiera', 'Ventspils', 'Marupe'. Case-insensitive. |
categories | array | (empty) | Filter by one or more job categories. |
workTimes | array | (empty) | Filter by work time type. |
isRemoteWork | boolean | false | Only return remote or hybrid work positions. |
salaryFrom | integer | (empty) | Filter to jobs offering at least this gross monthly salary in EUR. |
daysOld | integer | (empty) | Only return jobs published within this many days. Leave empty to return all. |
skipReposts | boolean | false | Skip jobs that have been renewed/reposted (renewedDate differs from publishDate). Cross-run deduplication with 90-day memory is always active. |
maxResults | integer | 100 | Maximum number of jobs to extract. Default: 100. |
startUrls | array | (empty) | Optional list of direct vacancy URLs to scrape. When provided, the search filters above are ignored. |
fetchDetails | boolean | false | Fetch full job details from individual listing pages (richer description and categories). |
Output schema
Every field below is present on every record. Fields the source does not publish for a given job are returned as null rather than omitted.
| Field | Type | Description |
|---|---|---|
vacancyId | number | Vacancy id. |
title | string | Job title |
vacancyUrl | string | Vacancy url. |
employerName | string | Employer name. |
city | string | City of the role |
country | string | Country of the position. |
workTypes | array | Work types. |
categories | array | Categories. |
remoteWorkType | string | e.g. remote, hybrid, office |
salaryFrom | number | Salary from. |
salaryTo | number | Salary to. |
salaryCurrency | string | Always EUR when present |
salaryPeriod | string | e.g. Monthly, Hourly |
isHourlySalary | boolean | Is hourly salary. |
publishDateISO | string | Publish date iso. |
renewedDate | string | Renewed date. |
expirationDate | string | Expiration date. |
searchQuery | array | Search query. |
quickApply | boolean | Quick apply. |
isRepost | boolean | true when the listing is a repost of an earlier job (detected by content hash). |
isRemoteWork | boolean | Is remote work. |
descriptionText | string | Full job description in plain text. |
descriptionType | string | Description type. |
descriptionFileUrl | string | Description file url. |
descriptionMarkdown | string | Full description converted to Markdown. |
source | string | Source. |
scrapedAt | string | Timestamp when this record was scraped. |
Example record
{"vacancyId": 1610016,"title": "B2B pārdošanas speciālists/-e","vacancyUrl": "https://www.cv.lv/lv/vacancy/1610016","employerName": "CV-Online Recruitment","city": null,"country": "LV","workTypes": ["FULL_TIME"],"categories": null,"remoteWorkType": "ON_SITE","salaryFrom": 1900,"salaryTo": 3000,"salaryCurrency": "EUR","salaryPeriod": "MONTH","isHourlySalary": false,"publishDateISO": "2026-07-02T12:20:21.000+00:00","renewedDate": null,"expirationDate": "2026-07-30T23:59:59.999+00:00","searchQuery": ["pārdošana","ražošana","tirdzniecība","adk"],"quickApply": false,"isRepost": false,"isRemoteWork": false,"descriptionText": "CV-Online Recruitment klients – ADK SIA ir oficiālais 3M produktu izplatītājs Baltijā un viens no lielākajiem abrazīvo produktu ražotājiem Eiropā ar 29 gadu pieredzi industrijā. Ik gadu uzņēmums izgat …","descriptionType": "HTML","descriptionFileUrl": null,"descriptionMarkdown": "CV-Online Recruitment klients – ADK SIA ir oficiālais 3M produktu izplatītājs Baltijā un viens no lielākajiem abrazīvo produktu ražotājiem Eiropā ar 29 gadu pieredzi industrijā. Ik gadu uzņēmums izgat …","source": "cv.lv","scrapedAt": "2026-07-02T12:26:48.237Z"}
Examples
Search for pārdevējs roles in Rīga:
{"searchQuery": "pārdevējs","maxResults": 100}
Only jobs from the last 3 days:
{"searchQuery": "pārdevējs","maxResults": 100,"daysOld": 3}
Scrape a specific search URL:
{"startUrls": [{"url": "https://www.cv.lv/"}],"maxResults": 200}
Daily feed (run on a schedule):
{"searchQuery": "pārdevējs","daysOld": 1,"skipReposts": true,"maxResults": 500}
Schedule this input to run once a day in the Apify Scheduler — each run returns only jobs posted in the last 24 hours.
💰 Pricing
$1.5 per 1,000 results — you only pay for successfully retrieved listings. Failed retries are never charged.
| Results | Cost |
|---|---|
| 100 | ~$0.15 |
| 1,000 | ~$1.5 |
| 10,000 | ~$15 |
| 100,000 | ~$150 |
Flat-rate alternatives typically charge $29–$49/month regardless of usage.
Subscription tiers lower the rate further, down to $0.9 per 1,000 at the highest tier. Use the Max results cap in the input to control your spend exactly.
Performance
| Run size | Typical time |
|---|---|
| 100 results | under 1 minute |
| 1,000 results | 2–4 minutes |
| 10,000 results | 20–35 minutes |
Known limitations
- Salary is only returned when the employer publishes it — many listings carry
nullsalary fields. - Company details vary per listing; the scraper returns what the source publishes and never invents data.
- Very large result sets are bounded by the source's own paging limits.
- Listings can be removed by the source at any time, so a small share of URLs may expire shortly after scraping.
Technical details
- Source: cv.lv — Latvia job listings
- Coverage: everything the public search exposes, filterable via the input parameters above
- Retry: automatic retry on network errors with exponential backoff
Need a custom scraper?
Unfenced Group builds Apify actors for any website — for free.
If the site you need isn't in our portfolio yet, just ask. We scope, build, and publish it at no cost to you. You only pay for results — we absorb the compute and proxy costs ourselves. Same pay-per-result pricing, same quality, same standards as every actor in this portfolio.
Get in touch: www.unfencedgroup.nl