# Craigslist Scraper \[$5/1k💰] | Jobs | Housing | Cars (`ahmed_jasarevic/craigslist-scraper`) Actor

Scrape Craigslist listings for jobs, housing, used cars, and for-sale items. Extract title, price, location, images, contact info, and posting dates as structured JSON or CSV data for lead generation, rental price monitoring, and market research.

- **URL**: https://apify.com/ahmed\_jasarevic/craigslist-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 $4.97 / 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

## Craigslist Scraper & API Alternative — Jobs, Housing, Used Cars & For-Sale Data

Extract structured Craigslist listings data — title, price, location, posting date, images, full
description, and published contact info — from any US city, then export to JSON, CSV, or Excel for rental
price monitoring, used-car market research, job market analysis, and lead generation. Craigslist has no
official API, so this actor is the fastest way to get clean Craigslist data programmatically.

### Main Use Cases

- **Rental price monitoring & housing market research** — track asking rents, bedrooms, bathrooms, pet
  policy, and geo-coordinates for apartments in any city, and spot rent trends over time.
- **Used car price tracking & vehicle market data** — collect cars & trucks listings with price, images,
  location, and mileage attributes to benchmark used-vehicle values.
- **Craigslist lead generation** — extract gig and services postings with published contact info (email /
  phone from the print section) for local lead-gen outreach.
- **Job market research & recruiting intelligence** — pull job postings with employer name, employment
  type, compensation, valid-through dates, and location in bulk.
- **Deal sourcing & flipping** — monitor for-sale listings with price, photos, and seller location to find
  underpriced items; combine with `&sort=priceasc` or `&postedToday=1` URL filters.
- **Market-wide dataset building** — run multiple search URLs (different cities/categories) in one crawl
  and download a structured, deduplicated Craigslist dataset for analysis or ML.

### How It Works

1. You provide one or more **Craigslist search URLs** or **direct posting URLs** — any city, any category,
   any filter. All URL parameters (price range, pet-friendly, posted-today, sort order) pass through as-is.
2. The actor parses each static search page for listing titles, prices, locations, and detail-page URLs.
3. For every listing it fetches the detail page and extracts Craigslist's embedded `ld_posting_data`
   JSON-LD structured data (jobs: `JobPosting`; housing: apartment/house schema; for-sale: `Product`),
   falling back to HTML selectors when JSON-LD is unavailable.
4. Results are normalized — images to 600x450 and deduplicated, prices as display strings, dates as ISO
   timestamps — and pushed to your dataset, ready for API access or CSV/Excel export.

No browser, no login, no CAPTCHA solving. Plain HTTP via CheerioCrawler — fast, cheap, and reliable.

### Monitor Craigslist Rental Prices for Housing Market Research

Housing listings return category-specific structured fields that generic scrapers miss:

| Field | Type | Notes |
|---|---|---|
| `numberOfBathroomsTotal` | `number` | From JSON-LD |
| `petsAllowed` | `boolean` | Pet policy from JSON-LD |
| `attributes` | `object` | Bedrooms, sqft, laundry, parking, etc. from the HTML attrgroup |
| `latitude` / `longitude` | `string` | Geo-coordinates for mapping |

Example: `https://www.craigslist.org/search/area/sfbay?cat=apa` — append `&min_bedrooms=2`,
`&pets_dog=1&pets_cat=1`, or `&postedToday=1` for custom monitoring feeds. Rental-housing researchers
routinely use Craigslist as their primary listing source (e.g. the 2017 Boeing & Waddell study of
11 million US Craigslist rental listings) — this actor makes that data collection repeatable.

### Track Used Car Prices and Vehicle Listings

Cars & trucks listings include `Product` JSON-LD with `offers.price` and `priceCurrency`, plus images,
location, and full descriptions — the raw material for used-car price comparison and value-tracking
datasets. Example: `https://www.craigslist.org/search/area/sfbay?cat=cta`.

### Scrape Craigslist Job Postings With Employer and Employment Type

Job postings include fields most generic scrapers don't extract:

| Field | Source | Notes |
|---|---|---|
| `hiringOrganization` | JSON-LD `JobPosting` | Employer name |
| `employmentType` | JSON-LD `JobPosting` | FULL\_TIME, PART\_TIME, etc. |
| `validThrough` | JSON-LD `JobPosting` | Posting expiry date |
| `price` | HTML / JSON-LD | Compensation (often `"$0"` for jobs) |

