# Snagajob Scraper - US Hourly Jobs, Wages & Employers (`santamaria-automations/snagajob-us-scraper`) Actor

Extract Snagajob hourly jobs across US restaurants, retail, warehouse, and gig work. Returns title, company, city/state/zip, hourly wage min/max, shift, employment type, tip/teen-friendly/transportation flags, plus employer profile pages. 20+ fields per job.

- **URL**: https://apify.com/santamaria-automations/snagajob-us-scraper.md
- **Developed by:** [NanoScrape](https://apify.com/santamaria-automations) (community)
- **Categories:** Jobs, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## Snagajob Scraper - US Hourly Jobs, Wages & Employers

Extract hourly job listings from [Snagajob](https://www.snagajob.com), the largest US marketplace for hourly workforce roles. Restaurants, retail, warehouse, delivery, gig, seasonal, cleaning, hospitality, teen-friendly work: Snagajob is where 100M+ hourly workers search, and this actor turns that catalog into structured data.

Hourly wage, shift schedule, tip-eligibility, teen-eligible flags, transportation-provided flags: fields that matter for hourly workforce research, not the salary-year fields most job scrapers return.

***

### What it does

Given search keywords and a US location (city, state, or zip), the actor returns every matching Snagajob posting with 20+ structured fields per job. Optional flags add a full description sweep and an employer-profile enrichment pass.

- Search by keywords + location (e.g. "server" in "New York, NY")
- OR paste pre-built Snagajob search URLs to preserve advanced filters
- SERP mode returns 20+ fields per job
- `includeJobDetails=true` adds full description quartet (full/html/md/snippet), requirements, application URL, job badge tags, refresh date, posting ID
- `includeCompanyDetails=true` adds employer profile: about, website, industry, headquarters, active-jobs list (deduplicated per employer)

The actor runs a stealth Firefox browser through US residential IPs to reliably bypass Snagajob's Cloudflare protection, so results come back on the first run without configuration.

***

### Sample output

```json
{
  "id": "687452301",
  "source_platform": "snagajob.com",
  "source_url": "https://www.snagajob.com/jobs/server-687452301",
  "job_url": "https://www.snagajob.com/jobs/server-687452301",
  "application_url": "https://apply.snagajob.com/687452301",
  "title": "Server",
  "company_name": "Buffalo Wild Wings",
  "company_logo_url": "https://media.api.snagajob.com/bww-logo.png",
  "company_url": "https://www.snagajob.com/company/buffalo-wild-wings",
  "location": "New York, NY 10018",
  "city": "New York",
  "state": "NY",
  "postal_code": "10018",
  "country": "US",
  "hourly_min": 16.5,
  "hourly_max": 22.0,
  "wage_currency": "USD",
  "wage_period": "hour",
  "wage_text": "$16.50 - $22.00 / hour + tips",
  "employment_type": "part-time",
  "shift": "evening",
  "workplace_type": "onsite",
  "category": "restaurant",
  "tip_included": true,
  "teen_friendly": false,
  "transportation_provided": false,
  "description_snippet": "Buffalo Wild Wings is hiring servers for our Times Square location. Great tips, flexible schedule...",
  "description_full": "Buffalo Wild Wings is hiring servers...\n\nResponsibilities:\n- Take orders and serve food...",
  "description_html": "<div data-snagtag=\"job-description\">...</div>",
  "description_md": "## About the Role\n\nBuffalo Wild Wings is hiring servers...",
  "requirements": ["1+ year restaurant experience", "Must be 18+"],
  "job_tags": ["Urgently hiring"],
  "posted_at": "2026-08-01T14:12:00Z",
  "posted_relative": "2 days ago",
  "refreshed_at_datetime": "2026-08-18T00:00:00Z",
  "posting_id": "687452301",
  "search_query": "server",
  "search_location": "New York, NY",
  "serp_page": 1,
  "serp_position": 3,
  "scraped_at": "2026-09-05T10:00:00Z"
}
```

***

### Pricing

Three tiers based on how much data you need per job. All prices below are per 1,000 jobs written to your dataset.

**SERP mode (default) - $12.00 per 1,000 jobs**

Returns 20+ fields from the search results page: title, company, location (parsed to city/state/zip), hourly wage min/max/currency, employment type, shift, category, hourly-specific flags (tip, teen-friendly, transportation), workplace type, posted date, description snippet, job URL.

**Full mode (`includeJobDetails: true`) - $27.00 per 1,000 jobs**

Adds a per-job detail-page fetch: full description text + HTML + Markdown, extracted requirements bullets, job badge tags (urgently hiring, featured, remote etc.), refreshed\_at\_datetime, posting\_id, application URL, refined company logo. Roughly doubles runtime.

**Employer mode (`includeCompanyDetails: true`) - +$8.00 per 1,000 unique employers resolved**

Adds a per-employer profile fetch: company\_about, company\_website, company\_industry, company\_headquarters, company\_active\_jobs\_count, and up to 20 active\_jobs. Deduplicated: 40 jobs from Buffalo Wild Wings count as 1 employer, not 40.

| Volume | SERP mode | Full mode | Full + Employer (5 unique employers) |
|--------|-----------|-----------|--------------------------------------|
| 100 jobs | $1.20 | $2.70 | $2.74 |
| 1,000 jobs | $12.00 | $27.00 | $27.40 |
| 10,000 jobs | $120.00 | $270.00 | ~$274.00 |

Apify Free plan gives you $5 monthly platform credit, which covers ~400 jobs in SERP mode. Charged per job written; no monthly subscription, no hidden fees.

Pricing reflects the cost of the stealth-browser architecture required to reliably scrape Snagajob at volume. Customers who subscribed before 2026-09-03 are grandfathered on their original rate.

***

### Input

```json
{
  "searchQueries": ["server", "warehouse associate"],
  "location": "New York, NY",
  "sortBy": "newest",
  "maxResults": 100,
  "includeJobDetails": true,
  "includeCompanyDetails": true
}
```

You can also pass `startUrls` with pre-built Snagajob URLs to preserve advanced filters (radius, category, shift):

```json
{
  "startUrls": [
    "https://www.snagajob.com/jobs/search?q=cashier&location=chicago%2C+il&radius=15"
  ],
  "maxResults": 200
}
```

**Input fields**

| Field | Type | Description |
|-------|------|-------------|
| `searchQueries` | string\[] | One or more job search terms combined with `location`. |
| `startUrls` | string\[] | Pre-built Snagajob search URLs; overrides `searchQueries` + `location`. |
| `location` | string | US city, state, or zip. Empty = Snagajob decides, no fallback. |
| `sortBy` | enum | `"newest"` (only accepted value). Snagajob does not expose a server-side sort control; SERP is site-native ordering. |
| `includeJobDetails` | bool | Fetch each PDP for full description, requirements, application URL, job\_tags, refreshed\_at\_datetime, posting\_id. |
| `includeCompanyDetails` | bool | Fetch each employer profile page. Auto-enables `includeJobDetails`. |
| `maxResults` | int | Cap on total jobs pushed (default 5). |
| `maxResultsPerQuery` | int | Cap per individual query (default 5). |
| `startPage` | int | 1-indexed page offset for pagination resumption. |

***

### Output fields

**Job identity**

- `id`, `source_url`, `job_url`, `source_platform`, `application_url`
- `posting_id` (details mode): stable posting identifier from the detail page footer, durable across runs

**Role**

- `title`
- `description_snippet`: short plain-text preview (always populated in details mode)
- `description_full` (details mode): full plain-text description
- `description_html` (details mode): raw HTML from the job description block
- `description_md` (details mode): Markdown-formatted description
- `requirements[]` (details mode): extracted requirement bullet points
- `job_tags[]` (details mode): callout badges from the detail page (e.g. "Urgently hiring", "Featured", "Remote")

**Company**

- `company_name`, `company_logo_url`, `company_url`
- Employer mode adds: `company_about`, `company_website`, `company_industry`, `company_headquarters`, `company_active_jobs_count`, `company_active_jobs[]`

**Location**

- `location` (formatted), `city`, `state`, `postal_code`, `country`

**Wage (hourly-first)**

- `hourly_min`, `hourly_max`, `wage_currency`, `wage_period`, `wage_text`

**Schedule & type**

- `employment_type` (full-time, part-time, seasonal, temporary, gig)
- `shift` (day, evening, night, rotating)
- `workplace_type` (onsite, remote, hybrid)
- `category` (restaurant, retail, warehouse, delivery, healthcare, cleaning, hotel, customer\_service, gig)

**Hourly-workforce differentiators**

- `tip_included` (boolean): tip-earning role
- `teen_friendly` (boolean): 14-16-year-old eligible
- `transportation_provided` (boolean): employer transport benefit

**Timing**

- `posted_at` (ISO): original listing creation date, from JSON-LD datePosted
- `posted_relative` (e.g. "2 days ago")
- `refreshed_at_datetime` (ISO, details mode): last re-post date from the detail page footer; only populated when it differs from `posted_at`
- `scraped_at` (ISO)

**Search metadata**

- `search_query`, `search_location`, `serp_page`, `serp_position`

***

### Use with AI Agents (MCP)

Connect this actor to any MCP-compatible AI client: Claude Desktop, Claude.ai, Cursor, VS Code, LangChain, LlamaIndex, or custom agents.

**Apify MCP server URL:**

```
https://mcp.apify.com?tools=santamaria-automations/snagajob-us-scraper
```

**Example prompts once connected:**

> "Use `snagajob-us-scraper` to find server jobs in Chicago paying $18/hr or more. Return the top 20 as a table with title, company, wage, and tip flag."

> "Use `snagajob-us-scraper` to pull all teen-friendly retail jobs in Dallas, TX. Return the ones with transportation provided."

***

### Why this scraper

Most job scrapers on Apify Store target white-collar, salaried roles. LinkedIn, Indeed, Glassdoor. Their "hourly rate" fields are often empty, their category buckets do not include "seasonal" or "gig", and none of them flag tip-eligibility or teen-friendly status.

Snagajob is the largest US catalog of hourly work: 100M+ registered hourly workers, 700K+ active listings across restaurant, retail, warehouse, delivery, and gig verticals. This actor treats Snagajob's data model as first-class: hourly wage min/max as separate typed fields, not stuffed into `salary_text`; shift schedule; tip-earning flag; teen-eligible flag; transportation-provided flag. Plus employer profile enrichment for lead-gen use cases.

The actor uses a stealth Firefox browser architecture (Camoufox + US residential proxy + homepage warm-walk) to reliably bypass Snagajob's Cloudflare protection: HTTP-only scrapers currently return 403 on this site.

***

### Use cases

**Hourly workforce salary benchmarking**
Aggregate hourly wage ranges across roles, cities, and employers. Snagajob's wage data is dense: most postings publish an explicit hourly range.

**Restaurant and retail hiring intel**
Track which brands are hiring, at what wages, in which markets. Buffalo Wild Wings, Starbucks, Chipotle, Target, Walmart, Amazon all post on Snagajob.

**Gig and seasonal role research**
Snagajob categorizes seasonal roles (holiday retail, summer resort, warehouse peak) that vanish from general job boards.

**Youth employment research**
The `teen_friendly` flag surfaces roles eligible for 14-16-year-olds: valuable for youth employment policy work or teen-focused platforms.

**Lead generation for HR tech and workforce management vendors**
`includeCompanyDetails=true` returns employer profiles with website, industry, headquarters, and active jobs count: qualified leads for anyone selling into hourly-employer segments.

***

### Notes and limits

- Snagajob is a US-only site. This actor covers the US market. For other geographies, see our Indeed Scraper (60+ countries).
- Hourly-specific boolean flags (`tip_included`, `teen_friendly`, `transportation_provided`) are extracted from explicit structured fields when Snagajob provides them, plus keyword inference from title and description text. False negatives are possible when a role qualifies but the posting does not describe it in searchable terms.
- Employer profile enrichment (`includeCompanyDetails=true`) deduplicates per unique employer URL. A single run with 50 postings from 5 employers charges 5 `company-detail-result` events, not 50.
- Cloudflare pass rate on the residential architecture is ~90%. Occasional retries add ~1.1x runtime overhead; this is priced into the SERP rate.
- Direct URL navigation to filtered SERPs works, but the actor prefers a natural click-through pagination flow (Next button) after the first page: less flag-prone.
- `job_tags` (e.g. "Urgently hiring") and `refreshed_at_datetime` are only populated in full mode (`includeJobDetails: true`). Both require a detail-page visit to extract.

***

### Related Actors

Working across the US job market? These complement Snagajob:

- [WayUp Scraper](https://apify.com/santamaria-automations/wayup-us-scraper) — US entry-level and internship jobs (adjacent early-career/entry segment).
- [ZipRecruiter Scraper](https://apify.com/santamaria-automations/ziprecruiter-scraper) — US-focused aggregator (broader coverage across hourly + salaried).
- [Indeed Scraper](https://apify.com/santamaria-automations/indeed-scraper) — Global job listings from 60+ countries.
- [Glassdoor Scraper](https://apify.com/santamaria-automations/glassdoor-scraper) — US flagship aggregator with employer reviews.

Broader coverage:

- [LinkedIn Jobs Scraper](https://apify.com/santamaria-automations/linkedin-scraper) — Salaried and professional postings globally.
- [Google Jobs Scraper](https://apify.com/santamaria-automations/google-jobs-scraper) — Google for Jobs aggregator.
- [BuiltIn Scraper](https://apify.com/santamaria-automations/builtin-scraper) — US tech startup jobs.
- [Google Maps Scraper](https://apify.com/santamaria-automations/google-maps-scraper) — Business location data for enrichment.

***

### Support

Something looking off, or need a field this actor does not return yet? Open an issue on the [Issues tab](https://apify.com/santamaria-automations/snagajob-us-scraper/issues) or email contact@nanoscrape.com. We usually reply within 6 hours.

# Actor input Schema

## `searchQueries` (type: `array`):

One or more job search terms, e.g. \['server', 'warehouse associate', 'cashier']. Combined with 'location' below.

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

Optional: pre-built Snagajob search URLs. Overrides 'location' and 'searchQueries' if provided. Preserves advanced filters (distance, shift, category). Example: https://www.snagajob.com/jobs/search?q=server\&location=new+york%2C+ny\&radius=15

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

US city, state, or zip code (e.g. 'New York, NY' or '10001'). Leave empty for nationwide search — Snagajob decides. No auto-fallback.

## `includeJobDetails` (type: `boolean`):

Fetch each job's detail page (PDP) for the full description, requirements, application URL, and any employer link visible on the posting. Charged as separate 'job-detail-result' PPE event per enriched job.

## `includeCompanyDetails` (type: `boolean`):

Fetch the employer's /company/{slug} page for company\_about, company\_website, company\_logo, company\_industry, company\_headquarters, company\_active\_jobs\_count, and up to 20 active\_jobs. Auto-enables includeJobDetails (employer link only appears on the PDP). Charged as separate 'company-detail-result' PPE event per unique employer.

## `maxResults` (type: `integer`):

Cap on total jobs pushed to dataset across all queries and URLs.

## `maxResultsPerQuery` (type: `integer`):

Cap on jobs pushed per individual search query.

## `startPage` (type: `integer`):

Skip N-1 pages before returning results. Useful for pagination resumption. Snagajob uses ?page=N.

## `sortBy` (type: `string`):

How to order Snagajob results. Snagajob does not expose a server-side sort control on /jobs/search — its SERP is a proprietary relevance-plus-recency blend with newer postings surfaced first for scheduled scrapes. This field is present for fleet consistency; the sole supported value is 'newest' (site native ordering). Recommended for daily/hourly scheduled runs where you want fresh postings at the top.

## Actor input object example

```json
{
  "searchQueries": [
    "server"
  ],
  "startUrls": [],
  "location": "",
  "includeJobDetails": false,
  "includeCompanyDetails": false,
  "maxResults": 5,
  "maxResultsPerQuery": 5,
  "startPage": 1,
  "sortBy": "newest"
}
```

# Actor output Schema

## `jobListings` (type: `string`):

Dataset containing all scraped Snagajob hourly job postings. 20+ fields per job in SERP mode, +8 fields in detail mode (description quartet, job\_tags, refreshed\_at\_datetime, posting\_id, application\_url), +7 employer fields in company mode. Deduplicated across queries by job\_url slug.

# 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 = {
    "searchQueries": [
        "server"
    ],
    "sortBy": "newest"
};

// Run the Actor and wait for it to finish
const run = await client.actor("santamaria-automations/snagajob-us-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 = {
    "searchQueries": ["server"],
    "sortBy": "newest",
}

# Run the Actor and wait for it to finish
run = client.actor("santamaria-automations/snagajob-us-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 '{
  "searchQueries": [
    "server"
  ],
  "sortBy": "newest"
}' |
apify call santamaria-automations/snagajob-us-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,santamaria-automations/snagajob-us-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/IFBc3ungsOXFI1EmH/builds/M9PMtEliS18i2Jofz/openapi.json
