Company Jobs Scraper | $1/1K Starter | Careers & Hiring Monitor avatar

Company Jobs Scraper | $1/1K Starter | Careers & Hiring Monitor

Pricing

from $0.80 / 1,000 job results

Go to Apify Store
Company Jobs Scraper | $1/1K Starter | Careers & Hiring Monitor

Company Jobs Scraper | $1/1K Starter | Careers & Hiring Monitor

Collect company jobs from websites, career links or verified collections across six ATS platforms. Filter roles, dates and published pay, export flat CSV, resume batches and monitor hiring changes with employer coverage reports.

Pricing

from $0.80 / 1,000 job results

Rating

0.0

(0)

Developer

Hundevmode Labs

Hundevmode Labs

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

18 days ago

Last modified

Share

Company Careers Jobs Scraper — Greenhouse, Lever, Ashby, Workable, Recruitee & Personio

Export company jobs for $1 per 1,000 results on Starter. Enter company websites, filter roles and locations, and monitor hiring changes on a schedule.

Collect published vacancies directly from Greenhouse, Lever, Ashby, Workable, Recruitee and Personio career boards. Get job descriptions, application links, locations and available structured salary data in one dataset. No extra job-data subscription or API key is needed for the supported publicly accessible feeds. Recruitee access is verified on public hosted career sites; private or access-restricted feeds are reported unavailable.

Use it for company hiring research, recruitment workflows, a job feed for selected employers or alerts when their published openings change. Search your own company list or one of the small verified collections below. Coverage is limited to selected supported employer boards.

Start collecting jobs

  1. Fill Company websites or career pages with your employer list. Mix domains, career pages and direct ATS board URLs; use Bulk edit to paste several entries.
  2. In What would you like to collect?, choose Current jobs or Hiring changes. Set Maximum results.
  3. Optionally open Job filters to narrow roles, locations, countries or source-confirmed work arrangements. Countries show readable names; JSON/API inputs keep two-letter codes.
  4. Run, then open Run report for employer coverage, exclusions, delivered/pending rows and next steps. Download Flat CSV for imports, or export JSON/Excel from the dataset.

For an explicit preview, open Example companies and choose Example: 5 companies or Example: 3 AI companies. These are small fixed examples charged at the same published rates. The normal form starts with no employers selected. It never adds a demo employer automatically. For Hiring changes, use a saved Task or stable Monitor ID; setup is in Monitoring and continuation.

{
"companies": [
"greenhouse.com",
"Ashby",
"https://jobs.lever.co/applydigital"
],
"maxResults": 100
}

A direct ATS board URL is the most reliable input. A supported job detail URL containing an employer board token selects its entire board. Workable links shaped /j/<shortcode> do not identify an employer; supply https://apply.workable.com/<company> or the company website instead. For employers outside the verified directory, company-domain discovery checks a bounded number of public pages for supported links, including some embedded boards. JavaScript-only or unrelated career systems can require a direct board URL. Unrecognized names are reported with a request for the company's website; the Actor does not guess ATS identifiers from names. Resolved inputs continue collecting when other names are unresolved, and coverage is marked incomplete.

Verified employer collections

Employer websites were checked for links to live public boards on October 6, 2026. That date verifies the source mapping; every collection run reads vacancies live. These are bounded employer lists, not a complete industry or worldwide jobs database.

SelectionEmployersJSON value
None — use my company listYour own domains and public career URLsnone (default)
Example: 5 companiesGreenhouse, Ashby, ENTITY X, OpenAI, Anthropicstarter-5-v1
Example: 3 AI companiesOpenAI, Anthropic, Cohereai-3-v1

These six distinct employers also support name input. For other employers, enter a website or career URL. Root domains in the verified directory resolve directly to their boards. Explicit career paths retain normal discovery. Employer identity added by the directory is marked companyNameSource: "verified_catalog" when it is not supplied by the job feed itself.

{
"companyCollection": "ai-3-v1",
"titleKeywords": ["engineer"],
"locationKeywords": ["London"],
"maxResults": 100
}

