Djinni Jobs Scraper
Pricing
from $0.55 / 1,000 item extracteds
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
Maintained by CommunityActor 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
jobIdvalues 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
| Field | Meaning |
|---|---|
jobId | Stable Djinni vacancy identifier |
title, employer | Advertised role and employer |
salaryText | Public salary amount when displayed |
salarySignal | Djinni's relative $ to $$$$ salary signal (never converted to money) |
salaryMin, salaryMax, salaryCurrency | Explicit displayed monetary bounds; currency only when unambiguous (USD/US$, EUR/€, GBP/£, UAH/₴). Plain $ leaves currency null |
location, remote | Hiring region and source remote flag |
workFormat, tags | Exact source work-format label and listing tags, such as Full Remote / Office Work and Product |
experience, experienceYears | Displayed and parsed experience requirement |
englishLevel | English requirement such as B1 or B2 |
category | Listing industry/domain label, such as Gamedev or SaaS; not a technology skill or work format |
description | Full plain-text description context available on the search page |
views, applications | Public engagement counts when shown |
postedText, postedAt | Legacy displayed-activity label and timestamp; may describe an update, not original publication |
updatedAt | Timestamp only when the displayed label explicitly says updated |
timestampKind, timestampRaw | updated, posted (explicit posted/published label), or unknown; raw source tooltip timestamp |
jobUrl | Canonical public vacancy URL |
sourceSearchUrl, scrapedAt | Provenance 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
- Open the Actor input.
- Add one or more role or skill names under Job keywords.
- Optionally add a public
https://djinni.co/jobs/search URL containing Djinni filters. - Enable Remote jobs only if needed.
- Choose a maximum number of jobs.
- 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 osfrom apify_client import ApifyClientclient = 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().itemsprint(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.
Related Actors
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.