{
  "openapi": "3.0.1",
  "info": {
    "title": "Craigslist Scraper — Listings, Cars, Housing & Contacts",
    "description": "Scrape any Craigslist city and category: for-sale, cars, housing, jobs, services. Price, date, GPS, all photos, full specs (VIN/odometer, beds/baths/sqft), description, body email + anonymized relay email/phone (no login). Plus dedup, monitoring & region price analytics.",
    "version": "0.0",
    "x-build-id": "40gDlAdYGY5shvJDY"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/brilliant_gum~craigslist-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-brilliant_gum-craigslist-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/brilliant_gum~craigslist-scraper/runs": {
      "post": {
        "operationId": "runs-sync-brilliant_gum-craigslist-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/brilliant_gum~craigslist-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-brilliant_gum-craigslist-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": {
          "startUrls": {
            "title": "Craigslist URLs (search pages or post pages)",
            "type": "array",
            "description": "Optional. Paste Craigslist URLs, one per line. Both search/category URLs (e.g. https://newyork.craigslist.org/search/sss?query=iphone) and individual post URLs (e.g. https://newyork.craigslist.org/mob/d/.../7961578044.html or a /view/d/... link) are supported. Search URLs are expanded and paginated automatically. Leave empty and use the 'Search by city' section instead if you don't already have URLs.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "subdomain": {
            "title": "City (Craigslist subdomain)",
            "type": "string",
            "description": "The Craigslist city/region code — the part before .craigslist.org in the URL. Examples: newyork, losangeles, sfbay, chicago, miami, seattle, london. Required when using 'Search queries' / 'Category'. The full list of valid subdomains is resolved automatically from Craigslist's own area reference."
          },
          "searchQueries": {
            "title": "Search queries",
            "type": "array",
            "description": "Optional keywords/phrases, one per line. Each becomes a separate Craigslist search in the chosen city + category. Leave empty to scrape the whole category without a keyword.",
            "items": {
              "type": "string"
            }
          },
          "category": {
            "title": "Category",
            "enum": [
              "sss",
              "cta",
              "cto",
              "ctd",
              "mcy",
              "apa",
              "hhh",
              "rea",
              "roo",
              "sub",
              "vac",
              "off",
              "reb",
              "rec",
              "jjj",
              "ggg",
              "bbb",
              "ccc",
              "res",
              "ele",
              "fua",
              "fuo",
              "hsh",
              "clo",
              "zip",
              "bik",
              "boo",
              "tls",
              "sga",
              "sgo",
              "atq",
              "bar",
              "hab",
              "pha"
            ],
            "type": "string",
            "description": "Craigslist category code to search within. Common codes: sss = all for-sale, cta = cars & trucks, apa = apartments/housing for rent, rea = real estate for sale, roo = rooms/shared, jjj = all jobs, ggg = all gigs, bbb = all services, ccc = community, res = resumes, ele = electronics, mcy = motorcycles, hab = arts+crafts. Any valid Craigslist category abbreviation is accepted. Default: sss.",
            "default": "sss"
          },
          "sort": {
            "title": "Sort order",
            "enum": [
              "rel",
              "date",
              "priceasc",
              "pricedsc"
            ],
            "type": "string",
            "description": "How to order search results. 'rel' = most relevant (default), 'date' = newest first, 'priceasc' = cheapest first, 'pricedsc' = most expensive first. Only applies to searches (not to individual post URLs).",
            "default": "date"
          },
          "minPrice": {
            "title": "Minimum price",
            "type": "integer",
            "description": "Only return listings priced at or above this amount. Leave empty for no lower bound."
          },
          "maxPrice": {
            "title": "Maximum price",
            "type": "integer",
            "description": "Only return listings priced at or below this amount. Leave empty for no upper bound."
          },
          "onlyFreeListings": {
            "title": "Free items only",
            "type": "boolean",
            "description": "Only return listings priced at $0 (equivalent to Craigslist's free category / max price 0).",
            "default": false
          },
          "onlyWithPhotos": {
            "title": "Has photo only",
            "type": "boolean",
            "description": "Only return listings that include at least one photo.",
            "default": false
          },
          "postedToday": {
            "title": "Posted today only",
            "type": "boolean",
            "description": "Only return listings posted in the last 24 hours.",
            "default": false
          },
          "maxAgeDays": {
            "title": "Maximum age (days)",
            "minimum": 1,
            "type": "integer",
            "description": "Skip listings older than this many days since they were posted. Leave empty to keep all ages. (Applied client-side after fetching.)"
          },
          "searchTitlesOnly": {
            "title": "Search titles only",
            "type": "boolean",
            "description": "Match the query against listing titles only, not the full body text (Craigslist 'srchType=T'). Produces fewer, more precise results.",
            "default": false
          },
          "sellerType": {
            "title": "Seller type",
            "enum": [
              "all",
              "owner",
              "dealer"
            ],
            "type": "string",
            "description": "Filter by who is posting. 'all' = no filter, 'owner' = private/for-sale-by-owner only, 'dealer' = dealers/businesses only.",
            "default": "all"
          },
          "hideDuplicates": {
            "title": "Bundle duplicates",
            "type": "boolean",
            "description": "Ask Craigslist to bundle near-duplicate reposts of the same item into one result (Craigslist 'bundleDuplicates').",
            "default": true
          },
          "searchNearby": {
            "title": "Include nearby areas",
            "type": "boolean",
            "description": "Also include results from neighbouring Craigslist regions around the chosen city.",
            "default": false
          },
          "condition": {
            "title": "Item condition",
            "enum": [
              "any",
              "new",
              "like new",
              "excellent",
              "good",
              "fair",
              "salvage"
            ],
            "type": "string",
            "description": "For-sale only: filter by the seller-declared item condition. 'any' = no filter. Maps to Craigslist's condition filter (new / like new / excellent / good / fair / salvage).",
            "default": "any"
          },
          "deliveryAvailable": {
            "title": "Delivery available only",
            "type": "boolean",
            "description": "For-sale only: only return listings where the seller offers delivery (Craigslist 'delivery_available').",
            "default": false
          },
          "deepCoverage": {
            "title": "Deep coverage (exceed the 1080-per-search cap)",
            "type": "boolean",
            "description": "Craigslist's search API returns at most ~1080 results per search. When ON, the actor automatically splits each priced search into disjoint price bands and crawls each one, so you can pull many thousands of listings for a busy city/category. Ignored for price-less categories (jobs, gigs, community). Combine with 'Max results' to bound the run.",
            "default": false
          },
          "postalCode": {
            "title": "ZIP / postal code",
            "type": "string",
            "description": "Center the search on a specific ZIP/postal code. Use together with 'Search distance'."
          },
          "searchDistance": {
            "title": "Search distance (miles)",
            "minimum": 1,
            "type": "integer",
            "description": "Radius in miles around the ZIP/postal code. Requires 'ZIP / postal code'."
          },
          "minBedrooms": {
            "title": "Min bedrooms",
            "type": "integer",
            "description": "Housing only: minimum number of bedrooms."
          },
          "maxBedrooms": {
            "title": "Max bedrooms",
            "type": "integer",
            "description": "Housing only: maximum number of bedrooms."
          },
          "minBathrooms": {
            "title": "Min bathrooms",
            "type": "integer",
            "description": "Housing only: minimum number of bathrooms."
          },
          "maxBathrooms": {
            "title": "Max bathrooms",
            "type": "integer",
            "description": "Housing only: maximum number of bathrooms."
          },
          "minSqft": {
            "title": "Min square feet",
            "type": "integer",
            "description": "Housing only: minimum area in square feet."
          },
          "maxSqft": {
            "title": "Max square feet",
            "type": "integer",
            "description": "Housing only: maximum area in square feet."
          },
          "catsOk": {
            "title": "Cats OK",
            "type": "boolean",
            "description": "Housing only: only listings that allow cats.",
            "default": false
          },
          "dogsOk": {
            "title": "Dogs OK",
            "type": "boolean",
            "description": "Housing only: only listings that allow dogs.",
            "default": false
          },
          "minAutoYear": {
            "title": "Min vehicle year",
            "type": "integer",
            "description": "Cars/vehicles only: minimum model year."
          },
          "maxAutoYear": {
            "title": "Max vehicle year",
            "type": "integer",
            "description": "Cars/vehicles only: maximum model year."
          },
          "maxMiles": {
            "title": "Max odometer (miles)",
            "type": "integer",
            "description": "Cars/vehicles only: maximum odometer reading in miles."
          },
          "autoTitleStatus": {
            "title": "Title status",
            "enum": [
              "any",
              "clean",
              "salvage",
              "rebuilt",
              "parts",
              "lien",
              "missing"
            ],
            "type": "string",
            "description": "Cars/vehicles only: filter by title status.",
            "default": "any"
          },
          "includeDetails": {
            "title": "Open each listing for full details",
            "type": "boolean",
            "description": "When ON (default), the actor opens every listing's detail page to extract the full description, all photos, complete specs/attributes (VIN, odometer, fuel, transmission, title status for cars; beds/baths/sqft/housing type/laundry/parking for housing), exact posted & updated timestamps, map address and contact info. Turn OFF for a much faster, cheaper run that returns only the search-result summary (title, price, coordinates, thumbnail, url).",
            "default": true
          },
          "extractContactInfo": {
            "title": "Extract contact info from body",
            "type": "boolean",
            "description": "When ON, additionally extract phone numbers found in the listing body and the reply/contact URL. (E-mail addresses written in the body — including obfuscated 'name at domain dot com' forms — are always extracted into the 'email' field regardless of this toggle.) Requires 'Open each listing for full details'.",
            "default": false
          },
          "fetchContactInfo": {
            "title": "Unlock anonymized relay email & phone (no login)",
            "type": "boolean",
            "description": "When ON, the actor reveals each listing's anonymized relay email (xxxx@sale.craigslist.org) into 'replyEmail', plus the reveal phone into 'replyPhone' when the poster provided one — no login required. Best-effort and slower/heavier: some listings can't be unlocked on a given run, so the actor retries (see 'Contact-unlock retries'). Requires 'Open each listing for full details'.",
            "default": false
          },
          "contactInfoMaxRetries": {
            "title": "Contact-unlock retries",
            "minimum": 1,
            "type": "integer",
            "description": "How many attempts to make per listing when unlocking the relay email/phone (only used when 'Unlock anonymized relay email & phone' is ON). Higher values raise the success rate but cost more requests. Default 5.",
            "default": 5
          },
          "maxImages": {
            "title": "Max images per listing",
            "minimum": 0,
            "type": "integer",
            "description": "Cap the number of image URLs stored per listing. 0 = no images, empty = all images."
          },
          "monitoringMode": {
            "title": "Monitoring mode (only new listings)",
            "type": "boolean",
            "description": "When ON, the actor remembers every post ID it has already delivered and, on subsequent runs, outputs ONLY listings it has never seen before. Ideal for scheduled runs that watch a search for fresh posts. Set a Monitoring store name so the memory persists across runs.",
            "default": false
          },
          "monitoringStoreName": {
            "title": "Monitoring store name",
            "type": "string",
            "description": "Named key-value store where Monitoring mode remembers already-delivered listings across runs. Use the SAME name on every scheduled run that watches one search; use different names for different searches. Required for cross-run 'new listings only' monitoring."
          },
          "deduplicateReposts": {
            "title": "Flag & drop reposts",
            "type": "boolean",
            "description": "Detect the same item re-listed under multiple post IDs (same title + price + seller area) within this run. The first occurrence is kept and flagged with repostCount; later duplicates are dropped from the dataset.",
            "default": false
          },
          "dealerDetection": {
            "title": "Dealer / spam detection flag",
            "type": "boolean",
            "description": "Add an 'isDealer' boolean and 'sellerSignals' to each record using heuristics (Craigslist by-dealer category, dealer keywords, phone/website in body, many active posts). Helps separate private sellers from dealers and bulk posters.",
            "default": true
          },
          "computeRegionAnalytics": {
            "title": "Compute region price analytics",
            "type": "boolean",
            "description": "After scraping, push one extra summary record per neighbourhood/sub-region with count, min/median/mean/max price, so you can compare pricing across areas. Each listing also gets 'priceVsRegionMedianPct'.",
            "default": false
          },
          "maxItems": {
            "title": "Max results",
            "minimum": 1,
            "type": "integer",
            "description": "Hard cap on the number of listings to output across the whole run. Pre-filled with 50 for a quick, low-cost first run — raise it, or clear the field for no cap (bounded by Craigslist's per-search limits). Very large runs stop cleanly before the run timeout and keep everything fetched so far."
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "type": "integer",
            "description": "Maximum number of pages fetched in parallel. Lower this if you hit rate-limiting/blocks.",
            "default": 8
          },
          "maxRequestRetries": {
            "title": "Max request retries",
            "minimum": 0,
            "type": "integer",
            "description": "How many times to retry a failed or blocked request before giving up on it.",
            "default": 5
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Proxy settings. Leave as-is — proxies are tuned automatically for reliable Craigslist runs. Requires an Apify account with a proxy plan.",
            "default": {
              "useApifyProxy": true
            }
          }
        }
      },
      "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}