# Gumtree AU Scraper - Listings, Sellers & Reviews (`abotapi/gumtree-au-scraper`) Actor

Scrape gumtree.com.au classifieds across every vertical: for-sale goods, motors, real estate, jobs and services. Get title, description, price, all photos, GPS coordinates, category attributes, and seller profile + aggregate rating. Search by category + location + keyword, or paste any Gumtree URL.

- **URL**: https://apify.com/abotapi/gumtree-au-scraper.md
- **Developed by:** [Abot API](https://apify.com/abotapi) (community)
- **Categories:** E-commerce, Automation, Developer tools
- **Features:** Limited permissions
- **Stats:** 31 total users, 13 monthly users, 94.7% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.10 / 1,000 listing results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Gumtree Australia Scraper: Listings, Prices and Seller Ratings

Gumtree Australia Scraper turns gumtree.com.au into structured classifieds data. Get listing details, prices, photos, category attributes and the seller's aggregate rating for every vertical Gumtree carries: for-sale goods, motors, real estate, jobs and services. Search by category, location and keyword, or paste any gumtree.com.au URL you already refined in your browser, then export to JSON, CSV or Excel, or pull the results straight into your app through the API.

### Why This Scraper?

- **Two ways to find listings.** Build a query from category, location and keyword, or paste a gumtree.com.au category-and-location search or listing URL directly.
- **Every vertical in one actor.** Motors, real estate, jobs, services and for-sale goods, each carrying its own category-specific attributes flattened into one object.
- **Seller rating on every listing.** The overall score, the number of ratings behind it and any trust badges, with a null value whenever Gumtree simply has not published one for that seller yet.
- **Optional detail enrichment.** Turn on Fetch full listing detail to add the untruncated description, precise location (latitude, longitude, postcode, suburb, map address) and the seller's published phone number, and pay only for the listings actually enriched.
- **Attributable enrichment.** Every enriched record carries a status field, so a listing with no location is always attributable to a specific outcome rather than looking like data that was simply never collected.
- **Tuned for Australia.** Default connection settings are built around the fact that gumtree.com.au serves Australian visitors.
- **Pipe results into your apps.** Send a summary of each listing straight into Notion, Linear or Airtable through MCP connectors, no separate integration to build.

### Use Cases

- **Vehicle marketplaces and pricing tools:** track make, model, price and mileage across Australian sellers, with a link to the vehicle history report where one exists.
- **Classifieds aggregators:** mirror for-sale, real estate, jobs and services listings from Gumtree into your own search index.
- **Lead generation and CRM enrichment:** capture seller name, rating and, with detail enrichment on, a published phone number for outreach, subject to your own obligations under Australian privacy law.
- **Property research:** pull real estate listings by suburb, city or state with bedroom and bathroom attributes for rent and sale comparisons.
- **Market and pricing research:** build price datasets for a category or keyword across regions and track how listings move over time.

### Data You Get

> Sample shape: values are illustrative placeholders, not from a live record.

| Field | Example |
| --- | --- |
| `id` | `"1300000000"` |
| `url` | `"https://www.gumtree.com.au/web/listing/cars-vans-utes/1300000000"` |
| `title` / `description` | `"2016 Toyota HiLux SR5 Dual Cab"` / `"One owner, full service history..."` |
| `price` / `priceText` / `priceType` | `32990` / `"$32,990"` / `"FIXED"` |
| `currency` | `"AUD"` |
| `minimumOfferPrice` / `previousPriceString` | `30000` / `"$34,990"` |
| `isFree` / `isNegotiable` / `isSwapTrade` / `isDriveAway` | `false` / `true` / `false` / `false` |
| `vertical` | `"motors"` (also `"property"`, `"jobs"`, `"services"`, `"for-sale"`) |
| `categoryId` / `categoryName` | `"9299"` / `"Cars, Vans & Utes"` |
| `location` / `locationArea` / `locationState` | `"Parramatta"` / `"Western Sydney"` / `"NSW"` |
| `age` | `"2 hours ago"` |
| `images` / `imageCount` | array of photo URLs / `8` |
| `hasVideo` / `videos` | `false` / `[]` (video URLs are not currently extracted) |
| `attributes` | flattened category fields, for example mileage, body type and transmission for cars, or bedrooms and bathrooms for property |
| `carVin` / `carRecordReportUrl` | `"MMSAAAAAAAA000000"` / a vehicle history report link (motors only, when present) |
| `isFeatured` / `isUrgent` / `isHighlighted` / `isPremium` / `isTopAd` | prominence flags set by the seller's ad package |
| `numberOfViews` / `numberOfReplies` / `numberOfOffers` | `340` / `12` / `3` |
| `sellerName` / `seller` | `"Example Motors"` / nested rating object, see below |
| `isWanted` / `adType` | `false` / `"OFFER"` (also `"WANTED"`) |
| `detailFetched` / `detailStatus` | `true` / `"enriched"` (meaningful only when Fetch full listing detail is on) |
| `fullDescription` | the untruncated advert text (detail enrichment only) |
| `latitude` / `longitude` / `postcode` / `suburb` / `mapAddress` | precise geo (detail enrichment only) |
| `scrapedAt` | `"2026-07-04T00:00:00+00:00"` |

A record built from a search result carries the coarse locality (`location` / `locationArea`, where `locationArea` actually holds the postcode / `locationState`), the search snippet in `description`, and the flattened category `attributes`; a record built by pasting a single listing URL carries the listing page's own structured data instead, so `categoryName`, `priceText`, `priceType`, `age` and `attributes` are not populated for that record, and `detailFetched`, `detailStatus`, `fullDescription`, `latitude`, `longitude`, `postcode`, `suburb` and `mapAddress` only appear once detail is fetched (always for a pasted listing URL, or when **Fetch full listing detail** is on for a search result). When detail is fetched, `description` is replaced with the full listing text, matching `fullDescription`. `vertical` is always `"for-sale"` regardless of category, and every `is*` flag plus `hasVideo` is always `false`; none of these are meaningfully populated by this actor. The `seller` object always carries `name`, `type` (`"dealer"` when Gumtree flags the poster as a dealer, otherwise `null`, there is no separate `"private"` value), `rating`, `reviewCount` and `ratingBadges`; `phone`, `phoneExists` and `phoneVerified` are filled only when Fetch full listing detail is on. Gumtree publishes only an aggregate seller rating, an overall score, the number of ratings behind it and any trust badges, never the individual buyer reviews or a star-by-star breakdown, so `reviews` and `ratingDistribution` are always `null`. Business and service ads may also carry a `website` field with the seller's linked site.

### How to Use

1. Pick a **Search mode**: `search` (build a query from category, location and keyword) or `url` (paste one or more gumtree.com.au URLs).
2. For search mode, choose a category, a location and an optional keyword, then refine with price, sort order and radius. For URL mode, paste search-result or listing URLs; the category, location, page, price range and sort order already in the URL are respected, so the category, location, keyword, price, sort and radius fields are ignored, while on pasted search URLs every seller, vehicle and listing-date filter applies; on pasted listing URLs only make, model and year apply, because a listing page does not carry seller type, mileage, fuel, transmission or post age. Price change monitoring applies to every result. Keyword paths (`.../toyota+hilux/k0c...`) are read; attribute filters other than price and sort are not.
3. Set **Max listings** and **Max result pages per search** to control the size and cost of the run.
4. Click **Start**, then download the dataset as JSON, CSV or Excel, or read it through the API.

**Search for cars in a price range:**

```json
{
  "mode": "search",
  "category": "cars-vehicles",
  "location": "Sydney",
  "keywords": "toyota hilux",
  "sortBy": "price_asc",
  "minPrice": 10000,
  "maxPrice": 40000,
  "maxItems": 100,
  "maxPages": 5
}
```

**Browse a whole category across a state:**

```json
{
  "mode": "search",
  "category": "real-estate",
  "location": "NSW",
  "maxItems": 50
}
```

**Paste a gumtree.com.au search URL:**

```json
{
  "mode": "url",
  "urls": [
    "https://www.gumtree.com.au/s-cars-vans-utes/sydney/c18320l3003435"
  ],
  "maxItems": 200,
  "maxPages": 10
}
```

**Paste a single listing URL with full detail enrichment:**

```json
{
  "mode": "url",
  "urls": [
    "https://www.gumtree.com.au/s-ad/parramatta/cars-vans-utes/2016-toyota-hilux-sr5-dual-cab/1300000000"
  ],
  "fetchDetails": true
}
```

#### Supported URL shapes (URL mode)

If you leave `urls` untouched in URL mode, the actor now runs the example list below (one URL per shape) instead of doing nothing, so set your own URLs or `maxItems` first. Seller pages and bare `/<id>` links are not supported: each is skipped with a warning, and a run where no URL is supported fails with a clear message.

| Shape | Example |
|---|---|
| category location | `https://www.gumtree.com.au/s-cars-vans-utes/sydney/c18320l3003435` |
| paginated | `https://www.gumtree.com.au/s-cars-vans-utes/sydney/page-2/c18320l3003435` |
| category only | `https://www.gumtree.com.au/s-cars-vans-utes/c18320` |
| region | `https://www.gumtree.com.au/s-cars-vans-utes/nsw/c18320l3008839` |
| category no location | `https://www.gumtree.com.au/s-cars-vans-utes/c18320l3003435` |
| keyword k0 | `https://www.gumtree.com.au/s-cars-vans-utes/sydney/toyota+hilux/k0c18320l3003435` |
| keyword only | `https://www.gumtree.com.au/s-toyota/k0` |
| all categories | `https://www.gumtree.com.au/s-all/c0` |
| location only | `https://www.gumtree.com.au/s-sydney/c0l3003435` |
| sort date | `https://www.gumtree.com.au/s-cars-vans-utes/sydney/c18320l3003435?sort=date` |
| price filter | `https://www.gumtree.com.au/s-cars-vans-utes/sydney/c18320l3003435?price=5000__10000` |
| view gallery | `https://www.gumtree.com.au/s-cars-vans-utes/sydney/c18320l3003435?view=gallery` |
| real estate | `https://www.gumtree.com.au/s-property-for-sale/sydney/c18364l3003435` |
| jobs | `https://www.gumtree.com.au/s-jobs/sydney/c9302l3003435` |
| detail | `https://www.gumtree.com.au/web/listing/cars-vans-utes/1344633156` |
| legacy ad | `https://www.gumtree.com.au/s-ad/1344633156` |
| legacy ad long | `https://www.gumtree.com.au/s-ad/sydney/cars-vans-utes/x/1344633156` |

#### Run it from your code

Python:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/gumtree-au-scraper").call(run_input={
    "mode": "search",
    "category": "cars-vehicles",
    "location": "Sydney",
    "maxItems": 50,
})
for listing in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(listing["title"], listing["priceText"])
```

JavaScript:

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/gumtree-au-scraper').call({
  mode: 'search',
  category: 'cars-vehicles',
  location: 'Sydney',
  maxItems: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the **Integrations** tab.

#### Filters, multi-search and price monitoring

| Input | What it does |
|---|---|
| `keywordList`, `locationList` | One search per keyword x location, de-duplicated across searches. |
| `sellerType` | `private` or `trade`, from each listing's dealer flag. |
| `carMake`, `carModel`, `carYearMin`, `carYearMax`, `carMileageMin`, `carMileageMax`, `carFuelType`, `carTransmission` | Narrow vehicle results using the listing's attributes. A listing missing the attribute is skipped when its filter is set. These are applied after fetching, so a tight filter scans more pages (bounded by `maxPages`). |
| `listingStartDate` | Listings posted on or after a date, from the site's relative age (approximate to the day). |
| `priceChangeMonitoring` | `drops` or `any`. With incremental mode on, rows carry `previousPrice` and only price-changed listings are emitted. With incremental mode off there is no previous run to compare, so `drops` and `any` behave the same: they keep only listings the site itself flags as price-dropped. |

Extra output fields: `totalImages`, `status` and `phoneNumberExists` (the last two need `fetchDetails`), and `previousPrice` on updated incremental rows. On pasted search URLs every filter applies; on pasted listing URLs only make, model and year apply, because a listing page does not carry seller type, mileage, fuel, transmission or post age (the run logs a warning when other filters are set). `priceChangeMonitoring` applies to both. A listing that fails a filter is neither pushed nor billed. Filters change only which rows are kept; billing is unchanged.

### Send results into your apps (MCP connectors)

Optionally pipe the scraped listings into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step **after** the scrape: the Apify dataset is never changed.

**What gets written to the connector:** a condensed, human-readable **summary** of each listing, not the full JSON. Each item becomes one entry with a **title** and its key fields flattened to plain text. The **complete record always stays in the Apify dataset**.

1. Authorize a connector once under **Apify → Settings → Integrations** (Notion, Linear, Airtable, or Apify).
2. Select it in the **"Pipe results into your apps"** input field. (If the picker is empty, you haven't authorized a connector yet.)
3. For **Notion**, also set `notionParentPageUrl` to the page where items should be created.

The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.

### Input Parameters

| Parameter | Type | Default | Description |
| --- | --- | --- | --- |
| `mode` | string | `search` | `search` (build a query) or `url` (paste gumtree.com.au URLs). |
| `urls` | array | one example URL per supported shape (see URL table) | gumtree.com.au search or listing URLs (url mode). |
| `category` | string | `all` | Top-level vertical to search: all categories, cars and vehicles, real estate, jobs, services, and more (search mode). |
| `location` | string | none (prefill: `Sydney`) | Suburb, city, region or state (search mode). Empty searches all of Australia. |
| `keywords` | string | none | Free-text keyword (search mode). Empty browses the whole category. |
| `keywordList` | array | none | Several keywords; one search per keyword x location, de-duplicated (search mode). |
| `locationList` | array | none | Several locations; combined with `keywordList` (search mode). |
| `sellerType` | string | none | `private` or `trade` listings only. |
| `carMake` | string | none | Vehicle make filter, applied after fetching. |
| `carModel` | string | none | Vehicle model filter, applied after fetching. |
| `carYearMin` | integer | none | Earliest vehicle year. |
| `carYearMax` | integer | none | Latest vehicle year. |
| `carMileageMin` | integer | none | Minimum mileage (km). |
| `carMileageMax` | integer | none | Maximum mileage (km). |
| `carFuelType` | string | none | Vehicle fuel type filter. |
| `carTransmission` | string | none | Vehicle transmission filter. |
| `listingStartDate` | string | none | Only listings posted on or after this date (approximate to the day). |
| `priceChangeMonitoring` | string | `none` | `none`, `drops` or `any`; with incremental mode on, only price-changed listings are emitted and rows carry `previousPrice`. |
| `adType` | string | none | Retired hidden field, kept only so saved Task inputs keep loading; the value is not read and has no effect. |
| `sortBy` | string | none | Sort order: best match, most recent, price, or (for motors) mileage and year. |
| `minPrice` | integer | none | Only return listings priced at or above this amount (AUD). |
| `maxPrice` | integer | none | Only return listings priced at or below this amount (AUD). |
| `radius` | integer | none | Expand the search around the chosen location by this many kilometres. |
| `fetchDetails` | boolean | `false` | Also fetch each listing's page for the full description, precise location and seller phone. |
| `maxItems` | integer | `100` | Stop after this many listings across the whole run (`0` = no limit, bounded by Max pages; schema maximum 100000). |
| `maxPages` | integer | `0` | How many result pages to walk forward per search (24 listings per page). `0` = the built-in limit of 5 pages; values above 100 are capped at 100 pages per search. |
| `proxy` | object | Apify Residential proxy, country AU | Connection settings. |
| `resumeFromRunId` | string | none | Paste a previous run id or dataset id to continue an interrupted crawl: listings already collected there are skipped so this run returns only the delta. |
| `incrementalMode` | boolean | `false` | For a search you run on a schedule: the actor remembers the previous run itself and returns only NEW / UPDATED / REAPPEARED / EXPIRED listings, plus UNCHANGED ones if you ask for them. |
| `stateKey` | string | none | Optional label isolating one search's incremental state. Leave empty to derive it from the mode, URLs, category, location, keywords, sort, price and radius filters and the detail toggle. |
| `emitUnchanged` | boolean | `false` | Also return (and pay for) listings with no change since the previous incremental run. |
| `emitExpired` | boolean | `false` | Also return (and pay for) listings no longer found, once, with `changeType` EXPIRED. Only after a run that reached the natural end of results, never after a capped or cut-short run. |
| `ignoreFieldsForChanges` | array | none | Field names whose changes never mark a listing UPDATED in incremental mode. `age` and the `numberOfViews`, `numberOfReplies` and `numberOfOffers` counters are ignored by default (they move on their own). Entries can be top-level fields or nested paths like `seller.rating`, `seller.*` or `images[]`. |
| `mcpConnectors` | array | none | Optional: send a summary of each listing to apps you authorized under Integrations. |
| `notionParentPageUrl` | string | none | Notion connector only: page under which items are created. |
| `maxNotifyListings` | integer | `50` | Cap on items written to each connector per run. Does not affect the dataset. |

#### Resume and recurring updates

Two independent features share the `🔁 Resume & recurring updates` section.

**Resume from run** continues one interrupted crawl. Paste the interrupted run's id (or its dataset id) into `resumeFromRunId` and the run skips every listing that crawl already collected, returning only the delta. If the id cannot be read, the run stops with a clear message instead of re-collecting everything.

**Incremental mode** is for monitoring the same search on a schedule. Turn `incrementalMode` on and each run remembers the previous run itself, in a private state store keyed on your full filter set (or on `stateKey`, if you give one). Every listing is classified:

- NEW: not in the saved state.
- UPDATED: present before, with a changed field; `changedFields` names the top-level fields that changed.
- UNCHANGED: present before, nothing changed. Suppressed by default so a recurring run returns and bills only what changed; `emitUnchanged` also returns them.
- REAPPEARED: previously EXPIRED, found again.
- EXPIRED: tracked before, absent this run after the scan reached the natural end of results. Returned once with `emitExpired` on, then dropped from tracking. A capped or cut-short run never marks anything EXPIRED, so a live listing is never wrongly declared gone.

Each returned record carries `changeType`, `changedFields`, `firstSeenAt` and `lastSeenAt`. Fields that change on their own never bill a listing as UPDATED: `age` (the relative listed-time string) and the view/reply/offer counters are ignored by default, and `ignoreFieldsForChanges` lets you exclude any other field or nested path the same way.

### Output Example

> Sample shape: values are illustrative placeholders, not from a live record.

```json
{
  "id": "1300000000",
  "url": "https://www.gumtree.com.au/web/listing/cars-vans-utes/1300000000",
  "title": "2016 Toyota HiLux SR5 Dual Cab",
  "description": "One owner, full service history, tow bar and canopy included. Logbooks available, always garaged.",
  "price": 32990,
  "priceText": "$32,990",
  "priceType": "FIXED",
  "currency": "AUD",
  "vertical": "for-sale",
  "categoryId": "9299",
  "categoryName": "Cars, Vans & Utes",
  "location": "Parramatta",
  "locationArea": "Western Sydney",
  "locationState": "NSW",
  "age": "2 hours ago",
  "images": [
    "https://images.gumtree.com.au/image/private/t_$_35/move/aaaaaaaa-1111-2222-3333-444444444444"
  ],
  "imageCount": 8,
  "attributes": {
    "carmileageinkms": "98000 km",
    "carbodytype": "Ute",
    "cartransmission": "Auto"
  },
  "carVin": "MMSAAAAAAAA000000",
  "sellerName": "Example Motors",
  "seller": {
    "name": "Example Motors",
    "type": "dealer",
    "rating": 4.6,
    "reviewCount": 38,
    "ratingBadges": ["ID_VERIFIED"],
    "ratingDistribution": null,
    "reviews": null,
    "phone": "+61491570006",
    "phoneExists": true,
    "phoneVerified": false
  },
  "detailFetched": true,
  "detailStatus": "enriched",
  "fullDescription": "One owner, full service history, tow bar and canopy included. Logbooks available, always garaged.",
  "latitude": -33.8150,
  "longitude": 151.0000,
  "postcode": "2150",
  "suburb": "Parramatta",
  "state": "NSW",
  "mapAddress": "Parramatta NSW 2150",
  "numberOfViews": 340,
  "numberOfReplies": 12,
  "numberOfOffers": 3,
  "isFeatured": true,
  "scrapedAt": "2026-07-04T00:00:00+00:00"
}
```

### Plan Requirement

This actor needs residential proxy access. gumtree.com.au answers datacenter addresses with an empty 403 block page (measured 2026-10-15 through the Apify datacenter group and the automatic group), so the default is Apify Residential proxy with country set to Australia, which is included on paid Apify plans (or supply your own proxy URLs). On a free plan, which has no residential proxies, the run logs this warning and continues on a backup connection where some pages may still be unavailable:

> The selected connection is unavailable to this run. Apify free plans do not include residential proxies. Continuing on a backup connection; some pages may still be unavailable. For residential access, upgrade at https://apify.com/pricing or supply your own proxy URLs.

If the backup connection serves pages, the log notes: "Served over the backup connection (the default connection was unavailable)." If no page loads, the run fails with one of these messages instead of returning a silent empty dataset: "The proxy connection was refused for this account, so no page could be read. Your Apify plan does not include proxy access; a paid plan is required", "No results: residential proxies are unavailable on this run (Apify free plans do not include them), and the backup connection could not load the requested Gumtree pages", or "Could not load any results page (the requests failed), so nothing was collected. This is a connection problem, not an empty search."

### FAQ

#### How much does it cost?

You pay per listing returned in the dataset (the dataset-item event) plus the actor start event. Detail enrichment has its own `detail-enrichment` event, charged once per listing actually enriched when **Fetch full listing detail** is on; it is registered to take effect from 2026-10-22, so before that date enrichment is not billed. The **Pricing** tab shows the exact current rates. Use **Max listings** to cap the cost of any run.

#### Is it legal to scrape Gumtree?

This actor collects only publicly available classified listings and their aggregate seller rating. You are responsible for how you use the data: follow Gumtree's terms and the laws that apply to you, including Australian privacy law if you collect and use the seller phone numbers that detail enrichment exposes.

#### Can I run it on a schedule to catch only new listings?

You can schedule the actor from the **Schedules** tab. For recurring runs that return only what changed, turn on `incrementalMode` (see "Resume and recurring updates" under Input Parameters): each run remembers the previous one itself and returns only NEW / UPDATED / REAPPEARED / EXPIRED listings, so you no longer need to de-duplicate on your side. Without incremental mode, each scheduled run returns every listing that matches your filters again.

#### Why do some sellers show no rating?

Gumtree publishes only an aggregate rating, an overall score and how many ratings back it, never the individual buyer reviews or a star-by-star breakdown, so `reviews` and `ratingDistribution` are always `null`. Many private sellers simply have no rating yet, in which case `rating` is `null` and `reviewCount` is `0`.

#### Why did my run fail instead of returning an empty dataset?

In URL mode, a pasted listing URL that cannot be loaded at all is skipped rather than failing the run, so that run instead finishes successfully with no listings found. If no results page can be loaded at all, the run fails with a clear connection message (see Plan Requirement) rather than looking like an empty search. A search that loads but matches nothing, or an unsupported URL shape or unknown location, ends with an explanatory message.

#### Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the connector field to push a summary of each listing into Notion, Linear or Airtable.

### 🔗 Want more Gumtree data?

Pair this actor with these related scrapers from the same team:

<table>
<tr><td>🏷️ <a href="https://apify.com/abotapi/gumtree-uk-scraper"><b>Gumtree.com Scraper</b></a><br>Scrape Gumtree.com classifieds across motors, property, jobs, services, pets and goods...</td><td>🚗 <a href="https://apify.com/abotapi/easyauto123-cars-scraper"><b>EasyAuto123 Scraper</b></a><br>Scrape EasyAuto123 vehicle listings into clean structured data. Extract prices, VINs...</td></tr>
<tr><td>🚗 <a href="https://apify.com/abotapi/trademe-co-nz-scraper"><b>Trade Me NZ Scraper</b></a><br>Scrape trademe.co.nz across all five sections: Marketplace goods and auctions, Property...</td><td>🚗 <a href="https://apify.com/abotapi/carsales-au-scraper"><b>Carsales.com.au Scraper</b></a><br>Scrape structured vehicle listings from Carsales.com.au from $1 per 1K results. Built to...</td></tr>
<tr><td>🏷️ <a href="https://apify.com/abotapi/tutti-ch-scraper"><b>Tutti.ch Scraper</b></a><br>Scrape listings from tutti.ch across all 23 categories, including vehicles, property...</td><td>🏷️ <a href="https://apify.com/abotapi/olx-scraper"><b>OLX Scraper</b></a><br>Fast OLX scraper across 9 countries, including Poland, Romania, Portugal, Ukraine...</td></tr>
</table>

👉 [Browse all abotapi scrapers](https://apify.com/abotapi)

### 💬 Support

- 🐞 **Found a bug or a missing field?** Open a ticket on the [Issues tab](https://apify.com/abotapi/gumtree-au-scraper/issues/open). We usually reply within hours.
- 🛠️ **Need another site, extra fields or a private build?** Email <contact@abotapi.com>.
- ⭐ **Enjoying it?** A quick review on the actor page helps other users find it.

# Actor input Schema

## `mode` (type: `string`):

Search mode = build the query from the category / location / keyword filters below. URL mode = paste any gumtree.com.au search or listing URL you already refined in a browser (best for complex filters and sub-categories).

## `urls` (type: `array`):

gumtree.com.au search-result URLs or listing URLs. Tip: open gumtree.com.au, choose a category + location + filters, then paste the resulting URL here. In URL mode the category, location, keyword, price, sort and radius fields are ignored (the URL decides them); On pasted search URLs every seller, vehicle and listing-date filter applies; on pasted listing URLs only make, model and year apply, because a listing page does not carry seller type, mileage, fuel, transmission or post age. Price change monitoring applies to every result. Supported: category/location/keyword (k0), paginated, sorted, price-filtered and gallery search URLs across all verticals, and listing URLs (/web/listing/... or legacy /s-ad/...). Seller pages and bare /<id> links are skipped with a warning.

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

Top-level category to search. 'All categories' searches every vertical. Covers Gumtree's main verticals: motors (Cars & Vehicles), property (Real Estate), Jobs, Services, plus the for-sale goods categories.

## `location` (type: `string`):

Suburb, city, region or state to search in (e.g. 'Sydney', 'Melbourne', 'Brisbane', 'NSW'). Leave empty to search all of Australia. Names are resolved against Gumtree's own location index.

## `keywords` (type: `string`):

Free-text keyword to search for (e.g. 'toyota hilux', 'iphone 15'). Optional — leave empty to browse the whole category.

## `keywordList` (type: `array`):

Run one search per keyword (combined with the single Keyword field and every location). Results are de-duplicated across searches.

## `locationList` (type: `array`):

Run one search per location, such as 'Sydney' or 'Victoria' (combined with the single Location field).

## `sellerType` (type: `string`):

Keep only private sellers or trade/dealer sellers. Decided from the dealer flag on each listing, so it is reliable for motors. Leave empty for both. Not applied to pasted listing URLs (a listing page does not show the dealer flag).

## `carMake` (type: `string`):

Keep only vehicles of this make (for example toyota). Applied to the listing's make attribute or title. Also applies to pasted listing URLs (title fallback).

## `carModel` (type: `string`):

Keep only vehicles of this model (for example hilux). Also applies to pasted listing URLs (title fallback).

## `carYearMin` (type: `integer`):

Earliest vehicle year.

## `carYearMax` (type: `integer`):

Latest vehicle year.

## `carMileageMin` (type: `integer`):

Minimum odometer reading in km. Listings without a mileage are skipped when this is set. Not applied to pasted listing URLs (a listing page does not carry it).

## `carMileageMax` (type: `integer`):

Maximum odometer reading in km. Listings without a mileage are skipped when this is set. Not applied to pasted listing URLs (a listing page does not carry it).

## `carFuelType` (type: `string`):

Keep only vehicles with this fuel type. Not applied to pasted listing URLs (a listing page does not carry it).

## `carTransmission` (type: `string`):

Keep only automatic or manual vehicles. Not applied to pasted listing URLs (a listing page does not carry it).

## `listingStartDate` (type: `string`):

Keep only listings posted on or after this date. Gumtree publishes a relative age ('3 days ago'), so the date is approximate to the day; listings with no age are skipped. Not applied to pasted listing URLs (a listing page does not carry its post age).

## `priceChangeMonitoring` (type: `string`):

drops = only listings whose price fell; any = only listings whose price changed. With Incremental mode on it compares against your last run and sets previousPrice. With Incremental mode off there is nothing to compare, so drops and any behave the same and keep only listings the site flags as price-dropped. Applies to search results and pasted listing URLs.

## `adType` (type: `string`):

Retired. Gumtree's search API no longer carries the wanted / offering facet, so this field is kept only so saved Task inputs keep loading; the value is ignored.

## `sortBy` (type: `string`):

How to order results. Mileage / year options apply to motor listings.

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

Only return listings priced at or above this amount.

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

Only return listings priced at or below this amount.

## `radius` (type: `integer`):

Expand the search around the chosen location by this many kilometres. Leave empty for the location's default radius.

## `fetchDetails` (type: `boolean`):

Each enriched listing costs one extra page load. Enriched rows carry detailFetched=true; a row whose page could not be read keeps every search field and says detailFetched=false.

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

Maximum number of listings to return across the whole run. 0 = no limit (bounded by Max pages). Maximum 100000.

## `maxPages` (type: `integer`):

How many result pages to walk forward per search (24 listings per page). 0 = the built-in limit of 5 pages; values above 100 are capped at 100 pages per search.

## `proxy` (type: `object`):

Gumtree serves Australian visitors — Apify Residential proxy with country = AU is recommended for reliable access. IP rotation is handled automatically.

## `resumeFromRunId` (type: `string`):

Paste a previous run id or dataset id to continue an interrupted crawl: listings already collected there are skipped so this run returns only the delta. Leave empty for a normal run. Combine with incrementalMode only to bootstrap a fresh monitoring campaign from an older crawl — when incremental mode already has saved state for this search, the run stops and asks you to remove this id or use another State key.

## `incrementalMode` (type: `boolean`):

For a search you run on a schedule. When on, the actor remembers this search's previous run and classifies every listing as NEW / UPDATED / UNCHANGED / REAPPEARED / EXPIRED instead of returning the same listings every time. Compared fields: everything in the record (title, price, location, images, attributes, seller and so on). Excluded by default: scrapedAt, age and the numberOfViews / numberOfReplies / numberOfOffers counters (still present in every row); add more in the ignore-fields input. Default off (every run returns the full result set as today). Resume from run/dataset ID above must stay empty once saved state exists.

## `stateKey` (type: `string`):

Optional label to isolate this search's incremental state, useful if you run the same filters under two different schedules. Leave empty to derive the state automatically from the mode/URLs/category/location/keywords/sort/price/radius filters and the detail-enrichment toggle — two different filter setups never share a baseline.

## `emitUnchanged` (type: `boolean`):

When on, listings with no change since the previous incremental run are still returned (and billed) instead of being suppressed. Off by default so a recurring run bills only for what changed.

## `emitExpired` (type: `boolean`):

When on, listings that were tracked before but are no longer found are returned once (and billed) with changeType EXPIRED, then dropped from tracking. Only emitted after a run that reached the natural end of results for every search — a capped or time-limited run never emits EXPIRED rows, to avoid wrongly flagging a live listing as gone. Off by default.

## `ignoreFieldsForChanges` (type: `array`):

Field names whose changes never mark a listing UPDATED in incremental mode. Ignored by default: age (the site's relative listed-time string) and the numberOfViews, numberOfReplies and numberOfOffers counters, which move on their own. Add top-level field names, or nested paths like seller.rating, seller.\* or images\[].

## `mcpConnectors` (type: `array`):

Optionally send scraped results into 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; the full record stays in the dataset. 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` (type: `string`):

URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors.

## `maxNotifyListings` (type: `integer`):

Cap on items written to each connector per run. Does not affect the dataset.

## Actor input object example

```json
{
  "mode": "search",
  "urls": [
    "https://www.gumtree.com.au/s-cars-vans-utes/sydney/c18320l3003435",
    "https://www.gumtree.com.au/s-cars-vans-utes/sydney/page-2/c18320l3003435",
    "https://www.gumtree.com.au/s-cars-vans-utes/c18320",
    "https://www.gumtree.com.au/s-cars-vans-utes/nsw/c18320l3008839",
    "https://www.gumtree.com.au/s-cars-vans-utes/sydney/toyota+hilux/k0c18320l3003435",
    "https://www.gumtree.com.au/s-toyota/k0",
    "https://www.gumtree.com.au/s-all/c0",
    "https://www.gumtree.com.au/s-sydney/c0l3003435",
    "https://www.gumtree.com.au/s-cars-vans-utes/sydney/c18320l3003435?sort=date",
    "https://www.gumtree.com.au/s-cars-vans-utes/sydney/c18320l3003435?price=5000__10000",
    "https://www.gumtree.com.au/s-property-for-sale/sydney/c18364l3003435",
    "https://www.gumtree.com.au/s-jobs/sydney/c9302l3003435",
    "https://www.gumtree.com.au/web/listing/cars-vans-utes/1344633156"
  ],
  "category": "all",
  "location": "Sydney",
  "priceChangeMonitoring": "none",
  "fetchDetails": false,
  "maxItems": 100,
  "maxPages": 0,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "AU"
  },
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "maxNotifyListings": 50
}
```