Example: `https://www.craigslist.org/search/area/sfbay?cat=jjj`.

### Find Craigslist For-Sale Deals for Flipping and Resale Arbitrage

For-sale listings give you price, images, location, and full body text. Mix URL filters to find
undervalued items: `&sort=priceasc`, `&max_price=500`, `&min_price=100`, `&hasPic=1`. Example:
`https://www.craigslist.org/search/area/sfbay?cat=sss`.

### Generate Local Leads From Craigslist Gigs and Services

Gigs and services listings include title, description, and location. When posters publish their contact
info in the print section, the actor extracts it (`contactInfo` field).

| Category | URL segment |
|---|---|
| Gigs (labor, computer, creative, domestic, etc.) | `?cat=ggg` |
| Services (automotive, beauty, computer, etc.) | `?cat=bbb` |
| Free stuff | `?cat=zip` |

### Input

| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
| `startUrls` | `array<{url}>` | Yes | — | Craigslist search URLs or direct posting URLs. Any city, category, or filter. |
| `maxItems` | `integer` | No | `50` | Max detail pages to scrape (1–500). **Free accounts are capped at 10.** |
| `maxConcurrency` | `integer` | No | `3` | Concurrent requests (1–10). Keep at 2–5 to avoid rate-limiting. |
| `maxRequestsPerCrawl` | `integer` | No | `100` | Hard cap on total HTTP requests incl. search pages (1–1000). |
| `proxyConfiguration` | `object` | No | `{ "useApifyProxy": true }` | Apify proxy settings. US residential recommended for large runs. |

### Output

Each dataset item is one Craigslist posting with these fields:

| Field | Type | Description |
|---|---|---|
| `title` | `string` | Posting title |
| `price` | `string` | Price or compensation (e.g. `"$350.00"`, `"$0"` for jobs) |
| `location` | `string` | City, state, postal code (e.g. `"Emeryville, CA, 94662"`) |
| `postingDate` | `string` | ISO timestamp of when the posting was published |
| `url` | `string` | Direct link to the listing |
| `category` | `string` | Craigslist category (jobs, housing, for sale, gigs, services) |
| `images` | `string[]` | Array of image URLs (normalized to 600x450, deduplicated) |
| `bodyText` | `string` | Full posting description text |
| `contactInfo` | `string` | Email/phone from the print section (often null — see FAQ) |
| `postingId` | `string` | Craigslist post ID |
| `searchTitle` | `string` | Title as shown on the search results page |
| `latitude` / `longitude` | `string` | Geo-coordinates when available in JSON-LD |
| `hiringOrganization` | `string` | Employer name (jobs only) |
| `employmentType` | `string` | FULL\_TIME, PART\_TIME, etc. (jobs only) |
| `validThrough` | `string` | Posting expiry date (jobs only) |
| `numberOfBathroomsTotal` | `number` | Bathrooms (housing only) |
| `petsAllowed` | `boolean` | Pet policy (housing only) |
| `attributes` | `object` | Category-specific attributes: bedrooms, sqft, laundry, parking, etc. |
| `priceCurrency` | `string` | Currency code (for-sale `Product` listings) |
| `ldType` | `string` | JSON-LD `@type`: `JobPosting`, `Product`, `Apartment`, etc. |
| `ldData` | `object` | Full JSON-LD structured-data blob as returned by Craigslist |

### Example Input

```json
{
  "startUrls": [
    { "url": "https://www.craigslist.org/search/area/sfbay?cat=apa&min_bedrooms=2" },
    { "url": "https://www.craigslist.org/search/area/sfbay?cat=cta&max_price=15000" }
  ],
  "maxItems": 50,
  "maxConcurrency": 3,
  "maxRequestsPerCrawl": 100
}
```

### Example Output

```json
{
  "title": "vintage fiberglass Eames chair, Gray and Parchment,1950s",
  "price": "$350.00",
  "location": "Emeryville, CA, 94662",
  "postingDate": "2026-08-08T12:59:09-0700",
  "url": "https://www.craigslist.org/view/d/emeryville-vintage-fiberglass-eames/tCUrwRGUps5yCBfVhYRc3f",
  "category": "for sale",
  "images": [
    "https://images.craigslist.org/00e0e_fOPQDEQBI7j_0lO0t2_600x450.jpg",
    "https://images.craigslist.org/00M0M_Jqu4UmLmVF_0t20t2_600x450.jpg"
  ],
  "bodyText": "One remaining from the pair previously listed. Mid-1950s c.1955-57 Herman Miller DAX-1 chair...",
  "contactInfo": null,
  "postingId": "7952375424",
  "latitude": "37.836500",
  "longitude": "-122.280400",
  "hiringOrganization": null,
  "employmentType": null,
  "attributes": {},
  "ldType": "Product",
  "ldData": {
    "@type": "Product",
    "name": "vintage fiberglass Eames chair, Gray and Parchment,1950s",
    "offers": { "price": "350.00", "priceCurrency": "USD" }
  },
  "searchTitle": null
}
```

