Company Career Pages Jobs API (Greenhouse, Lever, Ashby+) avatar

Company Career Pages Jobs API (Greenhouse, Lever, Ashby+)

Pricing

from $3.00 / 1,000 job listings

Go to Apify Store
Company Career Pages Jobs API (Greenhouse, Lever, Ashby+)

Company Career Pages Jobs API (Greenhouse, Lever, Ashby+)

Open jobs from company career pages via official public job-board endpoints: Greenhouse, Lever, Ashby, SmartRecruiters, Recruitee, Teamtailor and Personio. Filters, salary when published, new-only mode. No login or proxies.

Pricing

from $3.00 / 1,000 job listings

Rating

0.0

(0)

Developer

Zenith Ops

Zenith Ops

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

8 days ago

Last modified

Share

Get the open jobs of the companies you choose as clean, structured rows. The actor reads the official public job-board endpoints that employers expose for embedding and indexing on Greenhouse, Lever, Ashby, SmartRecruiters, Recruitee, Teamtailor and Personio. No login, no HTML scraping, no proxies.

You provide the companies (a slug like figma, greenhouse:figma, or a career-page URL such as https://jobs.lever.co/spotify). With just a slug, the actor probes the seven platforms and uses the one that has jobs.

Use cases

  • Recruiting and talent teams tracking competitor hiring.
  • Sales and BD teams using open roles as a buying signal for a target account list.
  • Job boards and newsletters that aggregate roles from a curated set of employers.
  • Market research: which companies hire for which roles, where, and at what published salary.

Input

FieldDescription
companies (required, max 500)Slugs, ats:slug or career URLs
keywords / excludeKeywordsAny-match on title (and description when loaded)
locationContainsAny-match, case-insensitive, on locations
countriesISO-2 codes; only jobs with an explicit country can match
remoteOnlyOnly jobs explicitly flagged remote
departments, employmentTypes"Contains" match
postedWithinDays0 = any; jobs without a date are dropped when set
includeDescriptionPlain-text description (default off; slower)
maxJobsPerCompanyDefault 200, max 5000; applied after filters (with includeDescription on: before filters)
maxItemsDefault 200, max 20000; caps charged results
onlyNewSinceLastRunReturn only jobs not delivered before for the same companies and filters
concurrencyDefault 5, max 10
includeCompanySummaryDefault true: writes the SUMMARY key-value record

Different filters combine with AND; entries inside one list combine with OR.

Output

Each dataset row is one job: ats, companySlug, companyName, jobId, title, department, team, locations, location, country, remote, workplaceType, employmentType, seniority, postedAt, updatedAt, jobUrl, applyUrl, salary {min,max,currency,period,text}, descriptionText, sourceUrl, scrapedAt. Unknown values are null. Salary is only filled when the employer publishes it; country and remote flags come only from explicit fields, never guessed from titles or city names.

The key-value record SUMMARY lists requested, resolved, notFound, errors, jobsPushed and per-company counts. Companies that are not found or fail upstream are never charged.

Pricing

EventPrice
Actor start$0.00005 (default Apify event)
Job returned$0.003 ($3 per 1,000 jobs)

You pay per job written to the dataset. The "max total charge" setting of your run is respected: the actor stops when the limit is reached. Use maxItems to cap spend.

Examples

Input:

{
"companies": ["greenhouse:figma", "https://jobs.lever.co/spotify", "ramp"],
"keywords": ["engineer"],
"excludeKeywords": ["intern"],
"remoteOnly": true,
"postedWithinDays": 30,
"maxItems": 100
}

curl:

curl -X POST "https://api.apify.com/v2/acts/interconnected_seaport~ats-jobs-feed/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"companies":["greenhouse:figma"],"keywords":["engineer"],"maxItems":50}'

Python:

from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
run = client.actor("interconnected_seaport/ats-jobs-feed").call(run_input={
"companies": ["greenhouse:figma"], "keywords": ["engineer"], "maxItems": 50,
})
for job in client.dataset(run["defaultDatasetId"]).iterate_items():
print(job["companyName"], job["title"], job["location"])

Scheduled new-job alerts

Turn on onlyNewSinceLastRun and schedule the actor. State is stored in a named key-value store in your account, derived from your companies and filters, so changing them starts a fresh history. Jobs are marked as seen only when delivered, so jobs cut off by maxItems appear in the next run. Up to 200,000 job keys are kept (oldest dropped first).

FAQ

Do I need to know the job platform? No. A plain slug is auto-detected. If the same slug exists on several platforms, the one with the most jobs is used and the others are listed in the SUMMARY.

Why is a company "not found"? It has no public board on the supported platforms under that slug. Try the exact slug from its careers URL.

Why is country empty? Only some platforms publish an explicit country code. We do not guess.

Are descriptions available everywhere? Yes with includeDescription, but SmartRecruiters needs one extra request per job.

Only official public endpoints that employers expose for embedding and indexing are read: no login, no proxies, no anti-bot bypass. The actor respects 404 and 429 responses (with limited retries). Job data belongs to the employers. Job posts are generally not personal data; the actor does not extract recruiter or contact names. You are responsible for lawful use of the data.

Limitations

  • Only seven platforms. Workday, Workable, LinkedIn and others are not supported.
  • You must supply the companies; this is not a database of all jobs.
  • Fields vary by platform and are null when not published.