# Actor output Schema

## `overview` (type: `string`):

Listing rows with price, location and seller name.

## `seller` (type: `string`):

Seller name and aggregate seller rating per listing.

## `listingDetail` (type: `string`):

Full description, suburb/state/postcode, coordinates (when detail fetching is on).

## `changes` (type: `string`):

NEW / UPDATED / REAPPEARED / EXPIRED rows with changed fields and previous price.

## `output` (type: `string`):

Run summary with total listings and request count.

# 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 = {
    "urls": [
        "https://www.gumtree.com.au/s-cars-vans-utes/sydney/c18320l3003435",
        "https://www.gumtree.com.au/s-cars-vans-utes/sydney/page-2/c18320l3003435",
        "https://www.gumtree.com.au/s-cars-vans-utes/c18320",
        "https://www.gumtree.com.au/s-cars-vans-utes/nsw/c18320l3008839",
        "https://www.gumtree.com.au/s-cars-vans-utes/sydney/toyota+hilux/k0c18320l3003435",
        "https://www.gumtree.com.au/s-toyota/k0",
        "https://www.gumtree.com.au/s-all/c0",
        "https://www.gumtree.com.au/s-sydney/c0l3003435",
        "https://www.gumtree.com.au/s-cars-vans-utes/sydney/c18320l3003435?sort=date",
        "https://www.gumtree.com.au/s-cars-vans-utes/sydney/c18320l3003435?price=5000__10000",
        "https://www.gumtree.com.au/s-property-for-sale/sydney/c18364l3003435",
        "https://www.gumtree.com.au/s-jobs/sydney/c9302l3003435",
        "https://www.gumtree.com.au/web/listing/cars-vans-utes/1344633156"
    ],
    "location": "Sydney",
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "AU"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("abotapi/gumtree-au-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 = {
    "urls": [
        "https://www.gumtree.com.au/s-cars-vans-utes/sydney/c18320l3003435",
        "https://www.gumtree.com.au/s-cars-vans-utes/sydney/page-2/c18320l3003435",
        "https://www.gumtree.com.au/s-cars-vans-utes/c18320",
        "https://www.gumtree.com.au/s-cars-vans-utes/nsw/c18320l3008839",
        "https://www.gumtree.com.au/s-cars-vans-utes/sydney/toyota+hilux/k0c18320l3003435",
        "https://www.gumtree.com.au/s-toyota/k0",
        "https://www.gumtree.com.au/s-all/c0",
        "https://www.gumtree.com.au/s-sydney/c0l3003435",
        "https://www.gumtree.com.au/s-cars-vans-utes/sydney/c18320l3003435?sort=date",
        "https://www.gumtree.com.au/s-cars-vans-utes/sydney/c18320l3003435?price=5000__10000",
        "https://www.gumtree.com.au/s-property-for-sale/sydney/c18364l3003435",
        "https://www.gumtree.com.au/s-jobs/sydney/c9302l3003435",
        "https://www.gumtree.com.au/web/listing/cars-vans-utes/1344633156",
    ],
    "location": "Sydney",
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "AU",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("abotapi/gumtree-au-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "urls": [
    "https://www.gumtree.com.au/s-cars-vans-utes/sydney/c18320l3003435",
    "https://www.gumtree.com.au/s-cars-vans-utes/sydney/page-2/c18320l3003435",
    "https://www.gumtree.com.au/s-cars-vans-utes/c18320",
    "https://www.gumtree.com.au/s-cars-vans-utes/nsw/c18320l3008839",
    "https://www.gumtree.com.au/s-cars-vans-utes/sydney/toyota+hilux/k0c18320l3003435",
    "https://www.gumtree.com.au/s-toyota/k0",
    "https://www.gumtree.com.au/s-all/c0",
    "https://www.gumtree.com.au/s-sydney/c0l3003435",
    "https://www.gumtree.com.au/s-cars-vans-utes/sydney/c18320l3003435?sort=date",
    "https://www.gumtree.com.au/s-cars-vans-utes/sydney/c18320l3003435?price=5000__10000",
    "https://www.gumtree.com.au/s-property-for-sale/sydney/c18364l3003435",
    "https://www.gumtree.com.au/s-jobs/sydney/c9302l3003435",
    "https://www.gumtree.com.au/web/listing/cars-vans-utes/1344633156"
  ],
  "location": "Sydney",
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "AU"
  }
}' |
apify call abotapi/gumtree-au-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,abotapi/gumtree-au-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/eChMZPcolgdMme7hl/builds/3eYqPNzBvhY05gkZD/openapi.json