You can add companies alongside a collection. Sources share one global result limit and duplicate boards are collected once. Free accounts retain the five-source limit; adding a sixth distinct source to Example: 5 companies requires a paid account. Requested result counts are ceilings: filters and source availability can yield fewer jobs. Large boards may be read in full before filtering even when you request a small output.

Each collection version keeps a fixed employer list for saved Tasks and schedules. Adding employers requires selecting another collection/version or editing your own list, which starts a separate monitor baseline. A closed or failing board is reported as unavailable; it does not silently disappear from the collection or create false job removals. Continuations restore the original source list and employer context.

Existing API inputs and Tasks: startUrls and companyDomains remain accepted JSON aliases and merge with the new companies list and collection. They are shown in the collapsed Existing Task inputs section. The Run report warns when they are active. When editing an old Task, remove any old example sources you no longer want. For a fresh setup, use companies or companyCollection.

Recruitee example: "companies": ["https://channable.recruitee.com"]. Custom Recruitee domains need a discoverable hosted-board link; use the public board URL if website discovery cannot find it.

Workable example: "companies": ["https://apply.workable.com/huggingface"]. Employer identity comes from the public feed, and complete descriptions are included without a per-job detail request. Unsupported or unavailable accounts are reported explicitly.

Personio example: "companies": ["https://entityx.jobs.personio.de"], "personioLanguage": "en". Matching .jobs.personio.de and .jobs.personio.com company tokens are collected once. The employer must enable its public XML feed. Choose English, German, French, Spanish, Dutch, Italian or Portuguese; available translations depend on the employer. This option controls XML requests even when an input URL includes a language query.

Find the jobs you want

InputBehavior
titleKeywords / titleMatchModeLiteral case-insensitive phrases in the title. Multiple entries match ANY by default; ALL requires every entry. Quotes and Boolean operators have no special syntax.
descriptionKeywordsANY literal phrase in the published description, in addition to title filters. The query is never broadened silently.
excludeTitleKeywordsExclude titles containing any term.
locationKeywordsMatch ANY published main or additional location label. A phrase must occur within one label, not across separate offices.
countriesMatch ANY structured source country, including additional Ashby/Workable offices. Readable country selection in the form; JSON/API keeps two-letter codes such as US or GB.
workplaceTypesANY selected remote, hybrid or onsite classification from the source. Legacy remoteOnly remains accepted.
employmentTypesFull-time, part-time, contract, temporary, internship or freelance, normalized from published classifications. Personio uses both contract kind and schedule: a full-time internship can match either selection. Permanent alone does not establish hours.
departmentKeywordsANY phrase in the published department.
postedWithinDaysSource publication within the last N days; 0 means any date. Missing dates are excluded unless explicitly included.
minSalary, salaryCurrency, salaryPeriodAt least one published pay tier has a lower bound at or above the minimum in the exact selected currency and period. Currency and period are required; no conversion or annualization.

Unknown country, work arrangement and publication date can be included explicitly with includeUnknownCountry, includeUnknownWorkplace and includeUnknownPublicationDate. The underlying fields remain unknown. Greenhouse location text is preserved without guessing a country or remote flag. Remote classification does not establish permission to work from any country; a salary tier is not evidence of location eligibility. remoteOnly and an incompatible workplaceTypes selection are rejected.

Different filter fields must all match (AND); multiple values within one field match ANY, except titles when ALL is selected. Entries containing only whitespace are rejected before requests. Pay totals covering multiple units, such as 2 YEAR, are incomparable with a single-year filter and are excluded rather than converted.

The Run report explains exclusions, including unknown fields and incomparable salaries. Reason counts can overlap, so their sum can exceed the number of excluded jobs. Monitor board checks still have a fee when filters produce no changes.

{
"companies": ["https://jobs.ashbyhq.com/openai"],
"titleKeywords": ["engineer"],
"workplaceTypes": ["remote", "hybrid"],
"minSalary": 100000,
"salaryCurrency": "USD",
"salaryPeriod": "year",
"maxResults": 100
}

Sample several employers

Results normally follow employer input order. A large first employer can fill the global limit; results are not the globally newest jobs. For a bounded export sample, set maxResultsPerCompany, for example 20 per employer and 100 total across five employers. The cap is applied after filters, per employer board, across continuations. Set it to 0 for no per-company cap.

