Djinni Jobs Scraper avatar

Djinni Jobs Scraper

Pricing

from $0.55 / 1,000 item extracteds

Go to Apify Store
Djinni Jobs Scraper

Djinni Jobs Scraper

Search public Djinni tech vacancies and export structured jobs with employer, salary signal, location or remote status, experience, English level, description, activity counts, and canonical URL.

Pricing

from $0.55 / 1,000 item extracteds

Rating

0.0

(0)

Developer

Automation Lab

Automation Lab

Maintained by Community

Actor stats

0

Bookmarked

5

Total users

2

Monthly active users

4 days ago

Last modified

Categories

Share

Extract public Djinni jobs into clean records for recruiting, sourcing, and labor-market monitoring. Search by role or skill, follow Djinni search-page filters, and export job title, employer, salary signal, location, remote status, experience, English level, description context, activity counts, and canonical URL.

The Actor uses Djinni's server-rendered public vacancy pages. It does not require a Djinni account, a browser, or a paid proxy. It uses no AI/model provider and is not affiliated with or endorsed by Djinni.

What can you do with this Actor?

  • Build a current feed of tech vacancies for one or more skills.
  • Compare salary signals, experience requirements, and English levels.
  • Find roles that Djinni marks as remote.
  • Schedule recurring runs and compare stable jobId values downstream.
  • Export job data to JSON, CSV, Excel, Google Sheets, a database, or an ATS workflow.

Who is it for?

Recruiters can create targeted vacancy lists. Talent teams can monitor employer activity. Labor-market analysts can compare role, geography, English, and experience signals. Developers can feed normalized vacancy data into dashboards and automations without maintaining an HTML parser.

Data extracted

FieldMeaning
jobIdStable Djinni vacancy identifier
title, employerAdvertised role and employer
salaryTextPublic salary amount when displayed
salarySignalDjinni's relative $ to $$$$ salary signal (never converted to money)
salaryMin, salaryMax, salaryCurrencyExplicit displayed monetary bounds; currency only when unambiguous (USD/US$, EUR/€, GBP/£, UAH/₴). Plain $ leaves currency null
location, remoteHiring region and source remote flag
workFormat, tagsExact source work-format label and listing tags, such as Full Remote / Office Work and Product
experience, experienceYearsDisplayed and parsed experience requirement
englishLevelEnglish requirement such as B1 or B2
categoryListing industry/domain label, such as Gamedev or SaaS; not a technology skill or work format
descriptionFull plain-text description context available on the search page
views, applicationsPublic engagement counts when shown
postedText, postedAtLegacy displayed-activity label and timestamp; may describe an update, not original publication
updatedAtTimestamp only when the displayed label explicitly says updated
timestampKind, timestampRawupdated, posted (explicit posted/published label), or unknown; raw source tooltip timestamp
jobUrlCanonical public vacancy URL
sourceSearchUrl, scrapedAtProvenance and extraction timestamp

Fields can be null when Djinni does not disclose the value. tags is an empty array when absent. Description paragraphs, lists and line breaks remain readable plain text. to $4500 yields salaryMin: null, salaryMax: 4500, salaryCurrency: null. Relative $ signals, description numbers and search filters never supply numeric salary. No pay period or exchange rate is inferred. Source activity timestamps have no timezone; the Actor does not append Z or guess one. scrapedAt is the UTC observation time.

How to get started

  1. Open the Actor input.
  2. Add one or more role or skill names under Job keywords.
  3. Optionally add a public https://djinni.co/jobs/ search URL containing Djinni filters.
  4. Enable Remote jobs only if needed.
  5. Choose a maximum number of jobs.
  6. Click Start and open the default dataset when the run finishes.

A useful first input is:

{
"keywords": ["JavaScript"],
"maxItems": 10
}

Input parameters

keywords

Up to 20 tech roles or skills. Each value becomes a Djinni primary_keyword search. Results are deduplicated across searches.

startUrls

Optional public Djinni jobs search URLs. Use these when you have already selected source-side filters on Djinni. Set keywords: [] for a URL-only search; otherwise the input editor/platform may supply the existing default JavaScript keyword. Other domains and job-detail URLs are rejected.

remoteOnly

Keeps only records that Djinni marks as remote. This filter is applied equally to keyword searches and supplied search URLs.

maxItems

Maximum unique records saved across all input searches, from 1 to 5,000. Pagination stops as soon as this limit is reached.

maxRequestRetries

Number of bounded retries for temporary network, rate-limit, or server failures, from 0 to 4. Permanent errors are not retried blindly.

Output example

{
"jobId": "846751",
"title": "Senior Frontend Engineer, Progressive Web Apps",
"employer": "Genius Match",
"salaryText": null,
"salarySignal": "$$$$",
"salaryMin": null,
"salaryMax": null,
"salaryCurrency": null,
"location": "EU",
"remote": true,
"workFormat": "Full Remote",
"tags": ["Product"],
"experience": "7 years of experience",
"experienceYears": 7,
"englishLevel": "B2",
"category": "Education",
"description": "Our client is the leader in the Early Childhood Education sector...",
"views": 304,
"applications": 29,
"postedText": "2d",
"postedAt": "2026-09-04T17:00:00",
"updatedAt": null,
"timestampKind": "unknown",
"timestampRaw": "17:00 04.09.2026",
"jobUrl": "https://djinni.co/jobs/846751-senior-frontend-engineer-progressive-web-apps/",
"sourceSearchUrl": "https://djinni.co/jobs/?primary_keyword=JavaScript",
"scrapedAt": "2026-09-06T20:38:23.401Z"
}

