# Snagajob Scraper \[$1.5💰]| Hourly Jobs | Wages | US Listings (`ahmed_jasarevic/snagajob-scraper`) Actor

\[$1.5💰] Get structured US hourly & part-time job listings from Snagajob.com: job ID, title, company, city/state, verified hourly wages, shifts, employment type & apply links. Auto-paginates up to 100,000 jobs. Pay only $0.0015 per result.

- **URL**: https://apify.com/ahmed\_jasarevic/snagajob-scraper.md
- **Developed by:** [Ahmed Jasarevic](https://apify.com/ahmed_jasarevic) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.47 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Snagajob Scraper — Hourly & Part-Time US Job Listings, Wages & Employer Data

**Snagajob Scraper** turns [Snagajob.com](https://www.snagajob.com) — the largest US job board for hourly work — into structured datasets. In a single run it extracts hourly and part-time job listings across **retail, restaurants, warehouses, healthcare support, delivery and more**, returning job ID, title, company, city/state, verified hourly wage range, employment type, shift and the direct application URL — plus, optionally, the full description, requirements and benefits. Priced per job (**$0.0015/result**) with auto-pagination up to **100,000 listings per run**, and no browser, captchas or proxies needed. Any data team can add US hourly job market data to a database, dashboard or AI pipeline in minutes.

The Actor runs on the [Apify platform](https://apify.com), so you get **REST API access, scheduling, integrations** (Zapier, Make, Google Sheets) and **monitoring** out of the box.

### Main Use Cases

- **Staffing & recruiting research** — benchmark hourly openings, posted wages and employer demand by keyword, city or ZIP.
- **Wage & labor-market analysis** — collect structured pay data (`wageMin`/`wageMax`/`wageUnit`/`wageVerified`) to compare hourly rates across US metros.
- **Job databases & job boards** — enrich your own product with Snagajob listings, including direct apply URLs.
- **Workforce monitoring** — track retail, restaurant and warehouse openings per brand over time (weekly scheduled runs).
- **AI agents & LLM pipelines** — feed a job-search assistant, recommendation engine or market-trend model with clean, deduplicated job objects.

### How It Works

Snagajob's website is protected by Cloudflare, which blocks datacenter IPs. However, Snagajob's official **JobGet MCP server** (`https://platform.jobget.com/jobs-mcp/mcp`) is public and not IP-blocked, exposing two tools:

- `search_jobs` — ranked search by location, keyword, radius, employment type, shift and date posted
- `get_job_details` — full details (description, requirements, benefits, ZIP, coordinates)

The Actor calls this endpoint directly over JSON-RPC (no browser, no DOM parsing, no proxy). Because the search API caps every query at 25 results, the Actor **auto-paginates** by sweeping filter combinations (employment type × shift × date posted), gathering every variation and **de-duplicating by job ID**. Details are fetched with a small concurrent worker pool.

### Track US Hourly Job Market Trends

Run this Actor weekly per metro or state and you get a time series of hourly openings: how many jobs, which employers, which shifts (`day`, `evening`, `night`, `overnight`, `weekend`), and at what posted wages. Combine the `datePosted` filter (`today`, `last_3_days`, `last_week`, `last_30_days`) with `employmentType` (`full_time`, `part_time`, `seasonal`, `temporary`) to isolate fresh, part-time or seasonal postings for trend analysis.

### Build Part-Time Job Databases for Recruitment Research

With ~35 million Americans working part-time hours, Snagajob is the single deepest source of US hourly/part-time postings. Set `employmentType: "part_time"`, add several related keywords (e.g. `waiter`, `bartender`, `host`) and let `fillWithOtherJobs` top up the rest with every other hourly job near the location — then export the whole dataset as JSON, CSV, Excel or HTML.

### Monitor Hourly Wages Across US Cities

Every search result already carries `wageMin`, `wageMax`, `wageUnit` and `wageVerified`. Enable `includeDescription` to also get the verified flag and full posting text. Because pay is employer-posted per hour, you can benchmark like-for-like rates — retail vs. warehouse vs. healthcare support — across cities without annual-salary conversions.

### Input

| Field                | Type    | Description                                                                                                     |
| -------------------- | ------- | --------------------------------------------------------------------------------------------------------------- |
| `keyword`            | string  | Single job keyword (optional). Leave it and `keywords` empty to scrape **all jobs near the location**.          |
| `keywords`           | array   | Extra keywords; each gets its own full paginated search, merged + de-duplicated (e.g. `waiter`, `bartender`).    |
| `location`           | string  | City, state or ZIP to search near (e.g. `Seattle, WA`, `90001`, `TX`).                                          |
| `radius`             | integer | Search radius in miles (default `20`, max `50`).                                                                |
| `maxItems`           | integer | Max listings (default `100`, max `100,000`). The Actor pages through results automatically.                     |
| `includeDescription` | boolean | Fetch full details — description, requirements, benefits, ZIP, coordinates (default `true`). Add **$0.001/job**. |
| `fillWithOtherJobs`  | boolean | Top up keyword results below `maxItems` with all other nearby hourly jobs (default `true`).                     |
| `employmentType`     | string  | Filter: `full_time`, `part_time`, `seasonal`, `temporary`. Empty = all.                                         |
| `shift`              | string  | Filter: `day`, `evening`, `night`, `overnight`, `weekend`. Empty = all.                                         |
| `datePosted`         | string  | Filter: `today`, `last_3_days`, `last_week`, `last_30_days`. Empty = all.                                       |
| `startUrls`          | array   | Direct Snagajob job URLs to scrape exactly (e.g. `https://www.snagajob.com/jobs/1296915295`).                   |
| `proxy`              | object  | Standard Apify proxy config. Not required (endpoint is not IP-blocked), kept for consistency.                   |

### Output

Each dataset item is a flat JSON object. Search-level items contain the core identifiers, location, wages, employment details and the application link; enabling `includeDescription` (or using direct URLs) adds the enrichment fields:

| Field                                            | Description                                    |
| ------------------------------------------------ | ---------------------------------------------- |
| `jobId`                                          | Snagajob posting ID                            |
| `title` / `companyName` / `logoUrl`              | Job title, company and logo                    |
| `city` / `state`                                 | Job location                                   |
| `distanceInMiles`                                | Distance from the search location              |
| `wageMin` / `wageMax` / `wageUnit`               | Employer-posted pay range and unit (hour/day/week/month/year) |
| `wageVerified`                                   | Pay verified by the employer                   |
| `employmentType` / `shift` / `schedule`          | Employment and shift details                   |
| `postedAt` / `expiresAt`                         | Posting dates                                  |
| `applicationUrl` / `jobUrl`                      | Apply link and canonical listing URL           |
| `easyApplyEligible` / `urgentlyHiring`           | Application and hiring flags                   |
| `description` / `requirements` / `benefits`      | Full posting text (detail fetch)               |
| `postalCode` / `latitude` / `longitude`          | Precise location (detail fetch)                |
| `detailCity` / `detailState` / `companyUrl`      | Detail-level location and company (where available) |

**Dataset views:** the Actor declares an `overview` view (`jobId`, `title`, `companyName`, `city`, `state`, `wageMin`, `wageMax`, `wageUnit`, `employmentType`, `jobUrl`) — output is also downloadable as JSON, CSV, Excel or HTML.

### Example Input

```json
{
  "keyword": "waiter",
  "keywords": ["bartender", "host"],
  "location": "Seattle, WA",
  "radius": 20,
  "maxItems": 1000,
  "includeDescription": true,
  "employmentType": "part_time",
  "datePosted": "last_week"
}
```

### Example Output

```json
{
    "jobId": "1296915295",
    "title": "Dining Room Server",
    "companyName": "Quail Park",
    "city": "Seattle",
    "state": "WA",
    "distanceInMiles": 3.6,
    "wageMin": 17.13,
    "wageMax": 17.5,
    "wageUnit": "hour",
    "wageVerified": true,
    "employmentType": "full_time",
    "shift": null,
    "postedAt": "2026-09-17T08:02:01.508Z",
    "applicationUrl": "https://www.snagajob.com/jobs/1296915295",
    "easyApplyEligible": false,
    "urgentlyHiring": false,
    "jobUrl": "https://www.snagajob.com/jobs/1296915295",
    "description": "Dining Room Server\nQuail Park of Lynnwood\n\nHave you always wanted a fun and rewarding job?...",
    "requirements": ["Strong commitment to customer service", "..."],
    "benefits": ["Medical, Dental and Vision Insurance", "..."],
    "postalCode": "98185",
    "latitude": 47.6602,
    "longitude": -122.3143
}
```

### Integrations & Scheduling

- **API:** call via `POST /v2/acts/ahmed_jasarevic~snagajob-scraper/runs` and fetch results from the returned dataset.
- **Scheduling:** schedule a run **weekly** (or daily) to monitor hourly job market changes — openings, wages and new employers per market.
- **Automation:** Zapier, Make (Integromat), Google Sheets, Slack/email notifications via Apify webhooks.
- **Export:** dataset output as JSON, CSV, Excel or HTML.

### Related Actors

- [LinkedIn Jobs Scraper](https://apify.com/curious_coder/linkedin-jobs-scraper) — most-used job scraping Actor on the Apify Store.
- [Indeed Scraper](https://apify.com/misceres/indeed-scraper) — official Apify scraper for the largest job board.
- [CareerBuilder Scraper](https://apify.com/ahmed_jasarevic/careerbuilder-scraper) — US salary & listings data (CareerBuilder).
- [Jora Job Scraper](https://apify.com/ahmed_jasarevic/jora-scraper) — Jora (AU/NZ) jobs with salary data.
- [eFinancialCareers Scraper](https://apify.com/ahmed_jasarevic/efinancialcareers-scraper) — finance job salaries across 23 countries.

### FAQ

**Does Snagajob have an official public API for job data?**
No public "pull" API for buyers. Snagajob publishes a partner/employer API (docs.snagajob.com, keyed via `X-SAJ-ApiKey`) for pushing postings and routing applications — not for pulling listings out. The practical route to hourly job data is collecting the public postings (directly, or via the public JobGet MCP endpoint this Actor uses).

**What alternative job data sources exist?**
For US hourly/entry-level jobs: Indeed, CareerBuilder, ZipRecruiter and LinkedIn Jobs scrapers on the Apify Store; for other regions, Jora (AU/NZ), eFinancialCareers, SEEK and Naukri. Aggregator job-data APIs (e.g. Jobo Data, Hirebase, Coresignal, Bright Data) also sell cleaned feeds but are far more expensive per record than pay-per-result scraping.

**What's in each row?**
See the **Output** section: every row has the job ID, title, company, city/state, wages (min/max/unit/verified), employment type, dates, application URL and flags; with `includeDescription` you also get description, requirements, benefits, ZIP and coordinates.

**Can I scrape by state/city/ZIP?**
Yes — pass a city (`Seattle, WA`), a ZIP (`90001`) or a state (`TX`, `FL`, `CA`) as `location`. For state-level sweeps set `maxItems` high and `keyword` empty.

**How many jobs can I get in one run?**
Up to `100,000` listings per run (`maxItems`, default 100). The auto-pagination sweeps filter buckets until all reachable matches are collected or the cap is hit.

**What does it cost?**
Pay-per-result, transparent billing: **$0.0015 per search-level job**, **+$0.001 per job** when `includeDescription: true` (or for direct-URL jobs), plus a one-time `$0.00005` actor-start charge. 1,000 listings with descriptions ≈ **$2.50**. Free Apify accounts get a capped preview (10 items).

**Is scraping Snagajob legal?**
Scraping publicly available job listings is generally acceptable, but you should review Snagajob's Terms of Service and robots.txt, and comply with applicable laws. This Actor is not affiliated with or endorsed by Snagajob or JobGet.

### SEO Keywords

hourly jobs data, hourly jobs database, part time jobs database, us hourly job listings, hourly wage data, hourly pay data, wage comparison data hourly jobs, snagajob scraper, snagajob jobs api, retail jobs listing data, restaurant jobs database, warehouse worker jobs data, customer service jobs data, healthcare support jobs cna, driver delivery jobs data, entry level job listings, entry level job market, hourly employment trends, gig economy jobs research, seasonal jobs data, state by state hourly jobs, job market data api

### For AI Agents & LLM Apps

**Purpose:** this Actor is a drop-in tool for agents that need *structured US hourly/part-time job data* — answering wage questions, building job databases, monitoring hiring trends, or routing users to real postings.

**Minimal input:** `keyword` + `location` (+ optional `maxItems`, `employmentType`, `datePosted`, `startUrls`). That's all an LLM needs to start a run.

**Output fields:** `jobId`, `title`, `companyName`, `city`, `state`, `distanceInMiles`, `wageMin`, `wageMax`, `wageUnit`, `wageVerified`, `employmentType`, `shift`, `postedAt`, `applicationUrl`, `easyApplyEligible`, `urgentlyHiring`, `jobUrl`; with `includeDescription: true` also `description`, `requirements`, `benefits`, `postalCode`, `latitude`, `longitude`.

**Agent behaviors to keep costs low:**

- Set `includeDescription: false` (default) unless the task genuinely needs full posting text — **details add $0.001 per job** and increase run cost.
- Keep `fillWithOtherJobs` off when you only want keyword-matched results.
- Use `maxItems` to bound the run; pay-per-result means every returned job is billed.

**Billing:** `$0.0015` per result + `$0.001` per job with full details (`includeDescription`) + `$0.00005` per run start. ~1,000 jobs with descriptions ≈ **$2.50**.

### Legal & Compliance Disclaimer

This Actor is **not affiliated with, endorsed by, or sponsored by Snagajob, JobGet, or any related entity**. It collects **publicly visible job postings**; the user is solely responsible for reviewing Snagajob's Terms of Service and robots.txt and for complying with all applicable laws before using the data. The output contains **job posting data only** — no job-seeker or applicant profiles are collected. Job descriptions may **incidentally include employer contact details** (e.g. a business email or phone typed by the employer): use such data only for legitimate, lawful purposes (e.g. job applications, sanctioned outreach) and never for unsolicited marketing. If you encounter any personal data of identifiable individuals, handle it in accordance with applicable privacy laws (e.g. GDPR/CCPA) and only with a valid legal basis.

Use responsibly, respect the operators' terms, and do not overload the source.

# Actor input Schema

## `keyword` (type: `string`):

A single job title or keyword to search for (e.g. "waiter", "cashier", "warehouse"). Optional — leave it AND 'Additional keywords' empty to scrape ALL jobs near the location. You can also leave these empty when using Direct job URLs.

## `keywords` (type: `array`):

Extra job keywords to search for — each keyword gets its own full paginated search and results are merged and de-duplicated. Combine several related roles (e.g. waiter, bartender, host) to gather many more listings than a single keyword can.

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

City, state, or ZIP code to search near (e.g. "Seattle, WA" or "90001"). The search API resolves jobs near this location.

## `radius` (type: `integer`):

Search radius in miles around the location (max 50).

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

Maximum number of job listings to scrape. The Actor automatically pages through all available results for your filters (each query returns up to 25), so you can request tens of thousands of jobs. 0 is not allowed; set a high value to grab everything.

## `includeDescription` (type: `boolean`):

Whether to also fetch each job's full details (description, requirements, benefits, ZIP, coordinates). Direct URL jobs always include full details.

## `fillWithOtherJobs` (type: `boolean`):

When the keyword(s) return fewer postings than the requested max, keep going and fill the remaining slots with ALL other jobs near the location (ignore the keyword). If you want strictly keyword-matched results, set this to false.

## `employmentType` (type: `string`):

Only return jobs of a specific employment type. Empty = all types. This also lets the pagination drill further and surface more jobs.

## `shift` (type: `string`):

Only return jobs with a specific shift. Empty = all shifts.

## `datePosted` (type: `string`):

Only return jobs posted within the selected window. Empty = all posting dates.

## `startUrls` (type: `array`):

Paste specific Snagajob job listing URLs (e.g. https://www.snagajob.com/jobs/1296915295) to scrape those exact postings. Use this together with a keyword search, or on its own (keyword/location can be empty).

## `proxy` (type: `object`):

Select proxies to be used by your crawler. Not required for this Actor (the endpoint is not IP-blocked), but kept for consistency.

## Actor input object example

```json
{
  "keyword": "waiter",
  "location": "Seattle, WA",
  "radius": 20,
  "maxItems": 100,
  "includeDescription": true,
  "fillWithOtherJobs": true,
  "proxy": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# 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 = {
    "keyword": "waiter",
    "location": "Seattle, WA",
    "proxy": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("ahmed_jasarevic/snagajob-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 = {
    "keyword": "waiter",
    "location": "Seattle, WA",
    "proxy": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("ahmed_jasarevic/snagajob-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "keyword": "waiter",
  "location": "Seattle, WA",
  "proxy": {
    "useApifyProxy": false
  }
}' |
apify call ahmed_jasarevic/snagajob-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ahmed_jasarevic/snagajob-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/glEigirRohl07b9Ae/builds/n9sVZaad0uY90Sa3Y/openapi.json
