{
  "openapi": "3.0.1",
  "info": {
    "title": "Carsales AU $1💰 Deep Search | Bypass 440-Car Limit",
    "description": "Scrape structured vehicle listings from Carsales.com.au from $1 per 1K results. Built to bypass the 20-page / 440-car search cap with deep filtering. Returns clean JSON with 30+ fields per listing, ideal for dealers, analysts, pricing tools, and real-time vehicle data pipelines.",
    "version": "1.0",
    "x-build-id": "8dwO99uGKFnFPdUxu"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~carsales-au-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-carsales-au-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/abotapi~carsales-au-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-carsales-au-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/abotapi~carsales-au-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-carsales-au-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",
        "required": [
          "mode"
        ],
        "properties": {
          "mode": {
            "title": "Search mode",
            "enum": [
              "search",
              "url"
            ],
            "type": "string",
            "description": "Choose how to find listings. Only fields belonging to the chosen mode are used.",
            "default": "search"
          },
          "urls": {
            "title": "URLs (URL mode only)",
            "type": "array",
            "description": "Carsales search URLs to scrape. Each URL is collected up to Maximum Pages or Maximum Listings. Ignored in Search mode. Example: https://www.carsales.com.au/cars/used/toyota/corolla/new-south-wales-state/",
            "items": {
              "type": "string"
            }
          },
          "condition": {
            "title": "Condition",
            "enum": [
              "all",
              "new",
              "used",
              "demo"
            ],
            "type": "string",
            "description": "Vehicle condition (Search mode only).",
            "default": "used"
          },
          "sellerType": {
            "title": "Seller type",
            "enum": [
              "all",
              "dealer",
              "private"
            ],
            "type": "string",
            "description": "Dealer / Private / All (Search mode only).",
            "default": "all"
          },
          "make": {
            "title": "Make",
            "type": "string",
            "description": "Manufacturer, e.g. Toyota, Ford, BMW. Leave empty for all makes. (Search mode only)"
          },
          "model": {
            "title": "Model",
            "type": "string",
            "description": "Model name, e.g. Corolla, Ranger, X5. Requires a Make. (Search mode only)"
          },
          "bodyType": {
            "title": "Body type",
            "enum": [
              "",
              "suv",
              "sedan",
              "hatch",
              "wagon",
              "coupe",
              "convertible",
              "ute",
              "van",
              "bus",
              "cab-chassis",
              "people-mover"
            ],
            "type": "string",
            "description": "Body shape (Search mode only).",
            "default": ""
          },
          "state": {
            "title": "State",
            "enum": [
              "",
              "nsw",
              "vic",
              "qld",
              "sa",
              "wa",
              "tas",
              "act",
              "nt"
            ],
            "type": "string",
            "description": "Australian state (Search mode only).",
            "default": ""
          },
          "transmission": {
            "title": "Transmission",
            "enum": [
              "",
              "automatic",
              "manual"
            ],
            "type": "string",
            "description": "Gearbox (Search mode only).",
            "default": ""
          },
          "fuelType": {
            "title": "Fuel type",
            "enum": [
              "",
              "petrol",
              "diesel",
              "hybrid",
              "plug-in-hybrid",
              "electric",
              "dual-fuel"
            ],
            "type": "string",
            "description": "Fuel type (Search mode only).",
            "default": ""
          },
          "colour": {
            "title": "Colour",
            "type": "string",
            "description": "Exterior colour, e.g. black, white, blue, silver, grey, red. (Search mode only)"
          },
          "cylinders": {
            "title": "Cylinders",
            "minimum": 1,
            "maximum": 16,
            "type": "integer",
            "description": "Engine cylinders (3, 4, 6, 8, 12). Search mode only."
          },
          "doors": {
            "title": "Doors",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Number of doors (2, 3, 4, 5). Search mode only."
          },
          "priceMin": {
            "title": "Minimum price (AUD)",
            "minimum": 0,
            "type": "integer",
            "description": "Lower bound for price. Search mode only. Can be combined with Maximum price."
          },
          "priceMax": {
            "title": "Maximum price (AUD)",
            "minimum": 0,
            "type": "integer",
            "description": "Upper bound for price. Search mode only."
          },
          "yearMin": {
            "title": "Minimum year",
            "minimum": 1900,
            "maximum": 2100,
            "type": "integer",
            "description": "Oldest model year. Search mode only."
          },
          "yearMax": {
            "title": "Maximum year",
            "minimum": 1900,
            "maximum": 2100,
            "type": "integer",
            "description": "Newest model year. Search mode only."
          },
          "odometerMin": {
            "title": "Minimum odometer (km)",
            "minimum": 0,
            "type": "integer",
            "description": "Lower bound for kilometers. Search mode only."
          },
          "odometerMax": {
            "title": "Maximum odometer (km)",
            "minimum": 0,
            "type": "integer",
            "description": "Upper bound for kilometers. Search mode only."
          },
          "postcode": {
            "title": "Postcode",
            "pattern": "^[0-9]{4}$",
            "type": "string",
            "description": "4-digit Australian postcode. Search mode only."
          },
          "radiusKm": {
            "title": "Radius (km)",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Search radius around postcode. Ignored if Postcode is empty."
          },
          "sortBy": {
            "title": "Sort order",
            "enum": [
              "featured",
              "price-asc",
              "price-desc",
              "km-asc",
              "km-desc",
              "year-desc",
              "year-asc"
            ],
            "type": "string",
            "description": "Sort order (Search mode only; in URL mode the URL's sort is used).",
            "default": "featured"
          },
          "fetchDetails": {
            "title": "Fetch full details",
            "type": "boolean",
            "description": "Off by default. Each search result already includes the full listing record (price, odometer, specs, transmission, fuel, body, seller, images, ~38 fields), so this is rarely needed and is left off to keep runs fast.",
            "default": false
          },
          "maxListings": {
            "title": "Maximum listings",
            "minimum": 1,
            "type": "integer",
            "description": "Stop after scraping this many listings across the whole run. Leave empty for unlimited. carsales only lets any one search expose ~440 listings before it stops filtering; to collect more than that, set this above 75 and keep 'Deep collection' on, and the actor covers the search across several price ranges. Larger targets run longer.",
            "default": 30
          },
          "expandPriceBands": {
            "title": "Deep collection (beyond the 440 limit)",
            "type": "boolean",
            "description": "On by default. carsales caps every search at ~440 listings before it silently drops the filter. When your Maximum listings is above ~75, this covers the search across several price ranges and de-duplicates the results, recovering far more than one search can show. It only activates when you ask for more than ~75 listings, so small runs are unaffected. Note: even with this on, a very large search (e.g. tens of thousands of matches) cannot be collected 100%; combine with make/model, state, or year filters for fuller coverage.",
            "default": true
          },
          "maxPages": {
            "title": "Maximum pages per search",
            "minimum": 1,
            "type": "integer",
            "description": "Maximum pages to read per search (or per price range when deep collection is on). ~30 listings per page; a search's distinct results are usually collected within ~10 pages.",
            "default": 20
          },
          "resumeFromRunId": {
            "title": "Resume from a previous run",
            "type": "string",
            "description": "Paste a previous run ID or dataset ID to continue a large crawl of listings without returning or charging for listings already collected there. Use this after an interrupted run, or when continuing a listing pull in another run. For recurring monitoring of the same search, use Incremental mode below instead."
          },
          "incrementalMode": {
            "title": "Incremental changes for scheduled runs",
            "type": "boolean",
            "description": "Turn this on for recurring monitoring of the same search. The first run returns all matching listings as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED listings. Turn on \"Emit unchanged\" or \"Emit expired\" only when you also want those listings returned (and billed). State is kept separately for each mode/filter combination; use State key when you want to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above.",
            "default": false
          },
          "stateKey": {
            "title": "State key (optional, incremental mode only)",
            "type": "string",
            "description": "Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the mode/filters — different searches then never mix state with each other."
          },
          "emitUnchanged": {
            "title": "Emit unchanged listings (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to also return listings that have not changed since the last run, marked UNCHANGED. This returns — and bills — extra rows you already have, so leave it off unless you specifically want the full snapshot every run.",
            "default": false
          },
          "emitExpired": {
            "title": "Emit expired listings (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to also return listings that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search — not when Max listings/Max pages capped it, a page was blocked, or Resume was used. This returns — and bills — extra synthetic rows, so leave it off unless you need expiry tracking.",
            "default": false
          },
          "proxyConfiguration": {
            "title": "Proxy configuration (RESIDENTIAL required)",
            "type": "object",
            "description": "This actor REQUIRES Apify RESIDENTIAL proxy. Leave the country empty to let the actor rotate residential exits across AU and NZ automatically (both return the same Australian listings and a wider IP pool means fewer blocks); or pick a single country to pin every request to it. Datacenter and free-tier proxy groups are pre-flagged by carsales and will return 0 listings. If your plan lacks residential, upgrade at apify.com/pricing or paste your own residential proxy URLs."
          },
          "mcpConnectors": {
            "title": "Pipe results into your apps (optional)",
            "type": "array",
            "description": "Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON; the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com)."
          },
          "notionParentPageUrl": {
            "title": "Notion parent page (Notion connector only)",
            "type": "string",
            "description": "URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors."
          },
          "maxNotifyListings": {
            "title": "Max items to export per connector",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Cap on items written to each connector per run. Does not affect the dataset.",
            "default": 50
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}