
Global Sources Supplier Scraper
scrape.ly/store/cornerledger/globalsources-scraperLead generationE-commerce
2 monthly users

Scrape work.ua job listings in Ukraine by keyword, city or region, category and salary, or from work.ua search, company and job links. Get the full description, salary, recruiter name and phone, skills, languages, employer website, industry and size.
Scrape job listings from work.ua, Ukraine's largest job site: title, salary, employer, address and coordinates, the full description, recruiter name and phone, skills, languages, and the employer's website, industry and size. Search by keyword, city, category and salary, or paste work.ua links. No login, no browser, and 1,000 detailed jobs take about 20 seconds.
salaryMin, salaryMax, currency and period as numbers, plus the "above market average" flag and the employer's salary note.developer, бухгалтер, менеджер з продажу) and, optionally, locations (Kyiv, Lviv, Odesa Region, Remote). You can also paste work.ua URLs.| Field | What it does |
|---|---|
searchTerms | Job titles or keywords, one per line (Ukrainian, English or Russian) |
locations | Cities or regions in Ukraine, or Remote; empty = the whole country |
startUrls | work.ua search, company or job links |
maxResults | Jobs per search term x location, search URL or company URL (0 = all) |
includeDetails | Full job record (description, recruiter, skills, employer info); off = search cards only, faster |
postedWithin | 1, 7, 14 or 30 days |
categories, industries, employmentTypes, languages, education | The site's own filters |
minSalary, maxSalary, salaryOnly | Monthly salary in UAH |
noExperience, studentFriendly, veteranFriendly, disabilityFriendly, retireeFriendly, defermentAvailable, hybridOnly, noResumeNeeded | Job flags |
includeKeywords, excludeKeywords | Keep or skip jobs by words in the title, company or description |
sortBy | date (newest first) or salary |
onlyNewJobs, stateKey | Monitoring mode for scheduled runs |
{
"searchTerms": ["developer", "QA"],
"locations": ["Kyiv", "Remote"],
"maxResults": 50,
"postedWithin": "7",
"minSalary": 40000,
"includeDetails": true
}
One row per job. The main fields:
| Field | Example |
|---|---|
title | Програміст 1C |
company, companyId, companyUrl, companyWebsite | Vatag Group, 3008971, ... |
companyIndustry, companySize, companyIsConfirmed | Food industry, 250-1,000 employees, false |
location, city, street, latitude, longitude | Київ, вулиця Красилівська, 9 |
regionName, regionNameEn, isRemote | Київ, Kyiv, false |
salaryText, salaryMin, salaryMax, salaryCurrency | 30000–40000 грн, 30000, 40000, UAH |
categories, employmentTypes, experience, education | IT, computers, internet; Full-time; 2+ years |
descriptionText, descriptionHtml, descriptionMarkdown | The full description in three formats |
contactPerson, contactPhone | The recruiter the employer named |
skills, languages | Key skills, required languages with level |
isHot, isHybrid, isStudentFriendly, isVeteranFriendly, isDefermentEligible, ... | Job flags |
postedAt, url, jobId | Publication time, job page, work.ua id |
Example (from a test run, trimmed; the contact is replaced with a fictional one):
{
"jobId": "8288025",
"title": "Програміст 1C",
"company": "Vatag Group",
"companyId": "3008971",
"companyUrl": "https://www.work.ua/jobs/by-company/3008971/",
"companyLogo": "https://assets.work.ua/employer_design/3008971/company_logo_v1.png",
"companyWebsite": "https://www.vatag.com.ua",
"companyIndustry": "Food industry",
"companySize": "250-1,000 employees",
"location": "Київ, вулиця Красилівська, 9",
"city": "Київ",
"latitude": 50.3945191,
"longitude": 30.5070768,
"regionId": 39,
"regionNameEn": "Kyiv",
"isRemote": false,
"categories": ["IT, computers, internet"],
"employmentTypes": ["Full-time"],
"experience": "2+ years",
"descriptionText": "Вимоги:\n\n- Досвід роботи від 2 років;\n- Вища освіта;\n...",
"salaryText": null,
"salaryMin": null,
"isHot": true,
"skills": ["Користувач 1С", "Ведення бухгалтерського обліку", "Програмування", "Програмування 1С"],
"languages": [],
"contactPerson": "Олена Коваль",
"contactPhone": "0670000000",
"postedAt": "2026-10-14T13:01:15+03:00",
"url": "https://www.work.ua/jobs/8288025/",
"searchQuery": "developer",
"detailFetched": true
}
The dataset has three views: Jobs, Contacts & employers and Salaries.
You pay $1.50 per 1,000 jobs saved ($0.0015 per job), plus a small platform usage fee for compute and proxy traffic.
Is it legal to scrape work.ua? The scraper only reads public job listings that anyone can see without an account. You are responsible for how you use the data, especially personal data such as recruiter names and phone numbers; follow the GDPR and Ukrainian data protection law where they apply.
Do I need a work.ua account or a proxy? No login is needed. The scraper uses the platform's datacenter proxy by default and switches to Ukrainian residential exits on its own if work.ua starts refusing requests.
How many jobs can I get?
Every job a search shows on work.ua. Set maxResults to 0 for all of them; one broad search can return tens of thousands of jobs.
Why are some fields empty? Employers fill in different things. Salary, address, skills and languages are only present when the employer gave them, anonymous employers have no company name, and recruiter contacts, skills and employer details need Full job details on.
Which languages can I search in? Ukrainian, English and Russian keywords all work, and so do city names in all three languages (Kyiv, Київ, Киев).
Can I schedule it or use the API? Yes. Schedule runs in the console, call the actor with the API, or connect it to webhooks and integrations. Turn on Only new or changed jobs for daily alerts.
/jobs/by-company/<id>/); the company profile text is not included.Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
searchTermsarrayOptionalSearch terms
Job titles or keywords to search for, one per line, in any language the site understands (Ukrainian, English or Russian), e.g. 'developer', 'бухгалтер', 'менеджер з продажу'. Each term is searched in every location below. Leave empty to browse all jobs that match the location and filters.
locationsarrayOptionalLocations
Cities or regions in Ukraine, one per line: Kyiv, Lviv, Odesa, Kharkiv Region, Київ, Remote (remote jobs) ... Ukrainian, English and Russian names work, and so do work.ua region ids (Kyiv = 39). Leave empty for the whole country.
startUrlsarrayOptionalwork.ua URLs
Paste work.ua links: search result pages with their filters (https://www.work.ua/jobs-kyiv-it/?days=123), company pages (https://www.work.ua/jobs/by-company/3008971/) or single job pages (https://www.work.ua/jobs/8288025/). Every search and company link is its own search, and job links are scraped directly.
maxResultsintegerOptionaldefault 20Max jobs per search
How many jobs to save for each search term x location, search URL or company URL. 0 = every job the search has.
includeDetailsbooleanOptionaldefault trueFull job details
Load each job's full record: the whole description (text, HTML and Markdown), recruiter name and phone, skills, required languages, employer website, industry and size. Turn off for search-card fields only (title, company, salary, city, short description), which is faster.
Narrow the search. Every filter is applied by work.ua itself unless its description says otherwise.
postedWithinenumOptionaldefault "any"Posted within
Only jobs published or refreshed within this period.
categoriesarrayOptionalCategories
Job categories (the site's sections). Several are combined with OR.
industriesarrayOptionalEmployer industries
The employer's industry. Several are combined with OR.
employmentTypesarrayOptionalEmployment type
Full-time, part-time or both (both = no filter).
minSalaryintegerOptionalMinimum salary (UAH per month)
Only jobs paying at least this much per month. The site filters by its salary steps (10,000 / 15,000 / 20,000 / 30,000 / 40,000 / 50,000 / 100,000); other amounts are also checked exactly on the stated salary.
maxSalaryintegerOptionalMaximum salary (UAH per month)
Only jobs whose stated salary starts at or below this amount.
salaryOnlybooleanOptionaldefault falseOnly jobs with a stated salary
Skip jobs that do not show a salary (checked on each job; skipped jobs are not charged).
educationenumOptionaldefault "any"Education
Education level the job asks for at most (e.g. Secondary keeps jobs open to people with secondary education).
languagesarrayOptionalRequired languages
Jobs that ask for one of these languages.
noExperiencebooleanOptionaldefault falseNo experience needed
Only jobs open to candidates without work experience.
studentFriendlybooleanOptionaldefault falseSuitable for students
Only jobs marked as suitable for students.
disabilityFriendlybooleanOptionaldefault falseSuitable for people with disabilities
Only jobs marked as open to people with disabilities.
veteranFriendlybooleanOptionaldefault falseSuitable for veterans
Only jobs marked as suitable for veterans.
retireeFriendlybooleanOptionaldefault falseSuitable for retirees
Only jobs marked as suitable for retirees.
defermentAvailablebooleanOptionaldefault falseMilitary service deferment
Only jobs that offer a deferment from mobilization.
hybridOnlybooleanOptionaldefault falseHybrid work
Only jobs with a hybrid (office + remote) format. For fully remote jobs add 'Remote' to the locations.
noResumeNeededbooleanOptionaldefault falseApply without a resume
Only jobs you can apply to without a resume.
anyWordbooleanOptionaldefault falseMatch any word
With several words in a search term, find jobs that contain any of them instead of all of them.
includeKeywordsarrayOptionalMust contain keywords
Keep only jobs whose title, company or description contains at least one of these words (checked on each job; skipped jobs are not charged).
excludeKeywordsarrayOptionalExclude keywords
Skip jobs whose title, company or description contains any of these words (checked on each job; skipped jobs are not charged).
sortByenumOptionaldefault "date"Sort by
Order of the results, which decides which jobs come first when the maximum is lower than the number of matches.
For scheduled runs: save only jobs that are new or changed since the previous run with the same searches.
onlyNewJobsbooleanOptionaldefault falseOnly new or changed jobs
Remember the jobs saved by earlier runs with the same input (or the same state key) and save only new jobs and jobs whose title, salary or description changed. Each row gets changeType NEW or UPDATED. Unchanged jobs are skipped and not charged.
stateKeystringOptionalState key
Optional name for the remembered job list, so different inputs can share it. Empty = derived from the searches.
Datacenter exits work for work.ua; the run switches to Ukrainian residential exits on its own if they get refused.
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["DATACENTER…Proxy
Proxy for the requests to work.ua.
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| jobId | string | null | work.ua job id |
| jobKey | string | null | work.ua job id (same as jobId) |
| title | string | null | Job title |
| company | string | null | Employer name (empty for anonymous employers) |
| companyId | string | null | Employer id |
| companyUrl | string | null | All open jobs of the employer |
| companyLogo | string | null | Employer logo URL |
| companyWebsite | string | null | Employer website (full details) |
| companyIsVip | boolean | null | Employer has a VIP account |
| companyIsAgency | boolean | null | Employer is a recruitment agency |
| companyIsConfirmed | boolean | null | Employer is verified by work.ua |
| companyIsAnonymous | boolean | null | Employer is hidden |
| companyIsUkrainian | boolean | null | Employer marked as a Ukrainian company |
| companySupportsVeterans | boolean | null | Employer supports veterans |
| companyIndustryId | number | null | Industry id |
| companyIndustry | string | null | Industry |
| companyStaffCountId | number | null | Company size id |
| companySize | string | null | Company size |
| companyBenefits | array | null | Employer benefit codes (e.g. backup_power) |
| location | string | null | Address or city |
| city | string | null | City of the work address |
| street | string | null | Street |
| house | string | null | House number |
| latitude | number | null | Latitude of the work address |
| longitude | number | null | Longitude |
| distanceToCityCenterKm | number | null | Distance to the city centre in km |
| regionId | number | null | work.ua city/region id |
| regionName | string | null | City/region (Ukrainian) |
| regionNameEn | string | null | City/region (English) |
| isRemote | boolean | null | Remote job |
| categoryIds | array | null | Category ids |
| categories | array | null | Categories |
| jobTypeIds | array | null | Employment type ids |
| employmentTypes | array | null | Employment types |
| experienceTypeId | number | null | Experience id |
| experience | string | null | Required experience |
| educationTypeId | number | null | Education id |
| education | string | null | Required education |
| description | string | null | Description as plain text (short snippet without full details) |
| descriptionText | string | null | Description as plain text |
| descriptionHtml | string | null | Description HTML (full details) |
| descriptionMarkdown | string | null | Description as Markdown (full details) |
| salaryText | string | null | Salary as shown, e.g. 30000–40000 грн |
| salaryMin | number | null | Salary from (UAH per month) |
| salaryMax | number | null | Salary to (UAH per month) |
| salaryCurrency | string | null | UAH |
| salaryPeriod | string | null | MONTH |
| salaryType | string | null | MONTH |
| salaryComment | string | null | Employer's note on the salary |
| isSalaryAboveMarketAverage | boolean | null | Salary above the market average |
| isHot | boolean | null | Hot job |
| isUrgent | boolean | null | Urgent (same as hot) |
| isVip | boolean | null | VIP employer |
| isNoResume | boolean | null | Apply without a resume |
| isShow | boolean | null | Listed in search |
| isAnonymous | boolean | null | Anonymous employer |
| isHybrid | boolean | null | Hybrid work |
| isDisabilityFriendly | boolean | null | Open to people with disabilities |
| isStudentFriendly | boolean | null | Suitable for students |
| isVeteranFriendly | boolean | null | Suitable for veterans |
| isRetiredFriendly | boolean | null | Suitable for retirees |
| isDefermentEligible | boolean | null | Offers military service deferment |
| experienceRequired | boolean | null | Experience required |
| skills | array | null | Key skills (full details) |
| languageIds | array | null | Language ids |
| languageLevelIds | array | null | Language level ids |
| languages | array | null | Required languages and levels (full details) |
| schedule | object | null | Work schedule as the site gives it |
| activeUsersCount | number | null | Job seekers viewing the job |
| postedAt | string | null | Publication date |
| scrapedAt | string | null | When the job was scraped |
| url | string | null | Job page |
| applyUrl | string | null | Where to apply |
| canonicalUrl | string | null | Canonical job URL |
| portalUrl | string | null | https://www.work.ua |
| contactPerson | string | null | Recruiter name (full details) |
| contactPhone | string | null | Recruiter phone (full details) |
| hasPhone | boolean | null | The job shows a phone number |
| extractedEmails | array | null | Emails found in the description |
| extractedPhones | array | null | Phone numbers found in the description |
| extractedUrls | array | null | Links found in the description |
| socialProfiles | object | null | Employer social profiles |
| searchQuery | string | null | Search term that found the job |
| source | string | null | work.ua |
| sourceDomain | string | null | work.ua |
| sourceCountry | string | null | UA |
| contentQuality | string | null | full or serp_only |
| detailFetched | boolean | null | Full job record loaded |
| contentHash | string | null | Hash of the job's content |
| changeType | string | null | NEW or UPDATED (monitoring mode only) |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| Job | One saved job listing. | $0.0015 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('openrole/work-ua-scraper').call({
"searchTerms": [
"developer"
],
"locations": [
"Kyiv"
],
"maxResults": 20,
"proxyConfiguration": {
"useScrapelyProxy": true,
"scrapelyProxyGroups": [
"DATACENTER"
]
}
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run openrole/work-ua-scraperPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=openrole/work-ua-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
Inputs the developer prepared for common jobs. Open one to see its input, then copy it to your account to run it as-is or adjust it.
Ukrainian keyword in one city without full job records.
Remote jobs with recruiter contacts, skills and employer info.
Paste a work.ua company page to list its open jobs.
Paste a work.ua search URL; its city, category and period are kept.
Minimum salary, full-time and posted within 14 days, highest salary first.
Browse a whole region and category without a search term.
Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.