Values change as vacancies and engagement counts change.

How much does it cost to extract Djinni jobs?

Pricing uses one small start charge plus a per-job event. Per-job rates decrease by Apify account tier. The exact active prices are shown in the Actor's pricing panel before every run.

As a simple estimate, multiply the displayed per-job event price by the requested result count and add the displayed start event. Apify platform usage is paid by you separately, in addition to these event fees. The Actor stops when its paid-result budget is exhausted; duplicate and filtered jobs incur no item event. The Actor uses direct HTTP at 256 MB and has no automatic residential-proxy or browser fallback, keeping platform usage predictable.

Recurring monitoring workflow

Schedule the same input daily or weekly. Store jobId, postedAt, and selected fields in your destination. Compare each new dataset with the prior snapshot for newly observed jobs or changed public signals. Use timestampKind and updatedAt to distinguish source updates from explicit publication labels. An absent job in a partial/filtered scan does not prove removal. The Actor produces current snapshots; it does not persist history or send alerts itself.

Spreadsheet and database export

In the run dataset, choose CSV, Excel, JSON, XML, or RSS. For ongoing pipelines, read the dataset API or connect an Apify integration. Use jobId as the source identity and scrapedAt as the observation time.

API with cURL

curl -X POST \
"https://api.apify.com/v2/acts/automation-lab~djinni-tech-jobs-scraper/runs?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"keywords":["DevOps"],"maxItems":25}'

Add waitForFinish=120 when a synchronous workflow is appropriate, then read the run's default dataset.

API with JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/djinni-tech-jobs-scraper').call({
keywords: ['Python'],
remoteOnly: true,
maxItems: 20,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

API with Python

import os
from apify_client import ApifyClient
client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('automation-lab/djinni-tech-jobs-scraper').call(run_input={
'keywords': ['Data Engineer'],
'maxItems': 20,
})
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)

Use with MCP and AI agents

Add the Apify MCP server to Claude Code:

claude mcp add --transport http apify \
"https://mcp.apify.com?tools=automation-lab/djinni-tech-jobs-scraper"

For Claude Desktop, Cursor, or VS Code, add this MCP JSON configuration:

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=automation-lab/djinni-tech-jobs-scraper"
}
}
}

Example prompts:

  • “Run the Djinni Jobs Scraper for JavaScript and return 20 jobs grouped by English level.”
  • “Collect remote Python roles from Djinni and summarize employer and experience patterns.”
  • “Export current DevOps vacancies with salary signals and canonical URLs.”

Reliability and limits

The Actor validates input before charging or network work, validates every pagination destination, rejects credentials/foreign hosts/unsafe schemes and HTTP redirects, detects pagination cycles and repeated/no-progress pages, deduplicates stable IDs, and retries only transient failures with bounded backoff. Safe logs count requests, pages, retries, unique jobs seen, filtered jobs and saved jobs. Missing card identity/title is actionable schema drift, not silent empty success. If Djinni returns an unexpected page shape, the run fails instead of silently producing a misleading empty dataset.

Djinni can change its public HTML or available filters. Results reflect the public pages visible at run time. A keyword may return broader matching jobs according to Djinni's own search behavior. The Actor does not apply, contact employers, bypass login, or recover historical vacancies.

Troubleshooting

Why are fewer jobs returned than maxItems?

The source may have fewer matching public vacancies, duplicate jobs may appear across searches, or remoteOnly may filter records. maxItems is a ceiling, not a guaranteed count.

Why is salary null?

Many vacancies show only Djinni's relative salary signal. Use salarySignal for that source-provided indicator; salaryText remains null unless a public amount is shown in the card.

Why did the run fail on my URL?

Only HTTPS Djinni /jobs/ search URLs are accepted. Open the filtered jobs page on Djinni and copy that search URL rather than a company, login, or individual job URL.

Diagnostic privacy

Failed operations send sanitized diagnostic input, exceptions and Actor/build/run IDs to our private GlitchTip service for repair. Secret fields and URL queries are removed; reports are retained for 30 days. No telemetry credentials or configuration are required in your input. Public vacancy descriptions can contain names or contact details supplied by employers; no separate contact harvesting is performed. Results and logs remain in your Apify account under its storage retention settings; delete datasets, key-value stores and runs through Apify when no longer needed. The Actor keeps no cross-run cache/history and sends no data to AI providers. Use the Actor's Apify Store Issues tab for support.

Legality and responsible use

Scrape only public data for legitimate recruiting, research, and analytics purposes. Follow Djinni's terms, applicable privacy and employment laws, and your organization's data-retention rules. Avoid profiling individuals, discriminatory hiring decisions, excessive schedules, or unsolicited outreach. You are responsible for how exported data is stored and used.

For broader regional hiring research, combine this source-specific feed with other public job-board Actors from automation-lab on Apify. Keep each source attributed by its canonical URL and source-specific ID.

FAQ

Does it require a Djinni login?

No. It extracts public vacancy search pages only.

Does it use a proxy or browser?

No automatic proxy or browser mode is enabled. The current implementation uses lightweight direct HTTP requests.

Can I use a scheduled Actor task?

Yes. Save the exact input as an Apify Task and attach a schedule. Compare datasets downstream by jobId.

Can it return JSON, CSV, or Excel?

Yes. Apify datasets expose all of those export formats without changing Actor input.

Does it send alerts or retain change history?

No. Use schedules, webhooks, integrations, or your own database to build that workflow around the current snapshot.