DOU.ua Job Scraper avatar

DOU.ua Job Scraper

Pricing

from $1.20 / 1,000 results

Go to Apify Store
DOU.ua Job Scraper

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

Unfenced Group

Maintained by Community

Actor stats

2

Bookmarked

30

Total users

12

Monthly active users

0.6 hours

Issues response

5 days ago

Last modified

Share

DOU.ua Job Scraper

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

ParameterTypeDefaultDescription
searchQuerystring"developer"Keyword to filter by. Searches job title and description. Example: "Python", "senior QA".
categorystring(empty)Job category, e.g. Python, QA, DevOps, Front End. Leave empty for all categories.
citystring(empty)City filter. Examples: "Київ", "Львів", "Харків", "Одеса". DOU has no dedicated remote filter — leave city empty and use the isRemote field in the results.
experiencestring(empty)Required experience: 0-1, 1-3, 3-5 or 5plus years.
daysOldinteger0Only return listings posted within the last N days. 0 returns all listings.
fetchDetailsbooleanfalseON: adds the full job description, company profile blurb and detail-page category. OFF: returns listing-level data only (faster, lower cost).
startUrlsarray(empty)Optional list of direct DOU vacancy URLs to scrape. When provided, the search filters above are ignored.
maxItemsinteger5Maximum 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

FieldTypeDescription
titlestringJob title as published.
urlstringDirect link to the listing.
vacancyIdstringNumeric DOU vacancy id.
companystringHiring company name.
companyUrlstringLink to the company's vacancies page on DOU.
companySlugstringCompany slug from the URL.
salaryRawstring | nullSalary exactly as displayed (null if the employer did not publish one).
salaryMinnumber | nullParsed minimum salary (null if not published).
salaryMaxnumber | nullParsed maximum salary (null if not published).
salaryCurrencystring | nullSalary currency: USD, EUR or UAH (null if not published).
citiesarrayList of city names attached to the listing.
isRemotebooleantrue when the listing is marked remote/віддалено.
publishDatestring | nullPublish date in YYYY-MM-DD.
snippetstring | nullShort teaser text from the listing.
isHotbooleantrue when DOU flags the listing as hot/featured.
categorystring | nullJob category. Reflects the category filter when set; replaced by the source's own category when fetchDetails is on.
changeStatusstringNEW, UPDATED, UNCHANGED or REAPPEARED versus previous runs.
contentHashstringStable 16-character hash of the listing's key fields.
sourcestringAlways dou.ua.

With fetchDetails: true

FieldTypeDescription
descriptionHtmlstring | nullFull job description as raw HTML.
descriptionTextstring | nullFull job description as plain text.
descriptionMarkdownstring | nullFull job description converted to Markdown.
companyDescriptionstring | nullThe 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.

ResultsCost
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 sizeTypical time
100 resultsunder 1 minute
1,000 results2–4 minutes
10,000 results20–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 null salary fields.
  • The full job description and company profile blurb require fetchDetails: true; without it those fields are null.
  • DOU has no server-side remote or date filter, so remote detection and daysOld are 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