Work.ua Scraper — Ukraine Vacancies, Salary & Firms
Pricing
from $10.00 / 1,000 results
Work.ua Scraper — Ukraine Vacancies, Salary & Firms
Scrape vacancies from Work.ua, Ukraine's largest job board: title, employer with verified badge and type, location, advertised salary with a sortable numeric floor, hot and deferment flags and the ad link. Keyless. JSON, CSV or Excel.
Pricing
from $10.00 / 1,000 results
Rating
0.0
(0)
Developer
Logiover
Maintained by CommunityActor stats
0
Bookmarked
14
Total users
2
Monthly active users
7 days ago
Last modified
Categories
Security
Limited permissionsShare
Export vacancies from Work.ua, Ukraine's largest job board — employer, location, advertised salary and ad link — to JSON, CSV or Excel. Keyless, no login.
What does Work.ua Scraper do?
Work.ua serves plain server-rendered HTML with no JSON API behind it, so this Actor parses the listing cards directly and walks the pagination until your target is met. No API key, no account, no cookies.
The card layout is the reason most Work.ua scrapers ship dirty data: the employer name and the salary use the same CSS class, and the location line ends with either a city or a "8.8 km from center" distance chip. Pick "the first matching element" and every ad that advertises pay lands its salary in the company column. This Actor anchors on the icon inside each block — hryvnia for salary, company for employer — so the two never swap, and it splits the distance chip into its own field instead of passing it off as a city.
Salaries are written with thin-space separators (60 000 – 80 000 UAH). The Actor keeps the original label and derives a sortable numeric floor, so you can filter by pay without parsing strings yourself.
Who is it for?
- Recruitment agencies tracking who is hiring in Ukraine and at what rate.
- Salary researchers building pay benchmarks by role and city.
- B2B sales teams using hiring activity as a growth signal.
- Job boards and aggregators that need a Ukrainian feed.
- Relocation and remote-work platforms sourcing roles open to remote candidates.
Use cases
- Build a salary benchmark for drivers or developers across Kyiv, Lviv and Poltava.
- List every verified employer currently hiring in a category, with ad links.
- Track how many vacancies offer deferment, week over week.
- Filter to ads that publish pay and rank them by advertised floor.
- Feed a niche board with fresh Ukrainian listings.
Why use this Actor?
- Keyless — nothing to sign up for.
- 20 structured fields, with salary, employer and location cleanly separated.
- Sortable salary — original label plus a numeric floor.
- Verified-employer flag straight from Work.ua's own badge.
- Hot and deferment flags, useful signals in the current Ukrainian market.
- English or Ukrainian interface language.
What data can you extract?
| Field | Type | Description |
|---|---|---|
jobId | string | Work.ua vacancy ID |
title | string | Job title |
jobUrl | string | Public ad page |
employerName | string | Employer name |
employerType | string | Employer type, e.g. Agency |
employerVerified | boolean | Work.ua verified identity |
employerLogoUrl | string | Employer logo |
location | string | City or "Remote" |
isRemote | boolean | The ad is for remote work |
requirements | string | Experience and schedule line, e.g. "Experience more than 2 years · Standard schedule: 5/2" |
salaryLabel | string | Salary exactly as advertised |
salaryNote | string | Work.ua's own note, e.g. "Above average" |
salaryFrom | number | Numeric floor for sorting and filtering |
salaryTo | number | Upper end when the ad gives a range |
distanceFromCentre | string | Distance chip, when the ad shows one |
currency | string | UAH when a salary is present |
isHot | boolean | Marked as a hot vacancy |
hasDeferment | boolean | Employer offers deferment |
badges | string | All badges on the card |
postedLabel | string | Posting date as shown |
postedDate | string | Posting date as ISO YYYY-MM-DD |
descriptionSnippet | string | Opening lines of the ad text |
employerHidden | boolean | The employer chose to hide its name |
country | string | Ukraine |
source | string | Always work_ua |
scrapedAt | string | Run timestamp (ISO 8601) |
Example output
{"jobId": "8240196","title": "Водій категорії СЕ","jobUrl": "https://www.work.ua/en/jobs/8240196/","employerName": "Арія Транс","employerVerified": true,"location": "Kyiv","salaryLabel": "40 000 – 60 000 UAH","salaryNote": "Above average","salaryFrom": 40000,"distanceFromCentre": "8.8 km from center","currency": "UAH","hasDeferment": true,"country": "Ukraine","source": "work_ua"}
How to use it
- Enter a keyword, or leave it empty to walk the full listing.
- Optionally narrow by category slug, city ID or minimum salary.
- Switch on Only ads with a salary when you are building a pay benchmark.
- Set Maximum results and run, then export JSON, CSV or Excel.
Input example
{"query": "driver","withSalaryOnly": true,"maxResults": 1000}
Additional input fields
These optional fields are also available in the input form and API:
| Field | Type | Default | Description |
|---|---|---|---|
proxyConfiguration | proxy | {"useApifyProxy": true, "apifyProxyGr... | This source refuses ordinary datacenter and residential proxy IPs, so the Actor defaults to the UNBLOCKER group, which was verified to reach it. |
Notes and limits
- Roughly 7 in 10 vacancies publish a salary. The rest leave
salaryLabel,salaryFromandcurrencyasnull— that is the ad, not a parsing gap. Use Only ads with a salary to drop them. distanceFromCentreappears only on ads that show a distance chip; it is deliberately kept out of thelocationcolumn.- Work.ua renders 14 cards per page; the Actor stops when a page returns fewer, meaning the listing is exhausted.
- Listing text is in Ukrainian even with the English interface, because employers write the ads.
- You are responsible for how you use employer data, including under GDPR.
FAQ
Do I need a Work.ua account? No. The listings are public and this Actor needs nothing from you.
Is the salary usable for sorting?
Yes. salaryFrom is a real number derived from the advertised range's lower bound.
Why is location sometimes "Remote"?
Because the employer listed the role as remote; Work.ua shows that in place of a city.
Does it fetch the full job description?
No. This Actor exports the listing cards, which is what makes bulk runs fast and cheap. Open jobUrl for the full text.
How am I charged? Pay per result — you pay for the vacancies delivered.
*Maintained: last verified 2026-11-01 — checked end-to-end against live run history (reliability, output fields and types, and time/memory budgets).
Related scrapers
Other Actors from the same collection:
Scheduling and integrations
Run this Actor on a schedule — hourly, daily or weekly — and have every run append to the same dataset, which is how you turn a one-off export into a time series. Results can be pushed straight into Google Sheets, Slack, Zapier, Make, Airtable or any Webhook.
How much Work.ua data can you extract in one run?
A single run returned 572 job ads in 524 seconds on the example input. That is roughly 65 job ads a minute. Widen the search — more queries, more pages, a broader location — and the same run goes deeper.
There is no hard ceiling built into this Actor. What bounds a run is the result limit you set, the breadth of the input you give it, and how much Work.ua itself publishes. Because billing is per result, a wider run costs proportionally more and a narrow one costs almost nothing — so it is worth starting small and scaling once the output looks right.
Work.ua scraping — frequently asked questions
Do I need a Work.ua API key, account or login?
No. This Actor reads publicly available pages and feeds, so there is nothing to register for and no credentials to manage.
How do I export Work.ua data to CSV, Excel, JSON or Google Sheets?
Open the Storage tab after a run and pick the format you want — CSV, Excel, JSON, XML or an HTML table. For Google Sheets, Airtable or a database, use the dataset URL or the Apify API so the sheet refreshes itself on every run.
Can I schedule this Work.ua scraper to run daily or hourly?
Yes. Use the Schedules tab and pick a cadence. Daily is enough for most tracking work; pick hourly only if the job ads you care about really do change that fast.
How many job ads can I get, and what does it cost?
See the volume section above for a measured figure. Billing is per result, so you pay for the rows you actually receive and a run that finds nothing costs nothing.
Is scraping Work.ua legal?
This Actor collects only information that Work.ua publishes publicly. It does not log in, does not defeat access controls and does not touch private data. You remain responsible for how you use the output, including under GDPR and similar rules where personal data is involved.
What happens if Work.ua blocks the run or changes its layout?
A refused exit IP is swapped for a fresh one within a quarter of a second and retried, and rate limiting is waited out rather than fought. If nothing gets through, the run fails with the reason instead of reporting success with zero rows — so an empty result always means "no matches", never "the source would not answer".
Can I use this with an AI agent, LangChain or an MCP client?
Yes. The Actor is callable over the Apify API and through Apify's MCP server, so an agent can run it and read the dataset back as a tool call.
Legal and compliance
This Actor collects publicly available information from Work.ua only. It does not log in, does not circumvent access controls, and collects no private data. You are responsible for using the output lawfully, including under GDPR and comparable regimes where the rows contain personal data, and for respecting Work.ua's terms where they apply to you.
This Actor is an independent tool. It is not affiliated with, endorsed by, or sponsored by Work.ua; Work.ua and all other trademarks mentioned here are the property of their respective owners.
📝 Changelog
2026-11-01
- Monthly health check (2026-11-01): a live run on the current build completed successfully and returned data. Input options, output fields and pricing are unchanged.
- README refreshed: independence disclaimer added; documented 1 additional input field.
2026-10-15
- Every request now has a hard time limit, so a proxy connection that stalls can no longer hold up the run or push it past its timeout.
- A run that reaches its maximum cost per run now stops cleanly with its results saved and a status message, instead of ending as aborted.
- A proxy group your account cannot use no longer stops the run at start-up; it falls back to the default Apify Proxy.
2026-10-12
- Fixed TIMED-OUT runs: pages are fetched six at a time (Work.ua answers only through the slow UNBLOCKER route) and the time budget follows the run's real timeout — 400 ads now take ~2 minutes instead of ~15.
- Location is filled again (Work.ua moved it into its own block in the 2026 redesign; it was empty on most rows). New columns: requirements, remote flag, salary upper bound, description preview, posting date as ISO date, hidden-employer flag.
- A search with no vacancies now ends successfully with a clear status message instead of failing; the UNBLOCKER route is enforced even when only
useApifyProxyis set. - Every Actor process now caps the JavaScript heap at ~70 % of the run's memory. The platform default lets the heap grow until the container is killed (exit 137), which showed up as random failed runs.
2026-09-24
- Fixed runs that finished successfully with an empty dataset. A crawl that is blocked and a search that genuinely has no results both produce an empty file; the Actor now fails with an explicit
NO_ROWSerror and writes aSUMMARYrecord instead of reporting success. - Diagnosis: Work.ua refuses datacenter and residential proxy IPs with HTTP 403.
- Proxy configuration now defaults to the UNBLOCKER group, which was measured fetching this source reliably where datacenter and residential IPs were refused.
2026-09-23
- Fleet-wide quality audit. Verified end to end against live data and re-checked the input schema, the output columns and the run configuration.
- Run reliability reviewed: 100.0% of public runs succeeded in the last 30 days.
- Input schema, output schema and pricing configuration reviewed.
2026-09-01
- Fleet-wide health check. Verified against this Actor's real run history: 30-day success rate, output row counts, per-field fill rates, and peak memory against the configured memory limit.
- Reviewed for the failure patterns that have cost this fleet runs — unguarded proxy setup, retry loops that can outlast the run's own time budget, and full-page HTML parsing that can exhaust a small container.
- No change to input, output fields or scraping logic.