This cap intentionally omits additional matches. The Run report shows those omissions, delivered/pending counts and source inputs not visited yet. coverageComplete describes completion of source checks and requested delivery; inventoryComplete is false when matching inventory was omitted by company caps. Start a new collection without the per-company cap for full inventory. Monitor rejects nonzero per-company caps: it uses complete snapshots and saves every undelivered change for continuation.

What you get

FieldsMeaning
jobKey, jobId, provider, boardIdStable source identity and board reference.
title, companyName, companyDomainPublished title and employer identity when verified.
url, applyUrl, boardUrlPosting, application and employer board links.
location, locations, country, countries, countryLabelPublished locations, primary/all structured country codes and original primary label.
department, employmentType, workplaceType, isRemoteAvailable source classifications.
employmentSchedulePersonio's source-published full-time/part-time hours, separate from its contract kind. Other providers leave this absent or null.
salaryMin, salaryMax, salaryCurrency, salaryPeriodA single unambiguous structured salary range, when available.
salaryRangesSeparate published pay ranges, preserving geographical tiers.
description, descriptionHtmlPlain text description; optional original HTML.
sourcePublishedAt, sourceUpdatedAt, checkedAt, firstSeenAtSource dates and Actor observation dates.
changeType, changedFields, previousValues, matchesFilterMonitoring event, changed values and current filtered-inventory membership.

Missing scalar fields remain null; absent ranges and locations use empty arrays. Flat salary fields remain null when there are multiple pay tiers. Greenhouse bulk collection retains salaries written in descriptions but does not fetch individual pay-transparency endpoints. Recruitee descriptions include the requirements section; available salary strings are normalized to numbers, and published multi-location labels are retained. Personio descriptions retain all published sections and additional offices; subcompany supplies employer identity when present. Personio XML does not establish structured salary, country, remote status or publication time; these fields remain null rather than being inferred from office text or createdAt. Lever creation dates are not presented as publication dates; Ashby publication time means the last publication. firstSeenAt is the first observation in this Monitor baseline, not the opening date. A fresh export uses its current observation time. Workable uses published_on, never created_at; date-only values are interpreted as midnight UTC for date filtering. Workable salaries are not extracted or guessed from descriptions. A false Workable telecommuting flag does not classify a role as on-site rather than hybrid.

Each row represents a published source posting, not a headcount estimate; separate postings may describe the same role in different locations. A board slug is not a verified company name. Direct Lever/Ashby boards may lack employer names and domains; discovery can add identity from the company's own linked site. This Actor does not collect applicant records or employee contact data.

Tables, CSV and integration

The Output tab offers Jobs, Salaries, Hiring changes and CSV / import fields views. Views change the displayed columns; they do not change the underlying dataset or add charges. Download flat CSV for imports explicitly selects flat fields: stable key, employer, all location/country labels, salary amounts plus currency/period, readable separate pay tiers, dates, application link and plain-text description. Full JSON retains locations, countries, salaryRanges, changedFields and previousValues.

A salary with several geographic tiers keeps scalar min/max/currency null. salaryText displays the individual published tiers and periods; it never merges different currencies into a fabricated range. Use jobKey for upserts within a source board. A migration between ATS platforms can change that key; no cross-platform duplicate identity is promised.

Continue a capped or interrupted collection

Open Next batch input (PAGINATION) and copy nextInput into a new run after the previous run finishes. It supplies continueFromRunId and a batch size. In Example companies, leave None — use my company list selected and omit companies, startUrls and companyDomains: the Actor restores the previous sources, filters and remaining jobs. Already delivered rows are not copied into the new dataset. Cached remaining rows can be delivered without refetching their board. Completed Lever pages survive request limits and temporary export failures such as timeouts, 403, 429 and server errors. Before continuing, the Actor rechecks the last committed page. If its IDs shifted, that source starts again and already delivered export rows are deduplicated. This detects observed offset drift; it cannot guarantee an atomic view of a continuously changing board. If IDs repeat across offsets on a changing Lever board, the Actor attempts one complete public API response with the same bounded download/job/time limits. If that response cannot validate, coverage stays incomplete instead of guessing past missing jobs. Continuation finishes the original observations; start a fresh collection for a new live check.

