# Djinni.co Jobs Scraper — UA Tech Vacancies | $1.5/1k (`skipper_lume/djinni-jobs-scraper`) Actor

Scrape tech jobs from Djinni.co (and optionally Dou.ua): title, company, salary tier, remote, experience, English, locations, full JobPosting description. Filters by keyword/employment. Incremental new/delisted monitoring. Only dedicated Djinni scraper on Apify.

- **URL**: https://apify.com/skipper\_lume/djinni-jobs-scraper.md
- **Developed by:** [Maksym Horbachov](https://apify.com/skipper_lume) (community)
- **Categories:** Jobs, Lead generation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 95.8% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.05 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Djinni.co Jobs Scraper — UA Tech Vacancies | $1.5/1k

Extract structured tech job data from **Djinni.co** — Ukraine's #1 IT job board for developers. Optional **Dou.ua** jobs in the same actor. Title, company, salary tier, remote, experience, English level, locations, and full JobPosting descriptions.

> **$1.50 per 1,000 jobs** — the only dedicated Djinni.co scraper on Apify.

### Why This Actor?

- **Only Djinni scraper** on Apify — recruiters and analysts searching Store find you
- **Zero setup** — no API key, no login
- **Fast & cheap** — pure HTTP + schema.org `JobPosting` JSON-LD (no browser)
- **Dou.ua optional** — set `site: dou` or `both`
- **Incremental monitoring** — `new` / `delisted` across scheduled runs (lead gen gold)
- **Recruiting / lead gen** — categories JOBS + LEAD\_GENERATION
- **Agency-ready** — daily schedule + `onlyChanges` = only brand-new openings in your CRM

### Recruiting agency playbook

1. Pick 3–5 keywords you staff (`Python`, `React`, `DevOps`, `QA`, `Flutter`)
2. Create one Apify **Schedule per keyword** (daily 08:00 Kyiv)
3. Input:

```json
{
    "mode": "search",
    "site": "djinni",
    "keyword": "Python",
    "employment": "remote",
    "maxResults": 100,
    "incremental": true,
    "stateKey": "agency-python-remote",
    "onlyChanges": true,
    "detectDelisted": true
}
```

4. Attach a **webhook** → your sheet / n8n / Make / Slack
5. Outreach only to `changeType: new` companies — warm leads, not stale boards

Cost: cents/day at $1.50/1k. Optional `site: both` to also pull Dou.ua.

### What Data You Get

| Field | Example | Description |
|-------|---------|-------------|
| `title` | Senior Python Developer | Role title |
| `company` | Numerical Technologies | Hiring company |
| `salaryTier` | $$$$ | Djinni dollar-tier |
| `salaryMax` | 6000 | When explicitly shown (USD) |
| `remote` | true | Remote-only signal |
| `experienceYears` | 5 | Years of experience |
| `englishLevel` | B2 | English requirement |
| `category` | Python | Primary skill category |
| `countries` | \["POL"] | Applicant location countries |
| `datePosted` | ISO datetime | Posted date |
| `description` | Full text | From JobPosting / detail |
| `changeType` | new / delisted | Incremental mode |

#### Sample Output

```json
{
    "id": "833481",
    "url": "https://djinni.co/jobs/833481-senior-python-developer/",
    "title": "Senior Python Developer",
    "company": "Numerical Technologies",
    "category": "Python",
    "salaryTier": "$$$$",
    "remote": true,
    "experienceYears": 5,
    "englishLevel": "B2",
    "countries": ["POL"],
    "datePosted": "2026-07-10T18:07:46.790363",
    "source": "djinni"
}
```

### Use Cases

| Who | What |
|-----|------|
| **Recruiters / agencies** | Daily new Python/React openings |
| **Salary / market research** | Track tier mix and remote share |
| **Founders** | Competitive hiring intel |
| **Lead gen** | Companies actively hiring = warm outreach |

### Modes

#### `search`

```json
{
    "mode": "search",
    "site": "djinni",
    "keyword": "Python",
    "employment": "remote",
    "maxResults": 50
}
```

#### `url`

```json
{
    "mode": "url",
    "startUrl": "https://djinni.co/jobs/?primary_keyword=React",
    "maxResults": 100
}
```

#### `jobs` — specific vacancies

```json
{
    "mode": "jobs",
    "jobUrls": ["https://djinni.co/jobs/833481-senior-python-developer/"],
    "fetchDetails": true
}
```

#### Dou.ua

```json
{
    "mode": "search",
    "site": "dou",
    "keyword": "Python",
    "maxResults": 40
}
```

### Incremental (lead gen)

```json
{
    "mode": "search",
    "keyword": "Python",
    "incremental": true,
    "stateKey": "python-remote",
    "onlyChanges": true,
    "detectDelisted": true
}
```

Schedule daily → only **new** openings hit your webhook.

### Pricing

| Event | Price |
|-------|------:|
| Result | **$0.0015** ($1.50 / 1,000) |
| Actor start | $0.00005 / GB |

Default memory: **256 MB**. Typical 50-job run is cents.

### Tips

- List pages already include JobPosting JSON-LD — keep `fetchDetails: false` for cheap bulk
- Enable details when you need the full description for LLM matching
- Pair with incremental + Apify Schedule for a recruiting radar

# Actor input Schema

## `mode` (type: `string`):

search: filters. url: paste jobs list URL. jobs: scrape specific vacancy URLs.

## `site` (type: `string`):

Which job board to scrape: djinni (default), dou, or both.

## `keyword` (type: `string`):

Djinni primary\_keyword (Python, React…) or Dou category name.

## `employment` (type: `string`):

Djinni employment filter, e.g. remote.

## `region` (type: `string`):

Optional Djinni region filter query value.

## `experience` (type: `string`):

Optional Djinni exp query value.

## `search` (type: `string`):

Free-text search on Dou.ua vacancies.

## `startUrl` (type: `string`):

Jobs list URL from djinni.co or jobs.dou.ua. Used when mode=url.

## `jobUrls` (type: `array`):

Specific vacancy URLs. Used when mode=jobs.

## `fetchDetails` (type: `boolean`):

Visit each job page for full JobPosting description.

## `maxResults` (type: `integer`):

Maximum number of jobs to return. Keep small for quick tests.

## `maxConcurrency` (type: `integer`):

Parallel detail-page requests when fetchDetails is enabled.

## `incremental` (type: `boolean`):

Detect new and delisted jobs across scheduled runs.

## `stateKey` (type: `string`):

KV snapshot name for incremental mode.

## `onlyChanges` (type: `boolean`):

When incremental is on, skip unchanged jobs.

## `detectDelisted` (type: `boolean`):

When incremental is on, emit jobs that disappeared since last run.

## `proxyConfiguration` (type: `object`):

Optional — Djinni/Dou usually work without proxy. Residential helps when Store QA or rate limits hit datacenter IPs.

## Actor input object example

```json
{
  "mode": "search",
  "site": "djinni",
  "keyword": "Python",
  "startUrl": "https://djinni.co/jobs/?primary_keyword=Python",
  "fetchDetails": false,
  "maxResults": 5,
  "maxConcurrency": 4,
  "incremental": false,
  "stateKey": "default",
  "onlyChanges": false,
  "detectDelisted": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "UA"
  }
}
```

# Actor output Schema

## `jobs` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "keyword": "Python",
    "startUrl": "https://djinni.co/jobs/?primary_keyword=Python",
    "maxResults": 5,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "UA"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("skipper_lume/djinni-jobs-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "keyword": "Python",
    "startUrl": "https://djinni.co/jobs/?primary_keyword=Python",
    "maxResults": 5,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "UA",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("skipper_lume/djinni-jobs-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "keyword": "Python",
  "startUrl": "https://djinni.co/jobs/?primary_keyword=Python",
  "maxResults": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "UA"
  }
}' |
apify call skipper_lume/djinni-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=skipper_lume/djinni-jobs-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/7qfXdvDkJIb8MP28E/builds/tAj58ROSez8SqGstx/openapi.json
