Jora Jobs Scraper at a glance
Jora Jobs Scraper is a ready-to-run Apify actor from abotapi for collecting jobs data. Its documented output includes id, title, company, location and country, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $1.80 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify.
- Runs on
- Apify cloud: console, API, schedules and integrations
- Data type
- Jobs, Automation, Lead Generation
- Pricing
- $1.80 per 1,000 results (Free plan), from $1.00 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 28 options
Scrape Jora.com job listings across supported countries by keyword, filters, or URL. Extract full job descriptions, salaries, work types, companies, locations, and structured data ready for connector export.
What Jora Jobs Scraper can do
- Nine country sites. Search by keywords and location across nine Jora country sites, or start from a saved list of Jora search or job URLs.
- Server side filters. Server side filters for listed date, job type, quick apply, sort order, distance, and minimum salary, applied directly on Jora's own search pages (search mode; in URL mode the filters already in your pasted link apply).
- Full details. Detail mode adds the full job description, apply link, salary, work type, and work arrangement for every listing.
- Bounded or full walks. Max items is the main output cap; Max pages is unlimited by default, so a search walks every result page until Jora's own end of results.
- Resume. Resume a large pull across separate runs, or let an interrupted run pick back up automatically without re-saving jobs it already collected.
- Change feed. Incremental mode turns a recurring search into a change feed: only new, updated, and reappeared jobs come back on later scheduled runs.
Choose what to collect
These inputs let you configure Jora Jobs Scraper - Jobs, Salaries, Companies & Locations. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring · required | Choose search mode to build Jora searches from filters, or URL mode to start from existing Jora search/detail URLs. |
searchesarray | One or more keyword/location searches. Each search can target a different country. |
postedWithinstring | Only return jobs listed within this time window. |
workTypestring | Filter by Jora work type. |
quickApplyboolean | Return only jobs marked as quick apply by Jora. |
sortstring | Sort search results by Jora relevance or newest listed. |
distanceKminteger | Optional radius around the location. Leave empty to use Jora's default. |
Show 21 more inputs
| Input | What it controls |
|---|---|
salaryMininteger | Optional minimum salary filter. |
urlsarray | Multi-URL supported: keyword/location search paths, /jobs?q=&l= and /j?q=&l= searches, and job detail links. Search filters are ignored. Leave the field out and these examples are scraped. Search result URLs honor the page number in the pasted URL. Detail URLs save that job only. |
fetchDetailsboolean | When enabled, adds full description, apply URL, and detail-only fields. Detail records use the detail-enrichment charge event. |
maxItemsinteger | Maximum number of matching jobs to save. A run can return fewer rows when the selected search, URL, and filters match fewer current jobs. Use 0 for unlimited. |
maxPagesinteger | Maximum search result pages per search URL. Leave empty to walk every result page; maxItems remains the main cap. |
resumeFromRunIdstring | Paste a previous run ID or dataset ID to continue a full-catalogue walk across separate runs. Jobs already collected there (matched by jobId) are skipped, so this run only saves the new ones. Use this after an interrupted run, or to keep growing one big catalogue pull. For recurring daily/weekly monitoring of the same search, use Incremental mode below instead, the two are different things and normally not combined. |
incrementalModeboolean | Turn this on for daily/weekly monitoring of the same search. The first run returns every matching job as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED jobs, unchanged ones are skipped (and not billed). State is kept separately per search scope (mode, searches/URLs, and filters); use State key below to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above. |
stateKeystring | Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the search scope (searches/URLs and filters), different searches then never mix state with each other. |
emitUnchangedboolean | Off by default. Turn on to also return jobs that have not changed since the last run, marked UNCHANGED. This returns, and bills, extra rows you already have, so leave it off unless you specifically want the full snapshot every run. |
emitExpiredboolean | Off by default. Turn on to also return jobs that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search, not when Max items/Max pages capped it, the site blocked a page, or Resume was used. This returns, and bills, extra synthetic rows, so leave it off unless you need expiry tracking. |
ignoreFieldsForChangesarray | Incremental mode only. Field names (for example abstract or salary; a dotted path like a.b reaches nested fields) whose changes should NOT make a job UPDATED. The fields stay in the output and are never removed. Page position, rank, the search total, the scrape time, the tracking links and the relative posting age are always ignored. The job id can never be ignored. Leave empty to compare everything else. |
mcpConnectorsarray | Optionally send results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize one under Apify Settings API & Integrations, then select it here. Notion gets a rich page-per-item export; other connectors get a best-effort write/digest. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com). |
notionParentPageUrlstring | URL or id of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors. |
maxNotifyListingsinteger | Cap on items written to each connector per run. Does not affect the dataset. |
startUrlstring | A single Jora URL. Same as putting one link in Jora URLs; switches to URL mode when Mode is not set. |
keywordstring | Job keyword. Builds one search when Searches is empty. |
locationstring | Location for the keyword search, for example Sydney, NSW. |
countrystring | Jora country site for the keyword search: a code (au, nz, sg, hk, my, id, us, uk, ca) or a label such as Australia. Defaults to au. |
posted_datestring | anytime, 24h, 7d, 14d or 30d (plain forms such as today, week or month also work). Used while Posted within is anytime. |
results_wantedinteger | Same as Max items; used while Max items is still 20. |
max_pagesinteger | Same as Max pages; used when Max pages is not set. |
Fields in the output
The documented dataset includes the fields below. Availability can depend on the source page and selected mode.
idID (text)titleTitle (text)companyCompany (text)locationLocation (text)countryCodeCountry (text)salarySalary (text)workTypeWork type (text)workArrangementArrangement (text)postedAtTextPosted (text)quickApplyQuick apply (boolean)isSponsoredSponsored (boolean)descriptionTextDescription (text)Show 32 more fields
urlURL (link)applyUrlApply URL (link)searchKeywordsSearch (text)searchLocationSearch location (text)rankRank (number)pagePage (number)scrapedAtScraped at (date)changeTypeChange type (text)changedFieldsChanged fields (text)firstSeenAtFirst seen (date)lastSeenAtLast seen (date)jobIdjobId (text)sourceUrlsourceUrl (text)salaryMinsalaryMin (text)salaryMaxsalaryMax (text)abstractabstract (text)snippetBulletssnippetBullets (text)descriptionHtmldescriptionHtml (text)sourceNamesourceName (text)searchTotalCountsearchTotalCount (text)detailFetcheddetailFetched (text)job_idjob_id (text)job_typejob_type (text)date_posteddate_posted (text)description_textdescription_text (text)description_htmldescription_html (text)sourcesource (text)sponsoredsponsored (text)countrycountry (text)search_keywordsearch_keyword (text)search_locationsearch_location (text)search_pagesearch_page (text)Example output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"id": "00000000000000000000000000000001",
"jobId": "00000000000000000000000000000001",
"title": "Sample Software Engineer",
"company": "Sample Company",
"location": "Sydney NSW",
"countryCode": "au",
"url": "https://au.jora.com/job/Sample-Job-00000000000000000000000000000001",
"sourceUrl": "https://au.jora.com/software-engineer-jobs-in-Sydney-NSW",
"salary": "$95,000 - $115,000 a year",
"salaryMin": 95000,
"salaryMax": 115000,
"workType": "Full time",
"workArrangement": "Hybrid",
"postedAtText": "Posted 3d ago",
"quickApply": true,
"isSponsored": false,
"rank": 1,
"page": 1,
"abstract": "Short summary from the search card.",
"snippetBullets": [
"Build sample services",
"Work with a sample team"
],
"descriptionHtml": "<div>Full job description appears here.</div>",
"descriptionText": "Full job description appears here when fetchDetails=true.",
"applyUrl": "https://au.jora.com/job/rd/00000000000000000000000000000001",
"sourceName": "Sample Source",
"searchKeywords": "software engineer",
"searchLocation": "Sydney, NSW",
"searchTotalCount": 250,
"detailFetched": true,
"scrapedAt": "2026-01-01T00:00:00.000Z"
}Ways to use this data
- Job board and aggregator builders: mirror Jora search results for a set of keywords and locations into your own listings feed.
- Recruiter and staffing sourcing: pull matching roles across countries into one dataset to build outreach and candidate-facing lists.
- Compensation and labor market research: collect salary ranges, work types, and posting volume across roles and regions.
- Hiring signal tracking: schedule a search and watch NEW and REAPPEARED postings to spot a company's hiring activity over time.
- Job alert tools and bots: feed newly posted, quick apply, or high salary jobs into your own notification, Slack, or email tool.
Before you run
Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.
Questions about this actor
What data does Jora Jobs Scraper return?
The documented output for Jora Jobs Scraper includes id, title, company, location, country, salary, work type and arrangement. Availability of each field depends on the source page and the selected mode.
How much does Jora Jobs Scraper cost?
It costs $1.80 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.
Can I get only new or changed jobs on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new, updated, and reappeared jobs, and unchanged ones are not billed by default.
What is the difference between Resume and Incremental mode?
Resume (resumeFromRunId) continues one specific interrupted run so you do not re-save the same jobs twice; you paste an ID. Incremental mode is for running the identical search again and again (for example, daily) and getting only what changed; the actor tracks its own state and there is no ID to paste. The two are normally not combined, except to seed a brand-new monitoring campaign from an existing full pull (see the tip on that in "Resume, recurring updates, and incremental mode").
Why did a run return fewer jobs than Max items when I used multiple searches?
Max items is split evenly across the searches in that run up front. A search that matches fewer jobs than its share does not pass its unused budget to another search in the same run. Raise Max items (or set it to 0), or run each search separately, if you need every search to return its full share.
Why did my run fail or return few jobs?
If no results page could be loaded at all, the run fails on purpose with one of the messages listed under Plan Requirement, instead of finishing as an empty success. If some pages loaded and a later page stays empty after several retries on fresh connections, that search stops with a warning and the run finishes with what it collected, so check the log for "empty response" warnings and run it again. With Incremental mode on, a search stopped this way never triggers EXPIRED rows. A run also fails on purpose when resumeFromRunId does not point to a run or dataset your account can read, or when resumeFromRunId is combined with Incremental mode for a search that already has saved state.
