How to use it: 3 steps
- Make a free Apify accountApify is the cloud platform where our tools run. The free plan gives you $5 of usage every month, no credit card needed. You pay Apify, not us.
- Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example:
https://ecosystems.applytojob.com/apply/jobs/in JazzHR board or job URLs. Each start is one run. - Download the resultsWhen the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.
This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.
What it does
Read public JazzHR career pages and return current jobs with descriptions, pay details and apply links. Compare full snapshots to find new, changed and removed jobs.
Who uses it
Niche job boards
Add JazzHR jobs from small and mid-size employers.
Market watchers
See when a company adds or closes roles.
Recruiters
Filter roles by place or keywords across a few companies.
Price
Pay per event: you pay for each result the tool saves, plus a small start fee for each run. The price includes Apify platform costs. Apify bills you, not us. Prices below are for the Apify free plan.
| What you pay for | Price | When |
|---|---|---|
| Start fee | $0.08 | Charged once per run. This tool uses 1 GB of memory or less by default; more memory costs more. |
| Saved job or change | $0.00198 | One current job or initial/new/changed/removed job event saved in the Dataset. |
Examples
- One job: about $0.08.
- 1,000 jobs: about $2.06.
- Every day 100 jobs, for 30 days: about $8.34 a month.
Free to try: the Apify free plan gives you $5 of usage every month, no credit card needed. That is enough for about 2,400 jobs.
Prices checked on 24 October 2026. See the current price on Apify.
Questions
Do I need a JazzHR account?
No. The tool reads public career pages, not recruiter accounts.
How many links can I add?
Up to 5 links and 100 saved jobs or changes per run.
Can I get only new jobs?
Yes. Use monitor mode with your last full snapshot. Keep rows marked new.
Why is the posting date empty?
Some old page themes show no date or pay. The tool leaves them empty.
Why do the two location fields differ?
locations uses structured data when present. location uses the visible page summary. A job may show a city in structured data and Remote in visible text.
Can I replace another JazzHR scraper without changing my code?
The fields title, description, locations, url, date_posted and input_url keep the common meaning. Input keys, canonical input URLs, safe HTML formatting and extra status fields can differ. Check your mapping before switching.
Details
Step by step on Apify
- Open Input.
- Add
https://ecosystems.applytojob.com/apply/jobs/to JazzHR board or job URLs (startUrls). - Keep
maxResults: 20,includeDescription: trueandmode: "snapshot". - Use 256 MB, a 160-second timeout and a $0.30 maximum charge. Click Start.
- Open the Dataset and check
title,job_idandurl. OpenRUN_SUMMARYand checkstatus.
Use cases
| Task | Settings | Key fields |
|---|---|---|
| Add public JazzHR jobs to a niche job board | mode: "snapshot" | job_id, title, url, description_text |
| Compare a company's hiring activity | mode: "monitor" with a previous full snapshot | job_id, change_type, company |
| Review roles by location or words | query, with descriptions enabled when needed | locations, location, title |
Tips for better results
- JazzHR pages look like company.applytojob.com. Paste the board or one job link.
- Keep the SNAPSHOT from a full run. Paste it into the next monitor run.
- Turn off descriptions for a small, quick list of titles and links.
Limits and good to know
Employers can remove or change pages. Some old themes have no posting date or pay values. This Actor does not fill missing values with guesses.
- Up to 5 input URLs and 100 saved jobs or changes per run
- A complete 78-job board was checked. A 100-row multi-board run reached result and time limits and was partial. Five single-job inputs were also checked with a complete result
- Source work is bounded by 120 scanned jobs, 150 request attempts, 100 seconds, 1 MiB per response and 20 MiB of response bodies in total. Storage and reporting can add time after the scan. The recommended timeout is 160 seconds. A 300-second Store test or larger finite positive timeout is supported without extending the 100-second source deadline
- Use 256–512 MB. Larger memory, longer timeouts and restart-on-error are rejected before source work
- Enabled descriptions are limited to 40,000 HTML characters and 30,000 plain-text characters. Clipping is marked partial
- Complete snapshots can hold up to 100 jobs. A partial run returns
SNAPSHOT: null; keep your earlier good baseline - Closed detail links can return
not_found. An unknown page layout, access block or network error is reported as an error, not a successful empty board - Partial source scans do not infer removals. Output or charge caps may limit delivery after a full scan. Read both source and run status
Troubleshooting
| What you see | Check | Action |
|---|---|---|
error with UNSUPPORTED_URL | Domain, HTTPS and path | Use a public tenant URL on applytojob.com |
not_found | The source job URL | Check whether the job was removed |
complete with no rows | query, mode and counts | Remove the filter, or check that there were no monitor changes |
partial | Source reasons, result and charge caps | Narrow the board scope, increase maxResults up to 100, or use a sufficient charge cap |
UNRECOGNIZED_BOARD or UNRECOGNIZED_JOB | Source page and run ID | Check the public page and report a changed layout or access block |
SNAPSHOT_SCOPE_MISMATCH | URLs and description setting | Start a new monitor baseline after changing scope |
TIME_LIMIT, BYTE_LIMIT, REQUEST_LIMIT | Work counters | Use fewer or smaller boards. Keep the earlier complete snapshot |
For developers
Sample result
One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.
{
"title": "Energy Auditor",
"locations": ["Remote"],
"url": "https://ecosystems.applytojob.com/apply/jobs/details/0GZ4T5FOYL",
"date_posted": null,
"input_url": "https://ecosystems.applytojob.com/apply/jobs/",
"job_id": "ecosystems:0GZ4T5FOYL",
"company": "ecofi",
"location": "Remote",
"employment_type": "Full Time",
"salary": null,
"remote": true,
"change_type": "current",
"status": "complete",
"source": "jazzhr"
}Use it from code
Actor ID: cliqtomedia/jazzhr-jobs-monitor-scraper. You need your Apify API token from Apify Console → Settings → API & Integrations.
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("cliqtomedia/jazzhr-jobs-monitor-scraper").call(run_input={
"startUrls": [
"https://ecosystems.applytojob.com/apply/jobs/"
],
"maxResults": 20
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)curl -X POST "https://api.apify.com/v2/acts/cliqtomedia~jazzhr-jobs-monitor-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"startUrls": ["https://ecosystems.applytojob.com/apply/jobs/"], "maxResults": 20}'# pip install langchain-apify
# set APIFY_TOKEN in your environment
from langchain_apify import ApifyActorsTool
tool = ApifyActorsTool("cliqtomedia/jazzhr-jobs-monitor-scraper")
result = tool.invoke({"run_input": {"startUrls": ["https://ecosystems.applytojob.com/apply/jobs/"], "maxResults": 20}})
print(result)The cURL call waits for the results, up to 300 seconds. For longer runs, start a run (/runs) and get the results with a webhook or by checking the run. Apify API docs. LlamaIndex, MCP for AI agents and the JavaScript client: AI agents & MCP.
Data fields (17)
| Field | Type | Meaning |
|---|---|---|
title | string | Public job title. |
description | string | Safe HTML; null when disabled or missing. |
locations | array | Structured location strings, or visible location fallback; [] when unknown. |
url | string | Public application page URL. |
date_posted | string | Source posting date, or null. |
input_url | string | Canonical input URL that found the job. |
job_id | string | Stable tenant:public-job-code identifier. |
company | string | Public employer name, or null. |
location | string | Visible location summary, or null. |
employment_type | string | Source employment type; JSON-LD or visible fallback. |
description_text | string | Plain description text; null when disabled or missing. |
salary | object | Source pay currency/unit/min/max/value; no conversion. |
remote | boolean | True when source marks remote, otherwise null. |
change_type | string | Current snapshot row or initial/new/changed/removed monitor event. |
status | string | Detail completeness; also check run-level status. |
scraped_at | string | ISO fetch or removal-detection timestamp. |
source | string | jazzhr platform marker. |
Input settings (6)
The main fields of the input form. With the API you send them as JSON.
| Setting | Name in the API | Type | Example value |
|---|---|---|---|
| JazzHR board or job URLs required | startUrls | array | ["https://ecosystems.applytojob.com/apply/jobs/"] |
| Maximum saved results | maxResults | integer | 20 |
| Keyword filter | query | string | "" |
| Include job descriptions | includeDescription | boolean | true |
| Snapshot or changes | mode | string | "snapshot" |
| Previous full snapshot | previousSnapshot | object |
