# Craigslist Jobs Scraper: Extract Local & Gig Jobs (`santamaria-automations/craigslist-jobs-scraper`) Actor

Extract job and gig listings from Craigslist.org - the US's largest classifieds job board. Covers 430+ city subdomains. Returns title, location, posted date, full description, salary, contact emails and phones extracted from posting body. RSS-first for speed and reliability.

- **URL**: https://apify.com/santamaria-automations/craigslist-jobs-scraper.md
- **Developed by:** [NanoScrape](https://apify.com/santamaria-automations) (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 $3.00 / 1,000 serp results

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

## Craigslist Jobs Scraper: US Local, Gig and Small-Biz Jobs

Extract job and gig listings from [Craigslist.org](https://craigslist.org) - the US's largest classifieds-format job board. Covers 430+ city subdomains including New York, SF Bay Area, Chicago, Los Angeles, Seattle, Boston, and more.

Built on standard HTTP with RSS feed parsing and HTML fallback. No browser automation. Craigslist session cookie (`cl_b`) is handled automatically.

### What it does

Pulls live job and gig listings from Craigslist across any combination of US cities and search keywords. Uses RSS feeds by default for fast, reliable SERP results with clean ISO timestamps. Optionally fetches each posting page for full description, salary details, and contact information (emails, phones, apply URLs) embedded directly in posting bodies.

Supports standard employment listings (`/jjj/`) and short-term gigs (`/ggg/`) with Craigslist-specific fields including `category_subcode` (e.g. `sof` for software, `hea` for healthcare), `is_telecommute`, `is_paid`, `has_image`, and `location_area` (Craigslist neighborhood tags).

### Sample output

```json
{
  "_type": "job",
  "id": "HMhqfPGf8RGtB8GTMmrRGg",
  "title": "Registered Nurse (RN) Cart Nurse",
  "job_url": "https://www.craigslist.org/view/d/brooklyn-registered-nurse-rn-cart-nurse/HMhqfPGf8RGtB8GTMmrRGg",
  "source_url": "https://www.craigslist.org/view/d/brooklyn-registered-nurse-rn-cart-nurse/HMhqfPGf8RGtB8GTMmrRGg",
  "source_platform": "craigslist.org",
  "company_name": "Brooklyn Center",
  "company_website": null,
  "location": "New York City",
  "country": "US",
  "location_area": null,
  "city_slug": "newyork",
  "city_name": "New York City",
  "posted_at_text": "2026-08-24T19:25:54+0000",
  "posted_at_datetime": "2026-08-24T19:25:54Z",
  "employment_type": "full-time",
  "salary_min": null,
  "salary_max": null,
  "salary_currency": null,
  "salary_period": null,
  "salary_text": null,
  "description": "Apply Now DESCRIPTION Brooklyn Center is hiring a Registered Nurse (RN) in Brooklyn, NY. We now offer Daily Pay through a trusted third-party provider...",
  "description_full": "Apply Now\n\nDESCRIPTION\nBrooklyn Center is hiring a Registered Nurse (RN) in Brooklyn, NY.\n\nWe now offer Daily Pay...",
  "description_html": "<h2><a href=\"https://click.appcast.io/t/RDLsrQb5...\" rel=\"nofollow\"><strong>Apply Now</strong></a></h2>...",
  "description_md": "## [Apply Now](https://click.appcast.io/t/RDLsrQb5...)\n\nDESCRIPTION\n\n**Brooklyn Center** is hiring...",
  "contact_emails": [],
  "contact_phones": [],
  "contact_urls": [],
  "apply_url": "https://click.appcast.io/t/RDLsrQb5Iyf9JI5xwuOjigrGDf6QnwJCQBfEqSLVyMssIVM23jHEsg_LbFPM1OwE?pid=3115741",
  "category": "jjj",
  "category_subcode": "hea",
  "is_telecommute": false,
  "is_paid": true,
  "has_image": false,
  "compensation_type": null,
  "ok_for_recruiters": null,
  "street_address": "170 Buffalo Ave",
  "postal_code": "11213",
  "full_address": "170 Buffalo Ave, Brooklyn, NY 11213, US",
  "latitude": 40.670937,
  "longitude": -73.93459,
  "google_maps_url": "https://www.google.com/maps/search/40.670937,-73.934590",
  "craigslist_reply_email": null,
  "search_query": null,
  "scraped_at": "2026-08-22T10:30:00Z"
}
```

### Pricing

| Event | Price |
|---|---|
| Actor start | $0.001 |
| SERP result (`includeJobDetails=false`) | $0.003 per job |
| Detail result (`includeJobDetails=true`) | $0.005 per job |

Typical cost: **$3 per 1,000 jobs** in SERP mode (title, city, location area, posted date, category). Detail mode ($5/1,000) adds full description in 4 formats, salary, contact emails and phones, company name, and apply URL.

**New to Apify?** Every account gets a $5 free monthly platform credit - enough for around 1,000 results before you pay anything.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `searchQueries` | array of strings | - | Keywords like `"software engineer"`, `"warehouse"`, `"delivery driver"`. Combine with `cities` to target specific metros. |
| `searchUrls` | array of strings | - | Direct Craigslist search URLs. Any city subdomain. |
| `startUrls` | array of strings | - | Direct Craigslist posting URLs for targeted scraping. |
| `cities` | array of strings | - | City slugs: `"newyork"`, `"sfbay"`, `"chicago"`, `"losangeles"`, `"seattle"`, `"boston"`, `"washingtondc"`, `"atlanta"`, `"miami"`, `"denver"`. Required when using searchQueries. |
| `categories` | array select | `["jjj"]` | `"jjj"` = employment jobs. `"ggg"` = gigs (short-term, freelance, hourly). |
| `includeJobDetails` | boolean | false | Fetch each posting page for full description, salary, contacts, and apply URL. Charges `job-detail-result`. |
| `includeCompanyDetails` | boolean | false | Extract company name and website from posting body (requires `includeJobDetails=true`). |
| `postedWithinDays` | integer | - | Only return postings from the last N days. Requires `includeJobDetails=true`. |
| `minSalary` | integer | - | Skip postings where disclosed salary falls below this USD amount. |
| `useRSS` | boolean | true | Use RSS feeds for SERP (faster, cleaner dates). Disable only if RSS parsing fails. |
| `maxResults` | integer | 5 | Total cap across all cities, queries, and categories. |
| `maxResultsPerQuery` | integer | 5 | Cap per city+keyword+category combination. |
| `maxConcurrency` | integer | 3 | Parallel detail page fetches (when `includeJobDetails=true`). |

### Output fields

**Identity**

- `id`: Craigslist 10-digit post ID
- `title`: job title as listed
- `job_url`, `source_url`: canonical Craigslist posting URL

**Company**

- `company_name`: extracted from posting body (Craigslist does not require posters to provide this)
- `company_website`: URL from posting body when poster includes it

**Location**

- `location`: display string combining city and area
- `country`: always `"US"` for US Craigslist sites
- `location_area`: Craigslist neighborhood or area tag (e.g. `"manhattan"`, `"east bay"`, `"downtown"`)
- `city_slug`: subdomain slug (e.g. `"newyork"`, `"sfbay"`)
- `city_name`: human-readable city name (e.g. `"New York City"`, `"SF Bay Area"`)
- `street_address`: street address extracted from schema.org JSON-LD (`"170 Buffalo Ave"`). Empty string when the listing has no structured address.
- `postal_code`: ZIP/postal code from JSON-LD (`"11213"`). Empty string when not present.
- `full_address`: concatenated full address from JSON-LD parts (`"170 Buffalo Ave, Brooklyn, NY 11213, US"`). Empty when no structured address.
- `latitude`: decimal latitude from schema.org GeoCoordinates JSON-LD (`40.670937`). Null when no geo data.
- `longitude`: decimal longitude from schema.org GeoCoordinates JSON-LD (`-73.934590`). Null when no geo data.
- `google_maps_url`: Google Maps search URL built from lat/lon (`"https://www.google.com/maps/search/40.670937,-73.934590"`). Empty when no coordinates.

**Job Details**

- `employment_type`: full-time, part-time, contract, temporary, internship, gig
- `salary_min`, `salary_max`: parsed salary bounds (when disclosed)
- `salary_currency`: always `"USD"` for US sites
- `salary_period`: year, month, week, hour
- `salary_text`: raw salary text as listed (e.g. `"$18-22/hr"`, `"DOE"`)

**Contact & Application** (available when `includeJobDetails=true`)

- `apply_url`: external application URL. Extracted first from the `"Apply Now"` link in the listing's JSON-LD description (covers ATS redirect links like appcast.io, Workable, Greenhouse), then falls back to regex patterns in the posting body. Null when the poster doesn't include a direct apply link.
- `craigslist_reply_email`: the `@job.craigslist.org` relay email shown when a user clicks the reply button on a listing. **Always null**: Craigslist reveals this address only via an AJAX call triggered by a button click; it is not present in the page HTML source. Included as a field for schema completeness.

**Recruiter policy** (available when `includeJobDetails=true`)

- `ok_for_recruiters`: nullable boolean. `true` when the poster explicitly marks the listing "OK for recruiters to contact this job poster". `false` when marked "Principals only. Recruiters, please don't contact this job poster". `null` when neither notice appears (most listings; poster did not state a preference).

**Craigslist-specific**

- `category`: `"jjj"` (jobs) or `"ggg"` (gigs)
- `category_subcode`: subcategory code from URL path (`"sof"` = software, `"adm"` = admin, `"hea"` = healthcare, `"ret"` = retail, etc.)
- `is_telecommute`: true when posting includes remote/telecommute flag
- `is_paid`: false for unpaid/volunteer gig listings
- `has_image`: true when posting includes photos
- `compensation_type`: free-text pay type field from posting attributes

**Description** (available when `includeJobDetails=true`)

- `description`: short plain-text snippet (~500 chars)
- `description_full`: full plain text with line breaks
- `description_html`: raw HTML from posting body
- `description_md`: Markdown rendering (headings, lists, links preserved)

**Contacts** (extracted from posting body, available when `includeJobDetails=true`)

- `contact_emails[]`: direct email addresses - many Craigslist posters include these
- `contact_phones[]`: phone numbers
- `contact_urls[]`: external URLs (job board self-references excluded)

**Meta**

- `posted_at_text`: raw date string from RSS or HTML
- `posted_at_datetime`: ISO 8601 UTC timestamp
- `search_query`, `scraped_at`

### Use with AI Agents

This actor is available as an MCP tool:

```
https://mcp.apify.com?tools=santamaria-automations/craigslist-jobs-scraper
```

Point any MCP-compatible agent at that URL to let it search and retrieve Craigslist job listings on demand across US cities.

### Why this scraper

- **Unique content**: small business, gig, hyper-local, and informal roles that never appear on Indeed or LinkedIn - Craigslist is where local employers post without needing corporate HR accounts
- **Contact info in body**: Craigslist posters frequently include direct email addresses and phone numbers in the posting body - this scraper extracts them for lead generation workflows
- **430+ US city subdomains**: federated structure means you can target exactly the markets you care about, from major metros to mid-size cities
- **RSS-first for reliability**: Craigslist's RSS feeds return clean ISO timestamps and structured titles without fragile CSS selectors
- **Gig market coverage**: the `/ggg/` category covers freelance, short-term, and informal work that no traditional job board indexes

### Common use cases

- Recruiter sourcing for hard-to-fill local roles (trades, hospitality, healthcare support) posted by small employers who don't use ATS platforms
- Gig platform aggregation and competitive monitoring across cities
- Hyper-local hiring market research by city and job category
- Lead generation from contact emails embedded in posting bodies
- Small business hiring intent signals (companies posting on Craigslist indicate active immediate hiring)

### Related Actors

**Fleet - international extraction**

- [Job Feed](https://apify.com/santamaria-automations/job-feed): normalized feed across 50+ international job boards, use alongside Craigslist for employer-brand roles
- [Career Site Jobs Scraper](https://apify.com/santamaria-automations/career-site-jobs-scraper): direct-from-career-pages extraction for companies that don't post on aggregators
- [Website Job Extractor](https://apify.com/santamaria-automations/website-job-extractor): any-website job extractor, works on any domain including smaller US job boards

**USA-focused peers**

- [Indeed Scraper](https://apify.com/santamaria-automations/indeed-scraper): largest US job aggregator; employer-brand and corporate postings that complement Craigslist's informal listings
- [LinkedIn Jobs Scraper](https://apify.com/santamaria-automations/linkedin-scraper): global job board with strong US coverage, structured company data and seniority levels
- [USAJobs Federal Scraper](https://apify.com/santamaria-automations/usajobs-federal-scraper): US federal government jobs with GS pay grades, agency, and series codes
- [SnagAJob Scraper](https://apify.com/santamaria-automations/snagajob-us-scraper): US hourly and local shift-work jobs, strong overlap with Craigslist's gig and retail categories
- [ZipRecruiter Scraper](https://apify.com/santamaria-automations/ziprecruiter-scraper): broad US job market across all sectors, fast-moving listings
- [Levels.fyi Scraper](https://apify.com/santamaria-automations/levels-fyi-scraper): US FAANG and tech-company roles with verified total-compensation data
- [WayUp Scraper](https://apify.com/santamaria-automations/wayup-us-scraper): US intern and entry-level jobs, complements Craigslist for campus recruiting

**Enrichment**

- [Website Email Scraper](https://apify.com/santamaria-automations/website-email-scraper): enrich Craigslist contact URLs with additional email addresses from company sites

### Support

Found an issue or have a question? Open a ticket via the [Issues tab](https://apify.com/santamaria-automations/craigslist-jobs-scraper/issues) or email contact@nanoscrape.com - we reply within 6 hours on business days.

# Actor input Schema

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

Keywords to search on Craigslist Jobs. Each entry runs as a separate search per city. Examples: 'software engineer', 'warehouse', 'delivery driver'. Combine with 'cities' to target specific metros.

## `searchUrls` (type: `array`):

Direct Craigslist search URLs to crawl. Any city subdomain works. Example: https://newyork.craigslist.org/search/jjj?query=nurse.

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

Direct Craigslist job posting URLs to scrape. Example: https://newyork.craigslist.org/mnh/sof/d/new-york-software-engineer/1234567890.html.

## `cities` (type: `array`):

Craigslist city slugs to search. Examples: 'newyork', 'sfbay', 'chicago', 'losangeles', 'seattle', 'boston', 'washingtondc', 'atlanta', 'miami', 'denver'. Required when using searchQueries.

## `categories` (type: `array`):

Craigslist job category codes. 'jjj' = standard employment jobs (default). 'ggg' = gigs (short-term, freelance, often hourly or per-task).

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

When enabled, fetches each posting page for full description, salary, contact emails/phones, company name, and apply URL. Charges the job-detail-result PPE event. Slower but returns complete data.

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

Extract company name and website URL from posting body when present. Requires includeJobDetails=true to be meaningful.

## `postedWithinDays` (type: `integer`):

Only return postings from the last N days. Leave empty for no date filter. Requires includeJobDetails=true (date only available on PDP).

## `minSalary` (type: `integer`):

Skip postings where a salary is listed and falls below this USD amount. Leave empty to include all.

## `useRSS` (type: `boolean`):

Use Craigslist RSS feeds (?format=rss) for listing pages. RSS is faster and returns cleaner ISO dates. Disable only if you encounter RSS parsing issues.

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

Total cap across all cities, queries and categories.

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

Maximum results per individual city+keyword+category combination.

## `maxConcurrency` (type: `integer`):

Maximum number of parallel requests (applies to detail page fetches when includeJobDetails=true).

## Actor input object example

```json
{
  "searchQueries": [
    "software engineer"
  ],
  "cities": [
    "newyork",
    "sfbay"
  ],
  "categories": [
    "jjj"
  ],
  "includeJobDetails": false,
  "includeCompanyDetails": false,
  "postedWithinDays": 7,
  "minSalary": 50000,
  "useRSS": false,
  "maxResults": 5,
  "maxResultsPerQuery": 5,
  "maxConcurrency": 3
}
```

# Actor output Schema

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

Dataset containing scraped Craigslist job and gig listings.

# 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": [
        "software engineer"
    ],
    "cities": [
        "newyork",
        "sfbay"
    ],
    "categories": [
        "jjj"
    ],
    "includeJobDetails": false,
    "includeCompanyDetails": false,
    "useRSS": false,
    "maxResults": 5,
    "maxResultsPerQuery": 5,
    "maxConcurrency": 3
};

// Run the Actor and wait for it to finish
const run = await client.actor("santamaria-automations/craigslist-jobs-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": ["software engineer"],
    "cities": [
        "newyork",
        "sfbay",
    ],
    "categories": ["jjj"],
    "includeJobDetails": False,
    "includeCompanyDetails": False,
    "useRSS": False,
    "maxResults": 5,
    "maxResultsPerQuery": 5,
    "maxConcurrency": 3,
}

# Run the Actor and wait for it to finish
run = client.actor("santamaria-automations/craigslist-jobs-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": [
    "software engineer"
  ],
  "cities": [
    "newyork",
    "sfbay"
  ],
  "categories": [
    "jjj"
  ],
  "includeJobDetails": false,
  "includeCompanyDetails": false,
  "useRSS": false,
  "maxResults": 5,
  "maxResultsPerQuery": 5,
  "maxConcurrency": 3
}' |
apify call santamaria-automations/craigslist-jobs-scraper --silent --output-dataset

```

## MCP server setup

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