Djinni, DOU & JustJoin.it IT Jobs Scraper avatar

Djinni, DOU & JustJoin.it IT Jobs Scraper

Pricing

from $0.80 / 1,000 job records

Go to Apify Store
Djinni, DOU & JustJoin.it IT Jobs Scraper

Djinni, DOU & JustJoin.it IT Jobs Scraper

All Ukrainian and Polish tech jobs in one run: Djinni, DOU and JustJoin.it in one schema, salaries converted to EUR, duplicates merged across boards, and a monitoring mode that returns only new and closed positions.

Pricing

from $0.80 / 1,000 job records

Rating

0.0

(0)

Developer

Andrew Boiko

Andrew Boiko

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 hours ago

Last modified

Categories

Share

Scrape IT jobs from Ukraine's and Poland's biggest tech job boards in one run - Djinni.co, DOU.ua (jobs.dou.ua) and JustJoin.it - into one clean, de-duplicated dataset with salaries converted to EUR per month, seniority, English level, remote type, skills and the full job description. Schedule it in "New since last run" mode to receive only fresh jobs - plus the ones that were taken down (usually: filled).

Who is it for?

  • Recruiters and staffing / outstaffing agencies - a daily feed of new PHP, Python, Java, DevOps... jobs in Ukraine and Poland, with salaries, ready for your CRM or ATS.
  • HR, comp & ben analysts - salary benchmarks for Ukrainian and Polish IT in one currency (EUR / month, B2B vs. employment contract).
  • Lead generation for IT service companies - companies that are hiring right now are companies with a budget and a need.
  • Job seekers and career services - one alert instead of three boards, filtered by stack, level, remote and minimum salary.
  • Market research and media - demand by technology and seniority, remote share, salary trends.

What data do you get?

FieldExample
title, normalizedTitlePHP Engineer (F/M), php developer
company, location, countryPayPo, Warszawa, PL
seniority, experienceYears, englishLevelmiddle, 3, B2
remotefull / hybrid / flexible / office / unknown
salaryMin, salaryMax, salaryCurrency, salaryPeriod, salaryType19000, 22000, PLN, month, b2b
salaryEurMonthlyMin, salaryEurMonthlyMax, fxRateDate4341, 5026, 2026-10-05
skills[], categoryPHP 8, Symfony 6, MySQL, Docker...
postedAt, url, source, alsoPostedOn[]the same job on other boards is merged
descriptionMarkdownfull description as clean Markdown
changeTypeactive, or new / updated / delisted in monitoring mode

Salaries are converted with the official National Bank of Ukraine exchange rates of the day; hourly B2B rates are converted with 168 hours per month.