Each batch has its own dataset and spending limit. The previous run must belong to this Actor and your account. Check RUN_SUMMARY.coverageComplete, stopReason and ERRORS even when the run status is successful: request limits, source errors or unavailable career pages can produce partial coverage. Slow or oversized Lever pages are reduced without advancing past undelivered postings. Smaller pages require more requests; saved page progress can continue in the next batch if the request limit is reached. Fresh sources are processed before failed-source retries. Temporary failures use increasing delays; persistent problems such as missing boards, repeated pages or oversized responses wait an hour before continuation retries. Inspect RUN_SUMMARY.retryNotBefore (UTC) and deferredSourceCount before retrying. A new export collection makes a fresh check of the supplied sources. Repeated checks of the same Monitor keep source-specific retry pauses, including long server Retry-After delays. Starting another run cannot guarantee recovery from a persistent 403, 429 or unavailable source.

Free accounts have a collection-wide trial cap; continuing does not reset it. nextInput is unavailable after that cap is reached. Unsupported-domain discovery needs a corrected input or a direct supported board URL.

Monitor hiring changes automatically

Select Hiring changes under What would you like to collect?. Save an Apify Task and add an Apify schedule, or provide a stable monitorId for repeated manual/API runs. Saved Tasks use their Task ID automatically. No explicit previous snapshot is needed.

  • CURRENT: matching jobs in the first successful baseline, unless emitInitialResults is false.
  • NEW: a job first appearing after the baseline.
  • CHANGED: substantive published fields differ from the last delivered snapshot. Source publication/update dates remain in results but timestamp-only updates do not create paid change rows by default. Enable monitorSourceDateChanges to include them.
  • REMOVED: a posting disappeared from a successfully checked board.
  • REOPENED: the same source posting ID returns after an observed removal retained within 90 days.

For a filtered monitor, ENTERED means an existing posting now matches your filters; EXITED means it no longer matches, although it can still be open. Publication-date filters can produce EXITED when a posting ages out. REMOVED means it disappeared from a complete successful source check after belonging to your filtered inventory. No duplicate removal is emitted for a posting that already exited. NEW/REOPENED describe source appearance/observed reopening; CHANGED describes changes while still matching.

To maintain a filtered job feed, upsert CURRENT, NEW, REOPENED, ENTERED and CHANGED by jobKey; delete that key on EXITED or REMOVED (matchesFilter: false). Events carry previouslyMatchedFilter, changeReason, changed fields and observation time. Internal matching state is never included in the dataset. Failed/incomplete checks never emit false exits or removals. Continuation keeps the original observation and queued events; start a fresh poll for a new check.

Removal does not establish that a person was hired. Source errors and malformed postings preserve the previous successful board snapshot and do not emit false removals. Export mode can return the valid postings from a board with malformed records; skipped records are counted separately and coverage remains incomplete. Monitor requires the whole board to validate before charging a successful check or replacing its snapshot. A board's new snapshot is committed after its inventory-change events have been delivered; capped work is saved. Repeated runs of the same Task/monitor finish capped, undelivered work before starting a fresh poll. If only failed-board retries remain, the next scheduled poll checks healthy sources again while unavailable sources wait until their saved retry time; manual continuation can retry just the failed boards. Paused sources have status deferred in SOURCE_CHECKS, with retryNotBefore; failed checks include their code and any saved export page offset. Neither a skipped source nor a failed check incurs a successful board-check fee. Use PAGINATION.nextInput when manually finishing a batch.

Use separate monitor IDs for independent collections. Overlapping runs are rejected, and an old continuation cannot replace a newer committed snapshot. Changing sources, filters or other monitor options creates a separate baseline. Keep your selected order/options stable between checks. Versioned collections preserve their employer membership; their live vacancy counts may change.

Pricing

Native Apify PPE rates are configured as follows:

Apify planPer 1,000 delivered job/change rowsPer 1,000 successful monitor board checks
Free$2.00$10.00
Starter$1.00$5.00
Scale$0.90$5.00
Business and higher$0.80$5.00

