# Craigslist Housing Scraper (`lentic_clockss/craigslist-housing-scraper`) Actor

Scrape Craigslist apartments, rooms, sublets, vacation rentals, and real estate listings. Extract price, beds, baths, photos, and detail data — no login or API key.

- **URL**: https://apify.com/lentic\_clockss/craigslist-housing-scraper.md
- **Developed by:** [kane liu](https://apify.com/lentic_clockss) (community)
- **Categories:** Real estate, Lead generation, Automation
- **Stats:** 1 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## What's an Apify Actor?

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

## How to integrate an Actor?

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

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

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

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

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

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

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

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

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

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

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


# README

## Craigslist Housing Scraper

**Scrape Craigslist apartments, rooms, sublets, vacation rentals, and real estate listings into a clean dataset — no login, no API key, no browser farm.**

> Architecture: thin Apify Actor → **craigslist-com** Cloud Run worker (HTTPS + API key).  
> Worker URL is config (`WORKER_BASE_URL`), not hardcoded-only — migrate the worker by updating Actor env without a code change. Set `WORKER_PROVIDES_PROXY=1` when the worker supplies its own `PROXY_URL`.

- Search any Craigslist area slug (`austin`, `sfbay`, `newyork`, …) across **all housing categories**
- Pull **price, beds, baths, sqft, photos, geo, and posting URLs** from Craigslist search results
- Optionally enrich from **public detail pages** (JSON-LD, attributes, map address, full image lists)
- Go beyond Craigslist’s **360-result search cap** with automatic sort/price sharding
- Pay only for what you use: **$0.005 per run + $2.00 per 1,000 listings** (plus platform usage)

Craigslist does not offer a public housing API for third-party apps. This Actor reads the same public search and listing pages people browse on [Craigslist](https://www.craigslist.org/) and returns structured rows you can export as JSON, CSV, or Excel — or pipe into Sheets, Make, n8n, Zapier, and AI agents.

---

### What does the Craigslist Housing Scraper do?

This Actor is a **Craigslist apartments scraper** and broader **Craigslist housing data extractor**. Give it one or more area slugs, pick a housing category (or `all`), set how many listings you want, and it returns structured posting data from Craigslist search — with optional detail-page enrichment.

It is useful when you need:

- Rent and sale inventory snapshots for a city
- Room / share / sublet monitoring
- Vacation rental and parking / office commercial scans
- A Craigslist API alternative for housing research workflows

---

### What you can scrape from Craigslist housing

#### 1. Scrape Craigslist apartments for rent

Monitor apartments and housing-for-rent (`apa`) in a target market. Filter by price, bedrooms, bathrooms, photos, or “posted today”, then download a table of listings.

#### 2. Collect rooms, shares, and sublets

Use `roo` (rooms & shares) or `sub` (sublets & temporary) to track shared housing and short-term inventory without manually refreshing search pages.

#### 3. Pull real estate for sale and vacation rentals

Scrape `rea` (real estate for sale), owner/broker shortcuts (`reo` / `reb`), or `vac` vacation rentals for market research and lead lists.

#### 4. Cover every housing category in one run

Set `category` to `all` to sample across apartments, swaps, offices, parking, sale, rooms, sublets, vacation, and wanted categories with a fair per-category quota.

#### 5. Feed housing data into AI or automation tools

Ask an AI assistant to “scrape Craigslist apartments in Austin under $2,000” — or schedule the Actor in Apify and push results into Sheets, CRM, or alerting workflows.

---

### How to scrape Craigslist housing listings

1. Open the Actor in Apify Console.
2. Enter one or more Craigslist **area slugs** (for example `austin`).
3. Choose a **housing category** (default: apartments / housing for rent).
4. Set **Max listings** and whether to enrich from detail pages.
5. Click **Start** and download the dataset as JSON, CSV, or Excel.

#### Free Apify plan limits (set by this Actor's developer)

| Limit | Free Apify plan | Paid Apify plan |
| --- | --- | --- |
| Runs of this Actor | **10 runs total** | Unlimited |
| Listings per run (`maxItems`) | **Up to 1,000** | Up to 2,000 |

These caps are enforced by the Actor developer (not Apify platform errors). When you hit the 10-run limit, the run finishes gracefully with a clear status message asking you to upgrade.

<details>
<summary>For developers: JSON input example</summary>

```json
{
  "locations": ["austin"],
  "category": "apa",
  "maxItems": 20,
  "scrapeDetails": true,
  "hasPic": true,
  "sort": "date"
}
````

</details>

***

### Input

| Field | Type | Default | Description |
| --- | --- | --- | --- |
| `locations` | string\[] | `["austin"]` | Craigslist area slugs used in search URLs |
| `category` | string | `apa` | Housing category code, or `all` |
| `purveyor` | string | *(all)* | For sale: blank / `owner` / `dealer` |
| `query` | string | — | Optional keyword query |
| `minPrice` / `maxPrice` | integer | — | Price / rent bounds |
| `minBedrooms` / `maxBedrooms` | integer | — | Bedroom filters |
| `minBathrooms` / `maxBathrooms` | integer | — | Bathroom filters (SAPI) |
| `hasPic` | boolean | `false` | Only listings with photos |
| `postedToday` | boolean | `false` | Only postings published today |
| `sort` | string | `date` | `date`, `dateoldest`, `priceasc`, `pricedsc` |
| `startUrls` | request list | — | Optional search or detail URLs |
| `maxItems` | integer | `50` | Max listings (1–2000); free users capped at 1,000/run + 10 runs total |
| `scrapeDetails` | boolean | `true` | Enrich from public detail pages |
| `maxDetailConcurrency` | integer | `5` | Parallel detail fetches (1–15) |
| `imageSize` | string | `600x450` | Search image size suffix |
| `requestDelayMillis` | integer | `250` | Politeness delay between requests |
| `proxyConfiguration` | object | proxy off | Optional Apify Proxy |

***

### Output

Each dataset item is one Craigslist housing posting. Core fields include:

| Field | Description |
| --- | --- |
| `postingId` | Craigslist posting ID |
| `title` | Listing title |
| `price` | Numeric price when available |
| `category` | Housing category code |
| `location` / `city` | Area / city signals |
| `bedrooms` / `bathrooms` / `sqft` | Unit facts when present |
| `url` | Public listing URL |
| `postedAt` | Posting timestamp when available |
| `source` | Always `craigslist` |
| images / geo / detail fields | Present when search or detail enrichment provides them |

Key-value store artifacts:

- `INPUT_ECHO` — normalized public input
- `RUN_SUMMARY` (and `SUMMARY`) — run stats and shard notes
- `ERROR_SUMMARY` — written when the run fails

Empty result sets fail the run (`NoRowsCollectedError`) so schedules and automations do not silently succeed with zero rows.

<details>
<summary>Example output row</summary>

```json
{
  "source": "craigslist",
  "sourceLayer": "detail",
  "postingId": "1234567890",
  "title": "Sunny 2BR near downtown",
  "price": 1850,
  "category": "apa",
  "bedrooms": 2,
  "bathrooms": 1,
  "sqft": 900,
  "city": "Austin",
  "url": "https://austin.craigslist.org/apa/d/sunny-2br/1234567890.html",
  "postedAt": "2026-07-17T12:00:00.000Z"
}
```

</details>

***

### Housing categories supported

| Code | Meaning |
| --- | --- |
| `apa` | Apartments / housing for rent |
| `swp` | Housing swap |
| `off` | Office & commercial |
| `prk` | Parking & storage |
| `rea` | Real estate for sale |
| `roo` | Rooms & shares |
| `sub` | Sublets & temporary |
| `vac` | Vacation rentals |
| `hou` | Wanted: apts / housing |
| `hsw` | Wanted: all housing |
| `sha` | Wanted: room / share |
| `reo` | Sale by owner shortcut → `rea` + owner |
| `reb` | Sale by broker shortcut → `rea` + dealer |
| `all` | All housing categories above |

***

### How the Craigslist scraper works

The Actor is **HTTP-first** (`got-scraping` + Cheerio):

1. Primary search via Craigslist SAPI `/web/v8/postings/search/full`
2. Optional public detail HTML enrichment (JSON-LD, attributes, map, images)
3. Optional Apify Proxy when you enable it in input
4. **Never** calls Craigslist `/reply` contact endpoints

SAPI `/full` returns at most **360** rows per request and does not expose a reliable offset. When `maxItems > 360`, the Actor automatically shards across alternate sorts (`dateoldest`, price asc/desc) and **category-aware** price buckets (rent vs sale vs commercial) to collect more unique postings. For `category=all`, unused per-category quota is refilled on a second pass.

***

### Pricing

Pay per event:

| Event | Price |
| --- | --- |
| Actor start (`apify-actor-start`) | **$0.005** per run |
| Result (`apify-default-dataset-item`) | **$2.00 / 1,000** listings |

Users also pay Apify **platform usage costs** for the run (compute and any Apify Proxy usage you enable).

Examples:

- 50 enriched apartment listings ≈ `$0.005 + (50 × $0.002)` = **$0.105** in Actor events (plus platform usage)
- 1,000 listings ≈ `$0.005 + $2.00` = **$2.005** in Actor events (plus platform usage)

**Free Apify plan:** up to **10 runs** of this Actor and **1,000 listings per run**. Upgrade to a paid Apify plan for unlimited runs (schema max still applies). Limits set by the Actor developer.

***

### Tips for better Craigslist housing data

- Start with a real area slug from the Craigslist site URL (`/search/area/{slug}`).
- Keep `scrapeDetails=true` when you need bathrooms, body text, map address, or full image lists.
- Raise `maxItems` above 360 only when you need deeper coverage; sharding fetches more pages.
- Enable residential proxy if your network path is blocked from `sapi.craigslist.org`.
- Prefer smaller scheduled runs (for example posted-today + modest `maxItems`) over giant one-off dumps.

***

### FAQ

#### Why am I limited to 10 runs / 1,000 listings on the free plan?

Those limits are set by this Actor's developer for free Apify plan users (not an Apify platform bug). Upgrade to a paid Apify plan for unlimited runs of this Actor. Event pricing (PPE) is separate from these free-tier caps.

#### Can I scrape Craigslist apartments without an API key?

Yes. This Actor uses public Craigslist search and listing pages. You do not need a Craigslist API key or account login.

#### Does this scrape Craigslist contact / reply info?

No. The Actor does not call Craigslist `/reply` endpoints. It only reads public search and detail content.

#### Why do I sometimes get fewer than `maxItems`?

Craigslist may simply have fewer matching postings for your area, category, and filters. The Actor fails only when it collects **zero** rows.

#### How do I scrape more than 360 Craigslist results?

Set `maxItems` above 360. The Actor shards across alternate sorts and price buckets because SAPI `/full` has no true offset pagination.

#### Can I scrape all Craigslist housing categories at once?

Yes. Set `category` to `all`. The Actor splits the `maxItems` budget fairly across categories.

#### Is there a Live-view / Standby API?

Yes, but it is **metadata only**. Standby exposes discovery endpoints (`/`, `/health`, `/input-example`, `/openapi.json`) and does **not** scrape Craigslist or return listings. Full scraping still runs as a normal Apify Actor batch run so listings land in the default dataset.

***

### Integrations

- **Apify API / SDK** — start runs and fetch the dataset programmatically
- **Schedules** — daily or hourly housing monitors
- **Make, n8n, Zapier** — push new listings into Sheets, Slack, or CRM
- **MCP / AI agents** — use the Actor as a Craigslist housing data tool

***

### Limitations

- Public listings only; no private or authenticated Craigslist data
- Contact/reply endpoints are intentionally out of scope
- Result volume depends on live Craigslist inventory and filters
- Very large `maxItems` values take longer because of sharding and politeness delays

***

### Related searches

Craigslist apartments scraper · Craigslist housing scraper · Craigslist rooms for rent scraper · Craigslist real estate scraper · Craigslist vacation rentals data · Craigslist API alternative for housing

# Actor input Schema

## `locations` (type: `array`):

Craigslist area slugs used in /search/area/{slug}, e.g. austin, sfbay, newyork.

## `category` (type: `string`):

Housing category. Use "all" to scrape every housing-related category. Shortcuts reo/reb map to real-estate by owner/broker.

## `purveyor` (type: `string`):

Only used for real estate for sale. Leave blank for all, owner for by-owner, dealer for by-broker.

## `query` (type: `string`):

Optional Craigslist keyword query.

## `minPrice` (type: `integer`):

Optional minimum price / rent.

## `maxPrice` (type: `integer`):

Optional maximum price / rent.

## `minBedrooms` (type: `integer`):

Optional minimum bedroom count.

## `maxBedrooms` (type: `integer`):

Optional maximum bedroom count.

## `minBathrooms` (type: `integer`):

Optional minimum bathroom count (SAPI filter).

## `maxBathrooms` (type: `integer`):

Optional maximum bathroom count (SAPI filter).

## `hasPic` (type: `boolean`):

Filter search results to postings that have at least one photo.

## `postedToday` (type: `boolean`):

Filter search results to postings published today.

## `sort` (type: `string`):

Craigslist search sort. When maxItems > 360, the actor also shards across alternate sorts/price buckets because SAPI /full has no true offset pagination.

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

Optional Craigslist search URLs or detail URLs. Search URLs override category/location for that URL. Detail URLs are fetched directly.

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

Maximum listings to save (1–2000). Each SAPI request returns up to 360 rows; values above 360 automatically enable sort/price sharding. Free Apify plan users are capped at 1,000 listings per run and 10 total runs of this Actor — limits set by the Actor developer.

## `scrapeDetails` (type: `boolean`):

Fetch public listing detail pages for body text, attributes, JSON-LD, map address, bathrooms, and full images. Does not access /reply contact endpoints.

## `maxDetailConcurrency` (type: `integer`):

Maximum number of public detail pages fetched in parallel when enrichment is enabled.

## `imageSize` (type: `string`):

Image size suffix used when constructing SAPI image URLs.

## `requestDelayMillis` (type: `integer`):

Politeness delay applied before search shards and detail-page requests.

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

Optional Apify Proxy. Leave enabled residential/US if you hit blocks; default path works without proxy. Set Actor env WORKER\_PROVIDES\_PROXY=1 when the Cloud Run worker supplies its own PROXY\_URL.

## `workerBaseUrl` (type: `string`):

Override the Cloud Run worker origin for this run. Defaults to Actor env WORKER\_BASE\_URL. Production migrations should update WORKER\_BASE\_URL in Actor settings (no code change).

## Actor input object example

```json
{
  "locations": [
    "austin"
  ],
  "category": "apa",
  "purveyor": "",
  "hasPic": false,
  "postedToday": false,
  "sort": "date",
  "startUrls": [
    {
      "url": "https://www.craigslist.org/search/area/austin?cat=apa"
    }
  ],
  "maxItems": 50,
  "scrapeDetails": true,
  "maxDetailConcurrency": 5,
  "imageSize": "600x450",
  "requestDelayMillis": 250,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "workerBaseUrl": ""
}
```

# Actor output Schema

## `listings` (type: `string`):

Normalized Craigslist housing records.

## `runSummary` (type: `string`):

Counts, shards, proxy flag, and timestamps for a successful run.

## `inputEcho` (type: `string`):

Normalized non-secret input for the run.

## `errorSummary` (type: `string`):

Structured failure details when input validation or acquisition fails.

# 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 = {
    "locations": [
        "austin"
    ],
    "startUrls": [
        {
            "url": "https://www.craigslist.org/search/area/austin?cat=apa"
        }
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    },
    "workerBaseUrl": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("lentic_clockss/craigslist-housing-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 = {
    "locations": ["austin"],
    "startUrls": [{ "url": "https://www.craigslist.org/search/area/austin?cat=apa" }],
    "proxyConfiguration": { "useApifyProxy": False },
    "workerBaseUrl": "",
}

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

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

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

```

## CLI example

```bash
echo '{
  "locations": [
    "austin"
  ],
  "startUrls": [
    {
      "url": "https://www.craigslist.org/search/area/austin?cat=apa"
    }
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "workerBaseUrl": ""
}' |
apify call lentic_clockss/craigslist-housing-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Craigslist Housing Scraper",
        "description": "Scrape Craigslist apartments, rooms, sublets, vacation rentals, and real estate listings. Extract price, beds, baths, photos, and detail data — no login or API key.",
        "version": "0.5",
        "x-build-id": "KR2RtjhHirUjA33B6"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/lentic_clockss~craigslist-housing-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-lentic_clockss-craigslist-housing-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/lentic_clockss~craigslist-housing-scraper/runs": {
            "post": {
                "operationId": "runs-sync-lentic_clockss-craigslist-housing-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/lentic_clockss~craigslist-housing-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-lentic_clockss-craigslist-housing-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "locations": {
                        "title": "Craigslist area slugs",
                        "type": "array",
                        "description": "Craigslist area slugs used in /search/area/{slug}, e.g. austin, sfbay, newyork.",
                        "default": [
                            "austin"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "category": {
                        "title": "Housing category",
                        "enum": [
                            "apa",
                            "swp",
                            "off",
                            "prk",
                            "rea",
                            "roo",
                            "sub",
                            "vac",
                            "hou",
                            "hsw",
                            "sha",
                            "reo",
                            "reb",
                            "all"
                        ],
                        "type": "string",
                        "description": "Housing category. Use \"all\" to scrape every housing-related category. Shortcuts reo/reb map to real-estate by owner/broker.",
                        "default": "apa"
                    },
                    "purveyor": {
                        "title": "Sale purveyor",
                        "enum": [
                            "",
                            "owner",
                            "dealer"
                        ],
                        "type": "string",
                        "description": "Only used for real estate for sale. Leave blank for all, owner for by-owner, dealer for by-broker.",
                        "default": ""
                    },
                    "query": {
                        "title": "Keyword query",
                        "type": "string",
                        "description": "Optional Craigslist keyword query."
                    },
                    "minPrice": {
                        "title": "Minimum price",
                        "type": "integer",
                        "description": "Optional minimum price / rent."
                    },
                    "maxPrice": {
                        "title": "Maximum price",
                        "type": "integer",
                        "description": "Optional maximum price / rent."
                    },
                    "minBedrooms": {
                        "title": "Minimum bedrooms",
                        "type": "integer",
                        "description": "Optional minimum bedroom count."
                    },
                    "maxBedrooms": {
                        "title": "Maximum bedrooms",
                        "type": "integer",
                        "description": "Optional maximum bedroom count."
                    },
                    "minBathrooms": {
                        "title": "Minimum bathrooms",
                        "type": "integer",
                        "description": "Optional minimum bathroom count (SAPI filter)."
                    },
                    "maxBathrooms": {
                        "title": "Maximum bathrooms",
                        "type": "integer",
                        "description": "Optional maximum bathroom count (SAPI filter)."
                    },
                    "hasPic": {
                        "title": "Only listings with photos",
                        "type": "boolean",
                        "description": "Filter search results to postings that have at least one photo.",
                        "default": false
                    },
                    "postedToday": {
                        "title": "Only posted today",
                        "type": "boolean",
                        "description": "Filter search results to postings published today.",
                        "default": false
                    },
                    "sort": {
                        "title": "Sort order",
                        "enum": [
                            "date",
                            "dateoldest",
                            "priceasc",
                            "pricedsc"
                        ],
                        "type": "string",
                        "description": "Craigslist search sort. When maxItems > 360, the actor also shards across alternate sorts/price buckets because SAPI /full has no true offset pagination.",
                        "default": "date"
                    },
                    "startUrls": {
                        "title": "Start URLs",
                        "type": "array",
                        "description": "Optional Craigslist search URLs or detail URLs. Search URLs override category/location for that URL. Detail URLs are fetched directly.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "maxItems": {
                        "title": "Max listings (max 2,000; free users capped at 1,000/run)",
                        "minimum": 1,
                        "maximum": 2000,
                        "type": "integer",
                        "description": "Maximum listings to save (1–2000). Each SAPI request returns up to 360 rows; values above 360 automatically enable sort/price sharding. Free Apify plan users are capped at 1,000 listings per run and 10 total runs of this Actor — limits set by the Actor developer.",
                        "default": 50
                    },
                    "scrapeDetails": {
                        "title": "Enrich from detail pages",
                        "type": "boolean",
                        "description": "Fetch public listing detail pages for body text, attributes, JSON-LD, map address, bathrooms, and full images. Does not access /reply contact endpoints.",
                        "default": true
                    },
                    "maxDetailConcurrency": {
                        "title": "Detail-page concurrency",
                        "minimum": 1,
                        "maximum": 15,
                        "type": "integer",
                        "description": "Maximum number of public detail pages fetched in parallel when enrichment is enabled.",
                        "default": 5
                    },
                    "imageSize": {
                        "title": "Search image size",
                        "enum": [
                            "300x300",
                            "600x450",
                            "1200x900"
                        ],
                        "type": "string",
                        "description": "Image size suffix used when constructing SAPI image URLs.",
                        "default": "600x450"
                    },
                    "requestDelayMillis": {
                        "title": "Delay between requests (ms)",
                        "minimum": 0,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Politeness delay applied before search shards and detail-page requests.",
                        "default": 250
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Optional Apify Proxy. Leave enabled residential/US if you hit blocks; default path works without proxy. Set Actor env WORKER_PROVIDES_PROXY=1 when the Cloud Run worker supplies its own PROXY_URL."
                    },
                    "workerBaseUrl": {
                        "title": "Worker base URL (optional)",
                        "type": "string",
                        "description": "Override the Cloud Run worker origin for this run. Defaults to Actor env WORKER_BASE_URL. Production migrations should update WORKER_BASE_URL in Actor settings (no code change).",
                        "default": ""
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