How to use it

  1. Choose job boards (all three by default) and technologies / roles (Python, PHP, JavaScript, Java, .NET, Go, DevOps, QA, Data, AI/ML, Design, PM, Sales... 35 categories, mapped to each board's own categories).
  2. Optionally add keywords (e.g. "Laravel", "fintech"), exclude words, seniority, remote only, minimum salary in EUR, only jobs with a salary, and posted within N days.
  3. Click Start and download the results as JSON, CSV, Excel or HTML, or get them via API.

Example input - senior remote PHP/Python jobs paying at least €3,000/month

{
"sources": ["djinni", "dou", "justjoin"],
"technologies": ["php", "python"],
"seniority": ["senior", "lead"],
"remoteOnly": true,
"minSalaryEur": 3000,
"postedWithinDays": 7,
"maxItems": 200
}

Example output (one job, shortened)

{
"jobId": "justjoin:de7cb53f-ffdb-4233-8b52-3d6d5c330a9c",
"changeType": "active",
"source": "justjoin",
"url": "https://justjoin.it/job-offer/paypo-php-engineer-f-m-inzynier-php-k-m--warszawa-php-149b69dd",
"title": "PHP Engineer (F/M) / Inżynier PHP (K/M)",
"normalizedTitle": "php developer",
"company": "PayPo",
"location": "Warszawa",
"country": "PL",
"remote": "full",
"seniority": "middle",
"englishLevel": "B2",
"skills": ["PHP 8", "Symfony 6", "MySQL", "Docker", "REST API", "AWS"],
"salaryMin": 19000,
"salaryMax": 22000,
"salaryCurrency": "PLN",
"salaryPeriod": "month",
"salaryType": "b2b",
"salaryEurMonthlyMin": 4341,
"salaryEurMonthlyMax": 5026,
"fxRateDate": "2026-10-05",
"postedAt": "2026-10-02T14:00:08.495Z",
"alsoPostedOn": [],
"descriptionMarkdown": "**O PayPo**\n\nW PayPo tworzymy przyszłość płatności cyfrowych..."
}

The run summary (OUTPUT) shows per-board status, how many jobs were collected, filtered and merged, and any warnings.

Monitoring: only new jobs, every day

Set Mode = New since last run and create a schedule (e.g. every morning at 8:00). Each run returns only:

  • new - jobs you have not received before,
  • updated - jobs whose title or salary changed,
  • delisted - jobs from your previous runs that disappeared from the board (a strong signal that the position was filled or closed).

Add a digest webhook (Slack, Discord, Microsoft Teams, Make, Zapier, n8n) and get a short message with the new jobs after every run. The history is kept per search (or per Monitoring state key), so several saved tasks can monitor different stacks independently.

Pricing

Pay per event - you pay only for jobs you receive:

EventPrice
Job saved to the dataset$0.001 per job ($1 per 1,000 jobs)
Digest delivered to your webhook$0.01 per digest (only when it was delivered)

plus a small per-run start fee shown on the Pricing tab. Platform usage is included. Max jobs and your maximum cost per run are always respected.

Example: a daily monitor for PHP + Python jobs in Ukraine and Poland that finds 40 new jobs a day costs about $0.04 per day (~$1.25 per month).

Integrations and API

Export to Google Sheets, Excel, Airtable, HubSpot/your CRM via Make, Zapier or n8n, or call it from code and from AI agents (Apify API, Apify MCP server).

curl -X POST "https://api.apify.com/v2/acts/<USERNAME>~djinni-dou-justjoin-jobs-scraper/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"technologies":["devops"],"remoteOnly":true,"maxItems":100}'
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_TOKEN>' });
const run = await client.actor('<USERNAME>/djinni-dou-justjoin-jobs-scraper').call({ technologies: ['java'], seniority: ['senior'] });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.map((j) => `${j.title} @ ${j.company}: €${j.salaryEurMonthlyMin}-${j.salaryEurMonthlyMax}`));

FAQ

Is scraping these job boards legal? The Actor only reads publicly available job listings - the same pages anyone can open without logging in - at a moderate pace, and it does not collect personal data of candidates. Job ads are published by employers to be seen. You are responsible for using the data in line with the boards' terms and applicable law (e.g. do not republish full ads as your own job board without permission).

Do I need a proxy? Usually not. If a board blocks a request while running on Apify, the Actor automatically retries the blocked searches through Apify Proxy. You can also set a proxy explicitly in Proxy configuration.

How is the salary in EUR calculated? With the official National Bank of Ukraine rates for the day of the run (fxRateDate). Ranges are kept as published (salaryMin/salaryMax + currency); B2B and employment-contract salaries are labelled in salaryType.

How are duplicates handled? The same company + the same role + the same remote type across boards becomes one item; the other links are in alsoPostedOn. Turn Merge the same job off to get every listing.

How much memory does a run need? The default 1 GB handles about 10,000 jobs with full descriptions per run, which covers daily monitoring and most exports. For bigger exports (many technologies, tens of thousands of jobs), set Memory to 2 GB or more in the run options.

Something is missing? Open an issue in the Issues tab - requests for more boards (e.g. Work.ua, NoFluffJobs) and fields are welcome.

More tools by the same author