Jora Jobs Search Scraper
DeprecatedPricing
from $2.99 / 1,000 jora job records
Jora Jobs Search Scraper
DeprecatedScrape job listings from Jora, a global job search aggregator. Extract job titles, companies, locations, salary ranges, and job types aggregated from multiple sources for comprehensive job market analysis.
Pricing
from $2.99 / 1,000 jora job records
Rating
0.0
(0)
Developer
Jobs API
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
11 days ago
Last modified
Categories
Share
What does Jora Jobs Search Scraper do?
This Apify Actor extracts complete, publicly available job postings from Jora through ordinary direct HTTPS requests. It emits a row only after the public detail URL, posting ID, employer, location, description, canonical URL, and query relevance have been verified. A published row must also contain at least 21 distinct, non-duplicate source facts; records that do not meet that threshold are not published.
Why use Jora Jobs Search Scraper?
- Search supported Jora country sites with bounded pagination and sequential detail verification.
- Collect full detail descriptions rather than abbreviated listing cards.
- Preserve public job facts such as salary, employment type, work arrangement, category, skills/tags, dates, application links, description sections, responsibilities, qualifications, benefits, and employer information when available.
- Verify canonical URLs, 32-character IDs, employer/title consistency, and query relevance; count distinct meaningful source facts in
quality.meaningfulFieldCount. - Schedule runs, call the Actor API, export datasets, and connect Apify integrations.
How to scrape Jora jobs
- Open the input tab and select a mode.
- Choose a country, query, and optional location.
- Start with one page and a low
maxItemslimit. - Run the Actor and inspect the dataset, run summary, diagnostics, skips, and request receipts.
- Download results or connect them through the Apify API.
The Actor uses one ordinary direct request at a time. It does not retry or work around access barriers. If a public request returns HTTP 401, 403, 429, or 451, or Jora visibly serves a source-authored access-denial, CAPTCHA, human-verification, or security-challenge page, the Actor stops requests, discards any buffered rows, and records SKIPPED with zero published rows. A generic transport or response-processing failure is DEFERRED; it is not treated as proof that Jora blocked access.
Modes
search: search one query, then enrich bounded result cards from public Jora detail pages.searchMultiple: run up to five queries and deduplicate verified records.single: fetch one official Jora detail URL.multiple: fetch up to ten official Jora detail URLs.startUrls: accept a bounded mixture of official search and detail URLs.
Input
The input schema accepts only the fields listed here. URL lists use request-source objects with a url property.
| Field | Type | Default | Description |
|---|---|---|---|
mode | string | search | search, searchMultiple, single, multiple, or startUrls. |
query | string | developer | Search phrase for search. |
queries | string[] | — | One to five phrases; required by searchMultiple. Each phrase is limited to 100 characters. |
location | string | — | Optional city, state, or region; up to 100 characters. |
country | string | au | Official Jora country subdomain: au, nz, ca, sg, my, ph, in, za, uk, us, or ie. |
url | string | — | Official public detail URL, required by single. |
urls | object[] | — | Up to ten { "url": "..." } objects for multiple; each must be a Jora detail URL. |
searchUrls | object[] | — | Up to ten { "url": "..." } objects for search; each must be a Jora search URL. When supplied, these URLs are used instead of generated query pages. |
startUrls | object[] | — | Up to ten { "url": "..." } objects containing a Jora search or detail URL. maxItems caps rows across this list. |
maxItems | integer | 3 | Maximum complete rows per query in searchMultiple, or across direct/start URL modes; 1–10. |
maxPages | integer | 2 | Maximum generated search pages per query; 1–3. Explicit URL lists supply their own page bounds. |
requestTimeoutSecs | integer | 25 | Per-request timeout; 5–45 seconds. |
Search example:
{"mode": "search","query": "developer","location": "Sydney","country": "au","maxItems": 3,"maxPages": 2,"requestTimeoutSecs": 25}
Explicit search URL example:
{"mode": "search","searchUrls": [{ "url": "https://au.jora.com/j?sp=jobs&q=developer&l=Sydney&p=1" }],"maxItems": 3}
Single-detail example:
{"mode": "single","url": "https://au.jora.com/job/Software-Engineer-193b225b69fcad790bf1bec89dcce600"}
Other supported input shapes:
{"mode": "searchMultiple","queries": ["software engineer", "data analyst"],"location": "Sydney","country": "au","maxItems": 2,"maxPages": 1}
{"mode": "multiple","urls": [{ "url": "https://au.jora.com/job/Software-Engineer-193b225b69fcad790bf1bec89dcce600" }],"maxItems": 1}
{"mode": "startUrls","startUrls": [{ "url": "https://au.jora.com/j?sp=jobs&q=developer&l=Sydney" },{ "url": "https://au.jora.com/job/Software-Engineer-193b225b69fcad790bf1bec89dcce600" }],"maxItems": 3}
For a single detail, set mode to single and provide the detail link as a string in url. Supplied search/detail URLs are validated against official Jora country hosts and the expected public route shapes.
What data can Jora Jobs Search Scraper extract?
| Field | Type | Description |
|---|---|---|
jobId, id | string | Verified 32-character Jora ID and stable jora:<jobId> record ID. |
jobTitle, title | string | Public detail-page job title and its compatibility alias. |
employer, company | string | Hiring organization and its compatibility alias. |
companyUrl, companyLogoUrl | URI | Employer website and logo when published. |
location, address | string, object | Readable role location and any structured street, locality, region, postal code, and country parts. |
remote, workArrangement | boolean, string | Remote/telecommuting signal and published remote, hybrid, or on-site label when available. |
employmentType, category | string | Published work type and job category when available. |
jobTags, highlights | string[] | Public skills/keywords and listing-card bullets when present. |
isSponsored, earlyApplicant | boolean | Visible listing labels; omitted unless the source marks them. |
salary, salaryMin, salaryMax, salaryCurrency, salaryUnit | string, number | Published compensation text and parsed bounds, currency, and pay period when available. |
datePosted, postedDate, validThrough | date, string | Normalized posting/expiry dates and original posting label when published. |
description, descriptionHtml, summary | string | Readable source description, retained HTML, and a summary excerpt. A usable detail description is required. |
descriptionSections | object | Public overview, company, culture, responsibilities, qualifications, or benefits paragraphs grouped when headings are recognized. |
responsibilities, qualifications, benefits | string[] | Section lines when distinguishable in the public description; otherwise omitted. |
directApply, applicationUrl, applyUrl | boolean, URI | Published direct-apply signal and explicit public application link/alias when found. |
searchQuery, searchLocation, searchCountry, searchRank | string, integer | Search provenance; query is direct for direct-detail modes, and rank/location are omitted when unavailable. |
sourcePage, source, sourceDomain, country | string, URI | Listing/detail provenance and the official Jora host/country used. |
sourceRecordVerified, detailFetched, detailVerified, canonicalVerified, sourceStatusCode | boolean, integer | Detail fetch, posting identity, canonical URL, and successful response checks. |
retrieval, sourceData, quality, scrapedAt | object, date-time | Direct-transport provenance, parsed public listing/detail receipts, quality metrics, and record timestamp. |
Optional source facts are omitted rather than filled with null or guessed values. The runtime publishes only rows whose quality.meaningfulFieldCount is at least 21; quality.meaningfulFields lists the distinct fact paths counted. quality.populatedFieldCount is a separate count of populated output properties and includes identity/provenance fields.
How much will it cost to scrape Jora?
The Actor uses ordinary direct HTTPS requests and sequential detail enrichment. Compute use depends on the requested pages, detail count, timeout, and run duration. Start with a single page and a low maxItems limit to estimate your account-specific cost.
Output and run state
Job rows contain the source-grounded fields above. Raw parsed listing and detail data are retained under sourceData; absent facts are omitted. Dataset top-level keys are strict, and optional values are not fabricated.
You can download the dataset in various formats such as JSON, HTML, CSV, or Excel. RUN_SUMMARY, RUN_DIAGNOSTICS, RUN_SKIPS, RUN_HEALTH, and REQUEST_RECEIPTS are stored in the default key-value store. Each request receipt records the request/stage and URLs, HTTP status, success/blocked/deferred classification, response size/hash, redirect index, and timestamp.
RUN_SUMMARY.status and RUN_HEALTH.status report the Apify platform lifecycle (SUCCEEDED or FAILED). Their separate resultStatus reports dataset completeness: COMPLETE, LIMITED, SKIPPED, DEFERRED, NO_DATA, or FAILED. Only complete records verified from detail pages are published. If later non-block work fails after rows were stored, the Actor preserves those rows and reports SUCCEEDED/LIMITED; a fatal zero-row failure is FAILED/FAILED; a clean zero-result crawl is SUCCEEDED/NO_DATA. A confirmed source barrier reports SUCCEEDED/SKIPPED, clears buffered rows, and keeps diagnostics and request receipts in KVS. Generic transport or response-processing failure is DEFERRED, not evidence of a source block. The Actor uses ordinary direct access only, makes no retries, and does not switch routes, browsers, identities, cookies, proxies, or fingerprints to work around a barrier.
Local verification
From this directory:
npm install --ignore-scripts --no-audit --no-fundnpm testnpm run lintapify validate-schema$storagePath = 'storage-jora-docs-20260924-01'if (Test-Path -LiteralPath $storagePath) { throw 'Choose a new actor-relative storage path that does not exist.' }$env:APIFY_LOCAL_STORAGE_DIR = $storagePathapify run --resurrect --input-file INPUT.json
Choose a fresh actor-relative APIFY_LOCAL_STORAGE_DIR for each validation run and preserve any existing local Actor storage. The checked-in INPUT.json is the primary search example. Local storage is not synchronized to Apify Console.
FAQ, disclaimer, and support
Why is a run SKIPPED?
SKIPPED means the ordinary public request received HTTP 401, 403, 429, or 451, or Jora visibly returned a source-authored access-denial, CAPTCHA, human-verification, or security-challenge page. The Actor stops further requests, discards buffered rows, publishes zero dataset records, and preserves RUN_SUMMARY, RUN_DIAGNOSTICS, RUN_SKIPS, and REQUEST_RECEIPTS. Do not retry through another route, browser, identity, proxy, cookie, altered fingerprint/header, or challenge-solving method.
Why is a run DEFERRED?
DEFERRED records a generic transport or response-processing failure without source-authored evidence that Jora denied access. It is not a site-block finding, and the Actor does not retry it.
Does the Actor collect candidate data?
No. It collects public job advertisements only and does not access authenticated candidate or employer systems.
Our Actors are ethical and do not extract private user data. Results can still contain personal data published in an advertisement. Personal data is protected by the GDPR and other regulations. Do not process it without a legitimate reason; consult your lawyers if unsure. Use the API tab for programmatic access and the Issues tab for support.
Responsible use
Collect only public job information, respect Jora’s terms and robots directives, and follow applicable privacy and data-protection requirements. Do not use the Actor for authenticated pages, paywall circumvention, access-control workarounds, or candidate personal-data harvesting. This Actor is not affiliated with Jora. Report bugs or feature requests in the Actor’s Issues tab with the run ID and summary when possible.