# ATS Job Feed Scraper (`native_emblem/ats-job-feed-scraper`) Actor

Aggregate live jobs from company career pages on Greenhouse, Lever, Ashby & SmartRecruiters. Proxyless, fast, one clean record per job.

- **URL**: https://apify.com/native\_emblem/ats-job-feed-scraper.md
- **Developed by:** [Magpie](https://apify.com/native_emblem) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 jobs

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## ATS Job Feed Scraper — live jobs from any company's career page

Pull **live job listings straight from company career pages** — the ones powered
by **Greenhouse, Lever, Ashby, and SmartRecruiters**. Give it a company (Stripe,
Airbnb, Spotify, Ramp…) and get back every open role as one clean, structured
record: title, department, location, remote flag, employment type, full
description, and a direct apply URL.

No login. No proxies. No fragile HTML scraping — this reads each company's
**official ATS feed**, so the data is complete and stays fresh.

> **Benchmark — 8 companies:** ✅ **1,186 jobs** in one run · 🧩 **100% field completeness** (title, URL, location, description, published date) · ⚡ **~0.2–1 s per board** · 🧼 clean plain-text + original HTML descriptions

Perfect for **job boards & aggregators, recruiting & sourcing tools, talent-market
research, competitive hiring intelligence, and "who's hiring" newsletters**.

---

### ✨ Why this scraper

- **Straight from the source.** Reads each company's official ATS API (Greenhouse, Lever, Ashby, SmartRecruiters) — not a rendered page. Complete listings, no missed jobs.
- **One unified record shape** across every ATS. You don't care whether a company uses Greenhouse or Lever — the output columns are identical.
- **Auto-detect.** Don't know which ATS a company uses? Pass the bare company slug and it finds the right one for you.
- **Clean descriptions.** Both the original `descriptionHtml` and a tidy plain-text `descriptionText` — ready for search indexing, embeddings, or display.
- **Fast & proxyless.** Public JSON endpoints, fetched in parallel. No proxy cost, no captcha, no rate-limit pain.
- **Fair billing.** You're billed per job returned. Boards that don't exist or return nothing are never billed — guaranteed in code.

### 📥 Input

| Field | Type | Description |
|---|---|---|
| `companies` | string[] | One entry per board. `provider:slug` (e.g. `greenhouse:stripe`, `lever:spotify`, `ashby:ramp`, `smartrecruiters:Visa`) for an exact match, or a bare slug (e.g. `ramp`) to auto-detect. |
| `autoDetect` | boolean | For bare slugs, try every ATS and keep whichever returns jobs (default `true`). |
| `searchQuery` | string | Keep only jobs whose **title** contains this text (case-insensitive). |
| `location` | string | Keep only jobs whose **location** contains this text. |
| `remoteOnly` | boolean | Keep only jobs flagged remote by the ATS. |
| `department` | string | Keep only jobs whose **department** contains this text. |
| `maxItems` | integer | Stop after N jobs across all boards. `0` = unlimited. |
| `concurrency` | integer | Boards fetched in parallel, 1–10 (default 5). |

#### Where do I find a company's slug?

It's the company token in its careers URL:

| ATS | Board URL | Slug |
|---|---|---|
| Greenhouse | `boards.greenhouse.io/`**`stripe`** | `stripe` |
| Lever | `jobs.lever.co/`**`spotify`** | `spotify` |
| Ashby | `jobs.ashbyhq.com/`**`ramp`** | `ramp` |
| SmartRecruiters | `jobs.smartrecruiters.com/`**`Visa`** | `Visa` |

#### Example input

```json
{
  "companies": ["greenhouse:airbnb", "lever:spotify", "ashby:ramp", "gitlab"],
  "searchQuery": "engineer",
  "remoteOnly": true,
  "maxItems": 500
}
````

### 📤 Output

One record per live job:

```json
{
  "source": "ashby",
  "companyToken": "ramp",
  "jobId": "0ed80a29-6cca-42d7-b7e0-066d4fa7b37f",
  "title": "Staff Software Engineer | iOS",
  "company": "Ramp",
  "department": "Engineering",
  "team": "Software Engineering",
  "location": "New York, NY (HQ)",
  "locations": ["New York, NY (HQ)", "San Francisco, CA", "Remote (US)"],
  "remote": true,
  "employmentType": "FullTime",
  "url": "https://jobs.ashbyhq.com/ramp/0ed80a29-6cca-42d7-b7e0-066d4fa7b37f",
  "applyUrl": "https://jobs.ashbyhq.com/ramp/0ed80a29-6cca-42d7-b7e0-066d4fa7b37f/application",
  "descriptionHtml": "<h1>About Ramp</h1>...",
  "descriptionText": "About Ramp\n\nRamp is building...",
  "publishedAt": "2026-06-26T01:57:53.065Z",
  "updatedAt": null,
  "scrapedAt": "2026-07-12T10:23:00.158Z"
}
```

Export as **JSON, CSV, Excel**, or pull via the **Apify API**. Schedule runs to
keep a live mirror of any set of companies' openings.

### ❓ FAQ

**Which ATS platforms are supported?**
Greenhouse, Lever, Ashby, and SmartRecruiters — four of the most widely used
applicant-tracking systems. Thousands of companies publish through them.

**How do I scrape many companies at once?**
Add each to `companies`. They're fetched in parallel (see `concurrency`).

**A company isn't returning jobs — why?**
Either the slug is wrong (check the board URL), or the company uses an ATS this
actor doesn't cover yet. With `autoDetect` on, a bare slug is tried against every
supported ATS automatically.

**Do I need proxies?**
No. These are public JSON feeds. It runs proxyless — nothing to configure, no
proxy cost.

**Are descriptions included?**
Yes for Greenhouse, Lever, and Ashby (both HTML and plain text). SmartRecruiters'
list feed returns metadata without the body.

**Is this legal?**
It reads publicly published job listings from companies' own career feeds — no
login, no personal data. Review your own use case and local rules as usual.

### 🔧 Integrations

Works with everything on Apify: **Google Sheets, Zapier, Make, n8n, Airbyte,
webhooks**, or the [Apify API](https://docs.apify.com/api/v2). Schedule daily
runs to keep your job database in sync.

### 🏷️ Keywords

ats scraper, greenhouse jobs api, lever jobs scraper, ashby jobs, smartrecruiters
scraper, job listings api, careers page scraper, hiring data, job board
aggregator, recruiting data, jobs feed, company jobs scraper

# Actor input Schema

## `companies` (type: `array`):

One entry per company board. Use `provider:slug` (e.g. `greenhouse:stripe`, `lever:spotify`, `ashby:ramp`, `smartrecruiters:Visa`) for an exact match, or a bare slug (e.g. `ramp`) to auto-detect across all providers. The slug is the company token in its board URL: boards.greenhouse.io/<slug>, jobs.lever.co/<slug>, jobs.ashbyhq.com/<slug>.

## `autoDetect` (type: `boolean`):

When a company is given without a provider, try every ATS and keep whichever returns jobs. Turn off to treat bare slugs as Greenhouse only (fewer requests).

## `searchQuery` (type: `string`):

Keep only jobs whose title contains this text (case-insensitive). Empty = all titles.

## `location` (type: `string`):

Keep only jobs whose location contains this text (case-insensitive). Empty = all locations.

## `remoteOnly` (type: `boolean`):

Keep only jobs flagged as remote by the ATS.

## `department` (type: `string`):

Keep only jobs whose department contains this text (case-insensitive). Empty = all departments.

## `maxItems` (type: `integer`):

Stop after this many jobs across all boards. 0 = unlimited.

## `concurrency` (type: `integer`):

How many boards to fetch in parallel (1–10).

## Actor input object example

```json
{
  "companies": [
    "greenhouse:airbnb",
    "ramp"
  ],
  "autoDetect": true,
  "searchQuery": "engineer",
  "location": "New York",
  "remoteOnly": false,
  "department": "Sales",
  "maxItems": 0,
  "concurrency": 5
}
```

# Actor output Schema

## `overview` (type: `string`):

One record per live job across all requested company ATS boards.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "companies": [
        "greenhouse:stripe",
        "lever:spotify",
        "ashby:ramp"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("native_emblem/ats-job-feed-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "companies": [
        "greenhouse:stripe",
        "lever:spotify",
        "ashby:ramp",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("native_emblem/ats-job-feed-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "companies": [
    "greenhouse:stripe",
    "lever:spotify",
    "ashby:ramp"
  ]
}' |
apify call native_emblem/ats-job-feed-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=native_emblem/ats-job-feed-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "ATS Job Feed Scraper",
        "description": "Aggregate live jobs from company career pages on Greenhouse, Lever, Ashby & SmartRecruiters. Proxyless, fast, one clean record per job.",
        "version": "0.1",
        "x-build-id": "SX6WbQg8LCTC1LKCc"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/native_emblem~ats-job-feed-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-native_emblem-ats-job-feed-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/native_emblem~ats-job-feed-scraper/runs": {
            "post": {
                "operationId": "runs-sync-native_emblem-ats-job-feed-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/native_emblem~ats-job-feed-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-native_emblem-ats-job-feed-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "companies"
                ],
                "properties": {
                    "companies": {
                        "title": "Companies / ATS boards",
                        "type": "array",
                        "description": "One entry per company board. Use `provider:slug` (e.g. `greenhouse:stripe`, `lever:spotify`, `ashby:ramp`, `smartrecruiters:Visa`) for an exact match, or a bare slug (e.g. `ramp`) to auto-detect across all providers. The slug is the company token in its board URL: boards.greenhouse.io/<slug>, jobs.lever.co/<slug>, jobs.ashbyhq.com/<slug>.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "autoDetect": {
                        "title": "Auto-detect provider for bare slugs",
                        "type": "boolean",
                        "description": "When a company is given without a provider, try every ATS and keep whichever returns jobs. Turn off to treat bare slugs as Greenhouse only (fewer requests).",
                        "default": true
                    },
                    "searchQuery": {
                        "title": "Title contains",
                        "type": "string",
                        "description": "Keep only jobs whose title contains this text (case-insensitive). Empty = all titles."
                    },
                    "location": {
                        "title": "Location contains",
                        "type": "string",
                        "description": "Keep only jobs whose location contains this text (case-insensitive). Empty = all locations."
                    },
                    "remoteOnly": {
                        "title": "Remote jobs only",
                        "type": "boolean",
                        "description": "Keep only jobs flagged as remote by the ATS.",
                        "default": false
                    },
                    "department": {
                        "title": "Department contains",
                        "type": "string",
                        "description": "Keep only jobs whose department contains this text (case-insensitive). Empty = all departments."
                    },
                    "maxItems": {
                        "title": "Max jobs",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Stop after this many jobs across all boards. 0 = unlimited.",
                        "default": 0
                    },
                    "concurrency": {
                        "title": "Concurrency",
                        "minimum": 1,
                        "maximum": 10,
                        "type": "integer",
                        "description": "How many boards to fetch in parallel (1–10).",
                        "default": 5
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