Export mode charges job rows only. Changes mode charges one successful complete check per board, plus each delivered inventory-change row, including ENTERED and EXITED. Removed rows use the same existing job-result rate. An unchanged check or silent baseline still incurs the board-check fee. A cached continuation does not charge that check again. Errors, discovery reports and summaries incur no job-result fee.

Apify additionally applies a $0.00005 fee per execution start, including resurrection of an existing run, at this Actor's supported 256–1,024 MB memory settings. There is no extra description, salary-enrichment or duplicate dataset-item fee.

Starter examples: 1,000 export rows cost $1.00 plus startup. One unchanged board check costs $0.00505 including startup. Ten board checks and 25 returned changes cost $0.07505 including startup. A Free-plan preview of 100 export rows costs $0.20005 from available credits. The minimum run spending limit is $0.00505; this is a cap setting, not a fixed additional fee. Confirm your plan's prices and run spending limit in Apify before running.

Result limits and spending protection

maxResults is the global delivered-row limit, not a guaranteed number of available jobs. Paid accounts can request up to 50,000 rows per run and 200 source inputs. Free accounts receive a preview of at most 5 source inputs and 100 delivered rows per collection, shared across continuations. Payment status comes from Apify, not user input. Free request/time caps also apply.

For a large collection, set your sources and use the following limits in the initial run. Above 50,000 rows, finish each batch and use Next batch input to continue. Each batch has a separate dataset; combine the exports by jobKey. For long batches, also increase the Apify run timeout; maxRunSeconds bounds source work and does not override the platform execution timeout. Source availability, request limits and your spending cap can produce fewer rows.

{
"maxResults": 50000,
"advanced": { "maxRequests": 2000, "maxRunSeconds": 1800 }
}

Apify's run spending limit can stop output before maxResults. Remaining work is checkpointed when the Actor can shut down normally. Platform-enforced account limits and hard termination can interrupt a run; use the saved checkpoint and inspect coverage rather than assuming a complete collection.

Advanced settings

Defaults: 20-second request timeout, up to 2 retries for temporary connection errors/429/5xx, 250 requests, 600 seconds of source work, 6 discovery pages per input and 20,000 jobs per board. Free accounts cap source work at 40 requests and 180 seconds. Paid request/time limits can be increased within the runtime schema; source work remains bounded.

{
"advanced": {
"requestTimeoutSeconds": 20,
"maxRetries": 2,
"maxRequests": 250,
"maxRunSeconds": 600,
"maxDiscoveryPages": 6,
"maxJobsPerBoard": 20000
}
}

A supported board exceeding maxJobsPerBoard is reported incomplete instead of being used as a partial monitor snapshot. Arbitrary ATS, Workday sites and generic HTML vacancy extraction are outside current coverage.

Greenhouse, Ashby, Workable and Recruitee JSON responses are downloaded to a temporary file and parsed one posting at a time, with a 256 MiB decoded-download ceiling. Personio XML uses the same disk-backed 256 MiB ceiling and an incremental parser that rejects DTDs and entity declarations. In-memory pages and discovery responses have a 32 MiB ceiling. Exceeding the relevant limit is reported as response_too_large; other sources can finish and Monitor preserves the failed board's last successful snapshot. Large saved collections use encrypted parts rather than one oversized checkpoint.

For HTTP 429 responses, the Actor respects the server's Retry-After delay. If that delay exceeds the bounded wait or remaining run time, it saves an incomplete result for later continuation and retains the server delay in RUN_SUMMARY.retryNotBefore. No repeat-run guarantee is made for persistent blocking or unavailable sources.

Output reports

Run report (REPORT) is a readable HTML summary of companies, source checks, applied filters, exclusions, delivered/pending counts, billing units and continuation. COVERAGE provides the structured equivalent. RUN_SUMMARY contains coverage, inventory completeness, stop reason, result counts and request metrics. ERRORS records source/input problems. DISCOVERY shows board discovery. SOURCE_CHECKS documents checked sources, including partial exports with counts of valid and skipped postings. successfulSourceChecks counts only complete source checks. PAGINATION supplies the next batch input. These reports are stored separately from the paid jobs dataset.

Public source documentation