Craigslist Scraper Premium avatar

Craigslist Scraper Premium

Pricing

$29.00/month + usage

Go to Apify Store
Craigslist Scraper Premium

Craigslist Scraper Premium

Scrape Craigslist listings by city, category, and keyword. Export titles, prices, dates, URLs, images, descriptions, locations, IDs, attributes, salary, and housing details.

Pricing

$29.00/month + usage

Rating

0.0

(0)

Developer

Newbs

Newbs

Maintained by Community

Actor stats

1

Bookmarked

7

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

Scrape Craigslist listings by city, category, and keyword. Full listing details are enabled by default. The Actor uses Craigslist’s lightweight JSON endpoints, with an HTML fallback, and fetches up to 12 listing details concurrently. It supports bulk exports of up to 10,000 listings.

Input

{
"category": "for sale",
"city": "New York",
"searchKeyword": "iPhone",
"numberOfResults": 30
}
FieldDefaultDescription
categoryfor salecommunity, housing, jobs, services, for sale, gigs, or resumes.
cityNew YorkCity name, site slug, city URL, or https://www.craigslist.org/area/newyork.
searchKeywordemptyOptional search text.
numberOfResults10Maximum listings to return, 1–10,000. Availability, runtime and spending limits may reduce the total.
includeDetailstrueFetch descriptions, dates, numeric post IDs, gallery images, addresses, and attributes. Set to false for search-only exports.
maxConcurrency12Concurrent detail requests, 1–32. Lower this when rate-limited.
requestTimeoutSecs15Timeout for each HTTP attempt, 5–60 seconds.
maxRetries1Retries for temporary failures, 0–2. Removed listings are not retried.
proxydirect connectionOptional automatic Apify datacenter proxy (useApifyProxy: true). Residential proxies, selected groups, custom URLs and credential overrides are rejected before scraping.

Fast search-only export

{
"category": "housing",
"city": "sfbay",
"numberOfResults": 1000,
"includeDetails": false
}

This mode saves titles, URLs, prices, locations, and any images available in search metadata. Descriptions and addresses require full details; IDs, dates, salary and other metadata are included when available in search data. listingKey identifies both older numeric URLs and newer opaque Craigslist URLs.

Output

Existing fields are preserved: title, priceInfo, postedDate, updatedDate, postLink, imageSrc, description, location, id, postAdress, postAddress, attribute, companyName, salary, housingSize, category, city, searchKeyword, and scrapedAt.

Both postAdress (the original spelling) and postAddress contain the same address. Missing source fields remain empty strings or empty arrays. id remains the numeric Craigslist post ID when available; listingKey can also represent a modern opaque URL identifier.

Every exported listing has detailStatus: "complete" when details were fetched or "not_requested" for a search-only export. Optional fields can still be empty when Craigslist does not provide them.

Removed or failed detail listings are excluded from the result dataset. The Actor tries additional search candidates to reach your requested count. A sample of up to 100 failed listing URLs and error codes is saved separately in the key-value store’s DIAGNOSTICS record. Empty searches and errors never create billable diagnostic rows.

The key-value store’s OUTPUT record reports result counts, failures, search pages, HTTP requests, retries, downloaded bytes, timing, API/fallback usage, billing counters, and the reason the run stopped. Status is complete, partial, empty, or failed. A run can finish below the requested count when the source is exhausted or the spending limit is reached. A partial run may contain useful, successfully completed listings.

Pricing and result billing

When pay-per-result pricing is active, one result means one successfully saved listing in the default dataset. Search-only listings also count as results. The Actor checks the remaining spending allowance before fetching details and before saving each batch. It uses Apify’s automatic dataset-item event; failed listings and diagnostics are never written to the billable dataset.

The new pricing is $0.50 per 1,000 successfully saved results ($0.0005 each), with Apify platform usage included and no additional start fee. Search-only results have the same per-result price. During the scheduled transition from rental pricing, the current rental terms remain active until the effective date shown in Apify Store. No price is hard-coded in the scraper.

Reliability and performance

  • Uses Craigslist’s current canonical search URLs, avoiding two legacy redirects.
  • Reuses HTTP connections and bounds concurrency; results retain search order.
  • Streams listing rows to Apify in batches of up to 64 full listings or 1,000 search-only listings, keeping memory bounded and making results available during the run.
  • Fetches bulk search metadata in one request; stops detail requests at the result or spending limit. The HTML fallback follows only explicit next-page links and stops on repeated pages.
  • Deduplicates URLs and resolved numeric post IDs.
  • Retries transient errors with backoff, respects Retry-After, and stops within a scraping budget of at most 240 seconds (less for shorter platform timeouts).
  • Extracts all static gallery links and removes duplicate image sizes.
  • Defaults to 256 MB of memory, with a 512 MB maximum to limit resource costs.
  • Uses a Node.js 22 runtime, a locked dependency tree, and a small browser-free container.

Craigslist results change continuously. Network latency, server load, proxy location, removed posts, and blocking affect runtime and completeness. The supported datacenter proxy usage is included in the new result price. The Actor does not use residential, Unblocker, SERP or custom proxies.

Local development

Requires Node.js 22 or newer.

npm ci
npm test
npm run check
npx apify-cli validate-schema
npx apify-cli run --input-file example-input.json

For a manual local run, put input in storage/key_value_stores/default/INPUT.json, then run npm start. Use CRAWLEE_STORAGE_DIR to select a separate local storage directory.