### Integrations & Automation

- **API access**: call this actor programmatically via the [Apify API](https://docs.apify.com/api/v2) from
  any script or backend — it acts as an unofficial Craigslist API.
- **Scheduling**: set a daily or weekly schedule to monitor rental prices, used-car prices, or new
  listings automatically. Recurring runs also let you build time-series price datasets that stay fresh.
- **Webhooks**: get notified whenever a run finishes and a new dataset is ready.
- **Zapier / Make**: connect Craigslist data to your CRM, spreadsheet, or alert system via no-code integrations.
- **Dataset export**: download JSON, CSV, Excel, HTML, or XML — or stream via the API into a data warehouse.

**Recurring-use tip**: run daily for price/listing monitoring in your target cities — CheerioCrawler keeps
runs cheap, and the dataset records new entries over time.

### Related Actors

| Actor | Why it's related | Link |
|---|---|---|
| Facebook Marketplace Scraper | Largest social marketplace — the main Craigslist alternative for local listings data | [apify.com/apify/facebook-marketplace-scraper](https://apify.com/apify/facebook-marketplace-scraper) |
| Indeed Scraper | Widely used job listings scraper (28K+ users) — complements Craigslist job data | [apify.com/misceres/indeed-scraper](https://apify.com/misceres/indeed-scraper) |
| Airbnb Scraper & Market Monitor | Rental/accommodation price monitoring in the same housing-data cluster | [apify.com/ahmed\_jasarevic/airbnb-scraper-listings-prices-hosts](https://apify.com/ahmed_jasarevic/airbnb-scraper-listings-prices-hosts) |
| eBay Scraper | Sold-price tracking for resale/arbitrage research on the same audience | [apify.com/ahmed\_jasarevic/ebay-scraper](https://apify.com/ahmed_jasarevic/ebay-scraper) |
| Vinted Arbitrage Scraper | Cross-country price comparison — adjacent deal-sourcing workflow | [apify.com/ahmed\_jasarevic/vinted-cross-country-arbitrage-scraper](https://apify.com/ahmed_jasarevic/vinted-cross-country-arbitrage-scraper) |

### Frequently Asked Questions

#### Does Craigslist have an official API?

No. Craigslist does not provide a public API. This actor acts as an **unofficial Craigslist API**: you
provide any Craigslist search URL and get structured JSON back. No Craigslist account, API key, or login
is needed on the Craigslist side.

#### Why use this actor instead of the official API?

Because there is no official Craigslist API, and no official data export for third parties. Using this
actor saves you from maintaining your own scraper (selector maintenance, pagination, rate limiting) and
gives you category-specific fields — employer and employment type for jobs, bedrooms/bathrooms/pets for
housing, price currency for for-sale — that most generic tools don't extract.

#### How do I scrape Craigslist without getting blocked?

Keep `maxConcurrency` at 2–5, use the Apify proxy (US residential for large runs — Craigslist is known to
block datacenter IPs), and don't hammer the site with frequent large crawls. This actor uses CheerioCrawler
(plain HTTP, no browser), which is lighter on Craigslist's servers than browser-based scrapers.

#### Is scraping Craigslist legal?

This is your responsibility to evaluate. Craigslist's [Terms of Use](https://www.craigslist.org/about/terms.of.use)
expressly prohibit collection of content via "robots, spiders, scripts, scrapers, crawlers, or any automated
or manual equivalent," and Craigslist has enforced this in litigation. This actor only accesses publicly
available pages (no login bypass, no CAPTCHA solving) and is intended for research and business use — but
you should review Craigslist's ToS and applicable law before running it. See the [Legal & Compliance Defense](#legal--compliance-disclaimer) below.

#### What is the best way to extract Craigslist data to CSV/Excel?

Run this actor with your search URLs, then download the finished dataset as CSV, Excel, or JSON from the
Apify Console — or pull it via the Apify API into your own pipeline. There are also ready integrations
for Zapier and Make.

#### How much does it cost to scrape Craigslist?

Pay-per-event pricing:

- **$0.0005** per actor start
- **$0.005** per result (dataset item) — about **$5 per 1,000 listings**, full detail fields included

A 100-listing run costs roughly $0.50. Free Apify accounts get a capped preview (10 items per run).
Pricing is slightly lower on higher Apify plans.

#### Why does contactInfo come back as null most of the time?

Craigslist hides most contact details behind a reply button. Email/phone is only visible in the print
section when the poster chooses to publish it directly. This is a Craigslist design limitation, not a bug.
When present, the actor returns it as `email: ...` / `phone: ...`.

#### Can I pass Craigslist filters like price range, pet-friendly, or sort order?

Yes — any Craigslist URL filter works. Just include it in your search URL: `&min_price=500&max_price=2000`,
`&pets_dog=1`, `&postedToday=1`, `&sort=priceasc`, `&hasPic=1`. The actor passes all URL parameters through
unchanged.

#### How does this compare to other Craigslist scrapers?

See the capability table in [Competitive Positioning](#competitive-positioning) below — the short version:
this actor extracts detail-page fields (category-specific JSON-LD, contact info when published, geo
coordinates) that many Craigslist tools skip, and it accepts any search URL instead of fixed dropdowns.

#### What are the alternatives to this actor / to Craigslist data sources?

For listing data: the [Facebook Marketplace Scraper](https://apify.com/apify/facebook-marketplace-scraper)
covers the largest Craigslist alternative, and the [Indeed Scraper](https://apify.com/misceres/indeed-scraper)
is the popular choice for structured job data. For housing data specifically, Airbnb/rental-portal scrapers
(see Related Actors) complement Craigslist, which remains the most-used US rental listing source. For
buying-and-selling platforms in general, OfferUp, eBay, and Nextdoor are the usual Craigslist alternatives.

#### How do I monitor new Craigslist listings automatically?

Use the Apify **Schedule** feature: run the actor every 15–30 minutes (jobs/gigs, high turnover) or daily
(housing/cars), and use webhooks or Zapier/Make to alert on new items. Each run's dataset records the
posting date, so you can diff runs for "new since last time".

### Competitive Positioning

Verified against live competitor pages and this actor's source (see keyword-research.md for method):

| Capability | Typical Craigslist scrapers | This actor |
|---|---|---|
| Input | Fixed city/category/query dropdowns | Any Craigslist search URL, all filters preserved |
| Price extraction | Display string only | Display string + currency code from `Product` JSON-LD |
| Job fields | Title/price/location only | `hiringOrganization`, `employmentType`, `validThrough` |
| Housing fields | Rarely | Beds/baths/pets via attrgroup + JSON-LD bathroom/pet fields |
| Geo-coordinates | Often only on search cards | Latitude/longitude from detail-page JSON-LD |
| Contact info | Rare | Email/phone from print section when posted publicly |
| Extraction robustness | HTML selectors only | JSON-LD `ld_posting_data` + HTML fallback |
| Images | Raw URLs | Normalized 600x450, deduplicated |

### For AI Agents & LLM Apps

**Purpose**: Extract structured Craigslist listing data (title, price, location, images, description,
contact info) from any Craigslist search URL or direct posting URL. Returns JSON dataset items — one per
listing — via the Apify API.

**Minimal input**:

```json
{
  "startUrls": [
    { "url": "https://www.craigslist.org/search/area/sfbay?cat=sss" }
  ],
  "maxItems": 50
}
```

**Variant — direct posting URL** (no search page, extracts that single listing):

```json
{
  "startUrls": [
    { "url": "https://sfbay.craigslist.org/eby/for/d/emeryville-vintage-fiberglass-eames/7952375424.html" }
  ],
  "maxItems": 5
}
```

**Output fields**: `title`, `price`, `location`, `postingDate`, `url`, `category`, `images`, `bodyText`,
`contactInfo`, `postingId`, `searchTitle`, `latitude`, `longitude`, `hiringOrganization`,
`employmentType`, `validThrough`, `numberOfBathroomsTotal`, `petsAllowed`, `attributes`,
`priceCurrency`, `ldType`, `ldData`.

**Behaviors an agent should know**:

- A URL containing `/search/` is auto-treated as a search page; any other URL is treated as a direct
  posting detail page. Both work in `startUrls`.
- **Free accounts are capped at 10 results** regardless of `maxItems`. Paid accounts get the full cap.
- `maxRequestsPerCrawl` caps total HTTP requests (search pages + detail pages). If it's too low relative
  to `maxItems`, the run may stop before reaching the item cap — raise it for large runs.
- `contactInfo` is usually `null` — Craigslist hides contact behind a reply button; only posters who
  publish info in the print section are captured.
- `price` is always a string (e.g. `"$350.00"`), never a number.
- Images are normalized to 600x450 and deduplicated.
- `maxConcurrency` is used as-is: keep 2–5 to avoid rate limiting. Enable the proxy / US residential for
  large runs.

**Billing**: PAY\_PER\_EVENT — $0.0005 per start + $0.005 per result (≈ $5 per 1,000 results).

### Legal & Compliance Disclaimer

This actor is independent and is not affiliated with, endorsed by, or sponsored by Craigslist, Inc.

This actor accesses only publicly available Craigslist pages — it performs no login, no CAPTCHA solving,
and no authenticated sessions. It makes standard HTTP requests to pages that are openly accessible without
a Craigslist account.

Craigslist's Terms of Use prohibit automated access to its site. Users are responsible for their own
compliance with Craigslist's Terms of Service and applicable law, and for any data they collect or republish.
Where personal contact data is captured (when posters publish it), users should not use it for unsolicited
commercial outreach in violation of applicable law (e.g. CAN-SPAM, GDPR, CCPA, TCPA). This section is not
legal advice.

### SEO Keywords

craigslist scraper, scrape craigslist listings, craigslist api, craigslist api alternative, how to scrape craigslist, craigslist rental price monitoring, craigslist housing market data, craigslist used car price data, craigslist job postings data, craigslist lead generation, craigslist email and phone extraction, craigslist for sale scraper, craigslist gigs and services scraper, craigslist to csv, craigslist data export, craigslist mcp, scrape craigslist without getting blocked, does craigslist have an api, craigslist new york scraper, craigslist san francisco bay area scraper, craigslist los angeles scraper, craigslist chicago scraper, craigslist seattle scraper, facebook marketplace scraper vs craigslist, craigslist alternatives

# Actor input Schema

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

Craigslist search URLs or posting URLs. Use search URLs like https://www.craigslist.org/search/area/sfbay?cat=jjj or direct posting URLs.

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

Maximum number of posting detail pages to scrape. This caps the total number of full listings extracted.

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

Maximum number of concurrent requests to Craigslist. Keep low (2-5) to avoid rate limiting.

## `maxRequestsPerCrawl` (type: `integer`):

Hard cap on total HTTP requests (search pages + detail pages combined).

## `proxyConfiguration` (type: `object`):

Proxy settings. Craigslist may rate-limit or block datacenter IPs. Residential proxy recommended for large runs.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.craigslist.org/search/area/sfbay?cat=jjj"
    },
    {
      "url": "https://www.craigslist.org/search/area/sfbay?cat=apa"
    },
    {
      "url": "https://www.craigslist.org/search/area/sfbay?cat=sss"
    }
  ],
  "maxItems": 50,
  "maxConcurrency": 3,
  "maxRequestsPerCrawl": 100,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "startUrls": [
        {
            "url": "https://www.craigslist.org/search/area/sfbay?cat=jjj"
        },
        {
            "url": "https://www.craigslist.org/search/area/sfbay?cat=apa"
        },
        {
            "url": "https://www.craigslist.org/search/area/sfbay?cat=sss"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("ahmed_jasarevic/craigslist-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 = { "startUrls": [
        { "url": "https://www.craigslist.org/search/area/sfbay?cat=jjj" },
        { "url": "https://www.craigslist.org/search/area/sfbay?cat=apa" },
        { "url": "https://www.craigslist.org/search/area/sfbay?cat=sss" },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("ahmed_jasarevic/craigslist-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 '{
  "startUrls": [
    {
      "url": "https://www.craigslist.org/search/area/sfbay?cat=jjj"
    },
    {
      "url": "https://www.craigslist.org/search/area/sfbay?cat=apa"
    },
    {
      "url": "https://www.craigslist.org/search/area/sfbay?cat=sss"
    }
  ]
}' |
apify call ahmed_jasarevic/craigslist-scraper --silent --output-dataset

```

## MCP server setup

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