DOU.ua Job Scraper
Pricing
from $1.20 / 1,000 results
DOU.ua Job Scraper
Scrape job listings from DOU.ua — Ukraine's largest IT job board. Filter by category, city, experience and keyword.
Pricing
from $1.20 / 1,000 results
Rating
5.0
(1)
Developer
Unfenced Group
Maintained by CommunityActor stats
2
Bookmarked
30
Total users
12
Monthly active users
0.6 hours
Issues response
5 days ago
Last modified
Categories
Share

Extract IT job listings from jobs.dou.ua — Ukraine's largest tech job board — 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 Ukraine's tech market
A dedicated scraper for jobs.dou.ua, not a global tool with a country dropdown. Category, city and experience filters map directly to the source's own search.
📄 Complete job data
Job title, company, direct listing URL, publish date and a short teaser for every record. Turn on full details to add the complete job description in HTML, plain text and Markdown.
💶 Structured salary
Where the employer publishes a salary, it is parsed into minimum, maximum and currency (USD, EUR or UAH). Missing salaries are returned as null, never guessed.
🏢 Company context
Hiring company name, company page URL and — with full details on — the company's own profile blurb from the vacancy page.
🔁 Change tracking
Every record carries a changeStatus (NEW, UPDATED, UNCHANGED, REAPPEARED) and a contentHash, so scheduled runs show you exactly what changed since last time.
Input parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
searchQuery | string | "developer" | Keyword to filter by. Searches job title and description. Example: "Python", "senior QA". |
category | string | (empty) | Job category, e.g. Python, QA, DevOps, Front End. Leave empty for all categories. |
city | string | (empty) | City filter. Examples: "Київ", "Львів", "Харків", "Одеса". DOU has no dedicated remote filter — leave city empty and use the isRemote field in the results. |
experience | string | (empty) | Required experience: 0-1, 1-3, 3-5 or 5plus years. |
daysOld | integer | 0 | Only return listings posted within the last N days. 0 returns all listings. |
fetchDetails | boolean | false | ON: adds the full job description, company profile blurb and detail-page category. OFF: returns listing-level data only (faster, lower cost). |
startUrls | array | (empty) | Optional list of direct DOU vacancy URLs to scrape. When provided, the search filters above are ignored. |
maxItems | integer | 5 | Maximum number of listings to return. Set to 0 for no limit (scrapes all matching results). |
Output schema
Fields listed as Always present appear on every record. Fields under With fetchDetails: true are only populated when full details are enabled; otherwise they are null. Fields the source does not publish for a given job are returned as null rather than omitted.
Always present
| Field | Type | Description |
|---|---|---|
title | string | Job title as published. |
url | string | Direct link to the listing. |
vacancyId | string | Numeric DOU vacancy id. |
company | string | Hiring company name. |
companyUrl | string | Link to the company's vacancies page on DOU. |
companySlug | string | Company slug from the URL. |
salaryRaw | string | null | Salary exactly as displayed (null if the employer did not publish one). |
salaryMin | number | null | Parsed minimum salary (null if not published). |
salaryMax | number | null | Parsed maximum salary (null if not published). |
salaryCurrency | string | null | Salary currency: USD, EUR or UAH (null if not published). |
cities | array | List of city names attached to the listing. |
isRemote | boolean | true when the listing is marked remote/віддалено. |
publishDate | string | null | Publish date in YYYY-MM-DD. |
snippet | string | null | Short teaser text from the listing. |
isHot | boolean | true when DOU flags the listing as hot/featured. |
category | string | null | Job category. Reflects the category filter when set; replaced by the source's own category when fetchDetails is on. |
changeStatus | string | NEW, UPDATED, UNCHANGED or REAPPEARED versus previous runs. |
contentHash | string | Stable 16-character hash of the listing's key fields. |
source | string | Always dou.ua. |
With fetchDetails: true
| Field | Type | Description |
|---|---|---|
descriptionHtml | string | null | Full job description as raw HTML. |
descriptionText | string | null | Full job description as plain text. |
descriptionMarkdown | string | null | Full job description converted to Markdown. |
companyDescription | string | null | The company's own profile blurb shown on the vacancy page. |
Example record
{"title": "Python Developer","url": "https://jobs.dou.ua/companies/example-tech/vacancies/365320/","vacancyId": "365320","company": "Example Tech","companyUrl": "https://jobs.dou.ua/companies/example-tech/vacancies/","companySlug": "example-tech","salaryRaw": "$3000–3500","salaryMin": 3000,"salaryMax": 3500,"salaryCurrency": "USD","cities": ["Київ"],"isRemote": false,"publishDate": "2026-07-10","snippet": "We are looking for a Python developer to join our backend team...","isHot": true,"category": "Python","changeStatus": "NEW","contentHash": "9f2b1c4a7d3e8b06","source": "dou.ua","descriptionHtml": "<p>We are looking for a Python developer...</p>","descriptionText": "We are looking for a Python developer to join our backend team...","descriptionMarkdown": "We are looking for a Python developer to join our backend team...","companyDescription": "Example Tech builds data platforms for European fintech clients."}
Examples
Search for Python roles in Kyiv:
{"searchQuery": "Python","city": "Київ","maxItems": 100}
All QA jobs with full details:
{"category": "QA","fetchDetails": true,"maxItems": 200}
Scrape specific vacancy URLs:
{"startUrls": [{ "url": "https://jobs.dou.ua/companies/example-tech/vacancies/365320/" }],"fetchDetails": true}
Daily feed (run on a schedule):
{"category": "DevOps","daysOld": 1,"maxItems": 500}
Schedule this input to run once a day in the Apify Scheduler — each run returns only jobs posted in the last 24 hours, and changeStatus flags what is new.
💰 Pricing
$1.50 per 1,000 results — you only pay for successfully retrieved listings. Failed retries are never charged.
| Results | Cost |
|---|---|
| 100 | ~$0.15 |
| 1,000 | ~$1.50 |
| 10,000 | ~$15.00 |
| 100,000 | ~$150.00 |
Flat-rate alternatives typically charge $29–$49/month regardless of usage.
Subscription tiers lower the rate further, down to $0.90 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 |
Full details (fetchDetails: true) fetch one extra page per listing, so larger runs take longer.
Known limitations
- Salary is only returned when the employer publishes it — many listings carry
nullsalary fields. - The full job description and company profile blurb require
fetchDetails: true; without it those fields arenull. - DOU has no server-side remote or date filter, so remote detection and
daysOldare applied from the scraped data. - Listings can be removed by the source at any time, so a small share of URLs may expire shortly after scraping.
Technical details
- Source: jobs.dou.ua — Ukraine IT job listings
- Push notifications: get new results delivered to Telegram, Discord, Slack, WhatsApp or any webhook the moment a scheduled run finds them
- Coverage: everything the public search exposes, filterable via the input parameters above
- Retry: automatic retry on network errors with exponential backoff
Rate this actor
If this scraper does its job, a short review on the Reviews tab helps other users find it. Something not working? Open an issue on the Issues tab instead — issues get fixed.
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