# Gumtree Scraper: UK, Australia, South Africa Ads (`automation_craft/gumtree-scraper`) Actor

Gumtree UK, Australia and South Africa classifieds in one run: keywords, categories, places, car and property filters, links, every page. Rows hold price, monthly rent (UK, AU), posted time, UK postcode area, seller type, make, mileage; details add full text, car checks. Monitor, pay per ad, API.

- **URL**: https://apify.com/automation_craft/gumtree-scraper.md
- **Developed by:** [Automation Craft](https://apify.com/automation_craft) (community)
- **Categories:** E-commerce, Automation, Real estate
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.76 / 1,000 listings

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 Scraper: UK, Australia, South Africa Ads

**Gumtree scraper** for all three Gumtree sites: gumtree.com (UK), gumtree.com.au (Australia) and gumtree.co.za (South Africa).
Search by keyword, category, place, make and the site's own filters, or paste Gumtree search links and ad links, and get one row per
ad: title, price as a number and as shown, the rent per month (UK and Australia), the exact posted time (UK and South Africa), place and UK postcode
district, category, photos, promotion flags, seller type and car data as columns (make, model, year, mileage, fuel,
transmission, body, colour; Australia with details). Turn on details for the full description, the category path, every attribute,
all photos, the seller's facts, view counts (Australia, South Africa) and car history check flags. Every page of a search is read, newest first, past the 1,250 ads
Gumtree UK serves per search. A free price summary comes with every search. A monitor delivers only new ads, and can track price
changes. No login, no cookies, no captcha.

Who uses it: car dealers and traders watching private car ads, resellers and bargain hunters following new ads, letting agents
and analysts comparing rents and prices by place, and teams feeding Gumtree ads into their sheets, apps or AI agents.

### Quick start

1. Open the **Input** tab and pick the **Gumtree site**: `uk` (the default), `au` or `za`.
2. Fill **Categories** (`cars`, `sofas`, `property-to-rent`, `jobs`, `dogs`; Australia `Cars, Vans & Utes`; South Africa `Cars & Bakkies`),
   **Places** (`manchester`, `London`, `west-yorkshire`; Australia `Bondi`, `Sydney Region`; South Africa `Benoni`, `Cape Town`)
   and **Keywords** if you like. Every category, place, keyword and make makes its own search.
3. Or paste Gumtree search links into **Search links** (each keeps its own filters) or ad links into **Ad links**.
4. Add filters: price, seller type (private or trade), condition, radius, make, model, year, mileage, fuel, gearbox, body,
   colour, bedrooms, any other filter the search offers, posted within the last N hours, words that must or must not appear.
5. Set **Maximum ads** and click **Start**. Download the rows as JSON, CSV or Excel, or read them through the Apify API.

For new ads only, give the run a **Monitor name** and schedule it: each later run delivers only the ads this monitor has not
delivered before.

### What you get

One row per ad (`type: "listing"`), one coverage row per search (`type: "search"`) with its price summary, free status rows for
anything that could not be delivered (`type: "status"`) and a run summary (`type: "summary"`). The dataset's Ads view shows
the most useful columns.

Fill rates below are measured on the platform runs of 2026-10-21 (build 0.1.2): 1,753 UK search rows from 12 runs, 55 Australian
search rows from 3 runs, 800 South African search rows from 2 runs, and rows with details: 15 UK, 5 Australian, 13 South African.

| Field | What it is | Filled on (measured) |
|---|---|---|
| `country`, `site`, `adId`, `url`, `title` | the site (`uk`, `au`, `za`), the ad's id and link, its title | every row |
| `price`, `priceText`, `currency` | the price as a number and, UK and Australia, as the site shows it ("£2,200pm", "$660 Per Week"), GBP, AUD or ZAR | price: UK 1,752 of 1,753, Australia 55 of 55, South Africa 705 of 800 (ads "on request" carry none); priceText: UK 1,752 of 1,753, Australia 55 of 55 |
| `pricePeriod`, `priceMonthly` | UK and Australian rents: the period shown (week, month) and the rent per month (a weekly rent times 52 / 12); Gumtree South Africa shows no period | every UK rent row (18 of 18); Australian rents from build 0.1.4 on |
| `postedAt`, `postedAtPrecision`, `postedAtText` | when the ad was posted: exact on the UK and in South Africa; Australia shows an age ("6 minutes ago", "Yesterday", a date), so its precision is minute, hour or day | postedAt and its precision every search row; postedAtText UK and Australia |
| `category` | name, id and, with details, the category path | id every row; name UK every row, Australia and South Africa with details |
| `location` | UK: the place text and its id (area and sub area with details); Australia: suburb and state (postcode with details); South Africa: the place text and its ref (name and path with details) | every row |
| `postcodeDistrict`, `postcode` | UK: the postcode district (`M33`, `CA3`) and, for business sellers or with personal data on, the full postcode | district 1,700 of 1,753 UK rows |
| `image`, `images`, `imageCount`, `videos` | photo links (never downloaded), how many | imageCount every row; photos UK 1,752 of 1,753, Australia 55 of 55; South Africa: links for business sellers or with personal data on (each South African photo link carries the seller's account id), the count every row |
| `description`, `descriptionSource` | the search snippet, or with details the full description | every row; full text every row with details |
| `attributes`, `specs`, `features` | the site's attributes (UK: every attribute key and value; Australia: the detail lines, with details every detail tab line, car specs and features) | UK 1,752 of 1,753, Australia 55 of 55; South Africa with details (13 of 13); specs and features Australia with details (5 of 5) |
| `vehicle` | make, model, year, mileage and unit, fuel, transmission, body, colour (UK also engine size, doors, seats, derivative, power, mpg, CO2, insurance group) | every car row: UK 503 of 503, Australian and South African car rows with details 18 of 18 |
| `vehicleCheck` | UK: whether the ad shows a vehicle history check (`checked`) and its flags (`notCategoryAOrB`, `notCategoryCOrD`, `notCategorySOrN`, `imported`, `originalNumberPlate`, `originalColour`); Australia: `ppsr` and `autoRecord` | with details: UK every row, flags on 9 of 10 car rows; Australia 5 of 5 |
| `seller` | type (private or trade) and label; with details member since, rating (UK, South Africa), ads count (UK); business sellers' name, ids, phone (Australia), address and dealer licence (Australia). UK: `seller.accountId` identifies the account; `seller.id` is the site's own seller id, which a dealer group's branches can share | type: UK when the category shows it (730 of 1,753), Australia 44 of 55, with details 32 of 33 |
| `views`, `chatCount`, `phoneRevealCount`, `favouriteCount` | Australia and South Africa: views (with details); South Africa: chats and phone reveals; UK: favourites | views every Australian and South African row with details (18 of 18); favourites every UK row |
| `expiresAt`, `allowOffers`, `delivery` | South Africa: expiry, offers allowed, delivery options | expiry every South African row; offers 498 of 800; delivery 127 of 800 |
| `flags`, `promotions` | UK: featured, urgent, premium, standout, bumped up, video, delivery; Australia: featured, top, premium, highlighted, gallery, urgent, video, and the promotion labels | flags every UK and Australian row; promotions Australia 44 of 55 |
| `change`, `possibleRepostOf`, `contentHash` | monitor rows: the price change with the previous and first seen price and history, or an update; a possible repost; a hash of the ad's content | with a monitor; the hash every row |
| `detailsIncluded`, `source`, `searchKey`, `searchLabel`, `position`, `monitorName`, `deliveryId`, `scrapedAt` | whether the record was read, which input and search delivered the row, its place in the search | every row (searchKey, searchLabel and position on search rows, monitorName on monitor rows) |

A UK car row with details (shortened; a business seller):

```json
{
  "type": "listing", "country": "uk", "adId": "1801369951",
  "url": "https://www.gumtree.com/p/bmw/bmw-2-series-218d-m-sport-5dr-dct/1801369951",
  "title": "BMW 2 SERIES 218d M Sport 5dr DCT", "price": 19950, "priceText": "£19,950.00", "currency": "GBP",
  "postedAt": "2026-10-21T13:20:16.246Z", "postedAtPrecision": "exact",
  "category": { "name": "BMW", "id": "10303", "path": ["Motors", "Cars", "BMW", "BMW 2 SERIES"] },
  "location": { "text": "Carlisle, Cumbria", "area": "Cumbria", "subArea": "Carlisle" }, "postcodeDistrict": "CA3",
  "imageCount": 51,
  "vehicle": { "make": "BMW", "model": "2 SERIES", "year": 2022, "mileage": 31976, "mileageUnit": "miles", "fuelType": "Diesel",
    "transmission": "Automatic", "bodyType": "Hatchback", "colour": "Blue", "engineSizeCc": 1995, "doors": 5 },
  "seller": { "type": "trade", "name": "Lloyd BMW Carlisle", "memberSince": "5+ years", "proAccount": true },
  "detailsIncluded": true, "source": "search", "searchLabel": "in Cars make BMW (Gumtree UK)"
}
```

A South African row with details (shortened; a private seller, personal data off):

```json
{
  "type": "listing", "country": "za", "adId": "ls263y876mj300m9fzb", "url": "https://www.gumtree.co.za/listing/ls263y876mj300m9fzb",
  "title": "2006 Toyota Corolla Sedan", "price": 35000, "currency": "ZAR",
  "postedAt": "2026-10-21T13:20:49.610Z", "expiresAt": "2026-11-20T13:20:49.610Z",
  "location": { "text": "KwaZulu-Natal > Durban > North Beach", "name": "North Beach", "ref": "s27n7" },
  "vehicle": { "make": "Toyota", "model": "Corolla", "year": 2006, "mileage": 296976, "mileageUnit": "km", "fuelType": "Petrol", "transmission": "Manual" },
  "seller": { "type": "private", "name": null, "id": null, "memberSince": "2009-05-16T07:09:02.000Z", "verified": { "identity": false, "mobileNumber": true } },
  "views": 7, "chatCount": 0, "phoneRevealCount": 5, "detailsIncluded": true
}
```

The coverage row of each search says how many ads the site counts (`adsOnSite`), how many slices and pages were read, how many ads
were met, delivered, left out by a filter (`filteredOutBy`) or as paid placements (`promotedLeftOut`), the price summary, whether the
search was read to its end (`complete`) and why it stopped (`stoppedBy`). From a real run (cars in Sydney Region, 40 ads asked):

```json
{ "type": "search", "searchLabel": "in Cars, Vans & Utes at Sydney Region (Gumtree Australia)", "adsOnSite": 17755,
  "pagesRead": 2, "distinctAdsMet": 68, "adsDelivered": 40, "promotedLeftOut": 12,
  "priceSummary": { "count": 68, "currency": "AUD", "min": 3900, "p25": 11995, "median": 21935, "p75": 34995, "max": 69888, "mean": 25112.06 },
  "complete": false, "stoppedBy": "maxItems" }
```

### How much does it cost to scrape Gumtree?

You pay per event, with Apify's store discounts by plan:

| Event | Free plan | Bronze | Silver | Gold |
|---|---|---|---|---|
| Listing (one ad row) | $1.06 per 1,000 | $0.97 per 1,000 | $0.88 per 1,000 | $0.76 per 1,000 |
| Listing details (an ad's full record read and merged) | $1.60 per 1,000 | $1.45 per 1,000 | $1.30 per 1,000 | $1.15 per 1,000 |
| Results page (monitor runs only, one search page read) | $1.40 per 1,000 | $1.30 per 1,000 | $1.20 per 1,000 | $1.00 per 1,000 |
| Actor start (once per run) | $0.0065 | $0.0065 | $0.0065 | $0.0065 |

Platinum and Diamond plans pay the Gold price. The Actor start is a flat fee per run, with no plan discount.

The Store pricing card shows these same prices per 1,000 events: "$0.76 / 1,000" on the Listing row means one ad row costs $0.00076 on
the Gold plan, less than a tenth of a cent.

- **Listing** is charged once per ad delivered as a row, from a search or an ad link; in a monitor with **Track price changes**, also per
  ad delivered again because its price, title, photos or place changed (as **Changes to deliver** asks), per ad reported removed and
  per ad that reappeared.
- **Listing details** is charged per delivered row whose full record was read and merged: every search row with **Include details**
  on, and every ad link row (an ad link is always read with its record).
- **Results page** is charged only in a monitor run (**Monitor name** set): one per search page read, whatever it held, so a monitor
  pays for checking even on a day with nothing new. A page of 30 UK, 40 Australian or 25 South African ads. A read that failed or that
  the site did not apply is free. Runs without a monitor never pay it.
- Never billed: repeats in the run, ads left out by a filter, paid placements left out, ads a monitor already delivered, ad links
  and search rows whose ad the site no longer shows or never had, changes **Changes to deliver** leaves out, invalid input, coverage rows with their price summary, status rows and the summary.
- Example on the Bronze plan: 1,000 search rows cost $0.0065 (start) + 1,000 listings ($0.97) = $0.9765. On the Free plan the same
  run costs $1.0665, on the Gold plan $0.7665.
- Example with details on the Gold plan: 100 ads cost $0.0065 + 100 listings ($0.076) + 100 listing details ($0.115) = $0.1975.
- Example of 50 ad links on the Gold plan: $0.0065 + 50 listings ($0.038) + 50 listing details ($0.0575) = $0.102.
- Example of a daily monitor on the Gold plan with 10 searches whose newest 100 ads are read (4 UK pages each) and 30 new ads:
  start ($0.0065) + 40 results pages ($0.04) + 30 listings ($0.0228) = $0.0693. A day with nothing new: $0.0465.
- A run without a monitor that delivers nothing (a keyword with no ads, a filter no ad passes) pays only the start: $0.0065.

### Input

| Setting | What it does |
|---|---|
| `country` | `uk` (gumtree.com, the default), `au` (gumtree.com.au) or `za` (gumtree.co.za): the site built searches read. Pasted links are read on their own site. |
| `keywords` | Search words, each its own search. |
| `categories` | Categories by the site's name or id: the UK's 1,729 categories (`cars`, `sofas`, `Dogs`), Australia's 593 (`Cars, Vans & Utes`, `18320`) and South Africa's 608 (`Cars & Bakkies`, `p6dnh`). A name several categories carry is a free row naming them. |
| `locations` | UK: 3,615 places by name or slug (`manchester`, `West Yorkshire`, `st-andrews-fife`); Australia: suburbs and regions through the site's own place lookup (`Bondi`, `Bondi 2026`, `Sydney Region`); South Africa: towns and suburbs through the site's lookup (`Benoni`) or its place ref. A name several places carry is a free row naming them. |
| `searchUrls` | Search links of the three sites, each with its own filters and sort; the Actor reads every page itself. |
| `adUrls` | Ad links or ids (`/p/...` UK links, `/s-ad/...` Australian links, South African links ending in `ls...` or `lr...`), each read with its full record. A removed or unknown ad is a free row. |
| `minPrice`, `maxPrice` | A price range in the site's currency, sent to the site and checked on every row. Gumtree UK filters rents per week, so a UK rent range is per week (a rent per month is compared as a week). |
| `sellerType`, `conditions`, `radius` | Private or trade sellers, item condition, a radius around the place (UK miles, Australia km; not offered by Gumtree South Africa). |
| `makes`, `models`, `minYear`, `maxYear`, `minMileage`, `maxMileage`, `fuelTypes`, `transmissions`, `bodyTypes`, `colours` | Car filters with a vehicle category; each make is its own search; models need one make. |
| `minBedrooms`, `maxBedrooms` | Property bedrooms (0 is a studio). Gumtree Australia and Gumtree South Africa offer "6 or more" (6+) as one value, so a maximum of 6 or more is a free row there (set no maximum, or one below 6). |
| `attributeFilters` | Any other filter a search offers, by the site's own name or label: `{"Doors": ["5"], "Engine size": {"min": 1000}}`. A filter or value the search does not offer is a free row listing those it does. |
| `postedWithinHours`, `postedAfter` | Only ads posted in the last N hours or since a day (UTC). A newest first search stops at the first page past it. Gumtree Australia shows an age, not a time ("6 hours ago", "Yesterday", a date): an Australian ad is kept only when everything its age can mean is inside the window ("6 hours ago" can be up to 7 hours old; a day is that day in any Australian time zone), so ads near the edge are left out free. |
| `includeKeywords`, `requireAllKeywords`, `excludeKeywords`, `excludeAdIds` | Words that must (one or all) or must not appear in the title or text (with details, the full description), and ads you already have. |
| `sort` | newest (the default), relevance (with keywords), priceLow, priceHigh, or nearest (Gumtree UK with a place). |
| `maxItems`, `maxItemsPerSearch`, `maxPagesPerSearch`, `maxRowsPerSearch` | Caps per run (100 by default), per search, pages per search, and rows read per search (a monitor's window, 100 by default). |
| `includeDetails`, `descriptionFormat`, `priceSummary`, `includePersonalData` | The full record (billed as Listing details), South Africa's HTML description as served, as text or as Markdown, the free price summary (on by default), the personal data switch (below). |
| `monitorName`, `resetMonitor`, `trackChanges`, `changesToDeliver`, `markReposts`, `skipReposts` | The monitor (below). |
| `proxyConfiguration`, `requestsPerSecond`, `maxConcurrency`, `maxRequestRetries` | Apify's datacenter proxy (the default, included in the price) or your own proxy links; the pace per site (0.5 requests a second by default). |

A run reads at most 500 searches (categories times places times keywords times makes, plus search links).

#### Every page of a search, and past it

Gumtree UK serves 50 pages (1,250 organic ads) of one search, Australia 294 pages, South Africa 375 ads. When a search counts more
ads than that and you ask for more, the Actor splits it into its child categories (and in South Africa its places), then into price
bands, reads each slice newest first and delivers every ad once. The coverage row counts the slices and says whether they met every
ad the site counted; ads without a price cannot fall into a price band and are named in the note. Measured: 1,023 dog ads of the
UK's 1,504 in 8 slices before the run's charge limit; 800 South African phone ads in slices.

#### Paid placements

Gumtree UK's featured ads and Gumtree Australia's top ads stand in the first places of every results page. They are left out free
and counted (`promotedLeftOut`); each such ad also stands at its own place in the newest first order, where it is delivered.

#### Monitor: only new ads, price changes and removed ads

Give the run a **Monitor name** and schedule it. Each run reads the newest **Rows read per search** of every search (100 by
default), pays a Results page per page read, and delivers only the ads this monitor has not delivered before; an ad is billed once per
monitor, and the ads it knows are free. With **Track price changes**, an ad met again with another price, title, photo count or place, as
the search page shows them (ad links: as the ad's record shows them), is delivered again with `change` (the previous and first seen
price, a short price history). **Changes to deliver** narrows that: all (the default), price changes only (up or down), or price
drops only (a price lower than the last one this monitor delivered); a change not asked for is noted for the next run and free.
With **Changes to deliver** at all, when every search of a tracking monitor was read to its end (each search's window holds all
of it: raise **Rows read per search**) and no posted window or ad link is set, an ad the monitor delivered before and met nowhere
has its record read: if the site no longer shows it (removed, sold or expired), it is reported once as a `type: "removed"` row
(billed as a Listing); a record that is still live counts as seen (free). Met again later, a removed ad comes back as
`changeType: "reappeared"`. A run that misses more than half of what it tracks reports no removal (a fault at the source). **Mark reposts** flags a new ad whose title, price and seller match an ad the monitor delivered.
**Reset the monitor** forgets what it delivered. One monitor name belongs to one set of settings. A monitor remembers up to
60,000 ads.

#### Personal data

With **Include personal data** off (the default), a private seller's name, seller and account ids, the masked phone the UK page
shows, the full UK postcode (the district stays), the ad's map point, a private vehicle's identifiers (VIN, number plate) and, in South Africa, the photo links (Gumtree South
Africa names every photo after the seller's account; the photo count stays) are null or left out. A seller whose kind the run cannot tell is treated as private. A business seller's name, phone, address and
dealer licence are business data and always delivered. Titles and descriptions are delivered as the site serves them, so an ad's
own text can name a person or a phone number. You are responsible for a lawful use of personal data (GDPR, POPIA, the Australian
Privacy Act).

#### How long a run takes

The Actor reads each site at 0.5 requests a second by default (**Requests per second**), one page of 25 to 40 ads per request.
Measured on the platform: 20 rows in 6 seconds; 1,023 UK rows in 117 seconds (54 requests); 800 South African rows in 102 seconds
(50 requests); 8 UK car rows with details in 23 seconds. Gumtree UK sometimes asks an address to slow down (HTTP 471): the Actor
waits 45 seconds on the same address, up to 6 times a run, and never switches to fresh addresses to get past it (5 rows with details
took 107 seconds with two such waits). A site that stops answering stops its own searches with free rows; the other sites go on.

### What this Actor does NOT do

- **No phone numbers behind a click.** Gumtree UK and South Africa show a seller's number only after a login; this Actor never
  logs in. Australian business phones the record shows are delivered; the masked number the UK page shows comes for business sellers, and for private sellers only with personal data on.
- **No radius in South Africa.** Gumtree South Africa's search offers no distance filter; use its places instead.
- **No email addresses.** No row carries one; this Actor does not look them up elsewhere.
- **No ads without a price in price band slices.** A search split into price bands cannot reach ads without a price; the coverage
  row says how many ads were met of how many the site counted.
- **No messages, no posting, no account data.**
- **No photo downloads.** Photo links only.
- **No change of fields the search page does not show.** A search monitor with details compares the record when a change on the
  search page makes it read the record, never by reading every known ad's record on every run.
- **No unpaid crawling.** A run stops with a status row when its unpaid work (pages whose ads were all filtered out, answers asked
  again) passes a small budget that grows with the events it bills: narrow the search or run it again.

### API and integrations

Run it and get the rows in one call (replace `YOUR_TOKEN`):

```bash
curl -X POST "https://api.apify.com/v2/acts/automation_craft~gumtree-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"country": "uk", "categories": ["cars"], "locations": ["manchester"], "makes": ["BMW"], "maxPrice": 15000, "maxItems": 100}'
```

Node.js:

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('automation_craft/gumtree-scraper').call({ country: 'au', categories: ['Cars, Vans & Utes'], locations: ['Sydney Region'], sellerType: 'private', includeDetails: true, maxItems: 50 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.filter((x) => x.type === 'listing'));
```

Python:

```python
from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
run = client.actor("automation_craft/gumtree-scraper").call(run_input={"country": "za", "categories": ["Cars & Bakkies"], "locations": ["Benoni"], "monitorName": "benoni-cars", "trackChanges": True})
ads = [x for x in client.dataset(run["defaultDatasetId"]).iterate_items() if x["type"] == "listing"]
```

The Actor also runs from n8n, Make and Zapier through their Apify integrations, from AI agents through Apify's MCP server, and on a
schedule in the Apify Console.

### FAQ

#### How do I scrape Gumtree listings?

Pick the country, a category, a place or a keyword, or paste a Gumtree search link, set **Maximum ads** and start the run: no code,
no login and no proxy setup. Each ad comes as one row with its price, place, posted time, photos and car data, as JSON, CSV or Excel
or through the Apify API.

#### Does it work for Gumtree Australia and Gumtree South Africa?

Yes. One Actor reads gumtree.com, gumtree.com.au and gumtree.co.za: set **Gumtree site** to `au` or `za`, or paste links of those sites.
Categories, places and the sites' own filters work on all three; South Africa has no radius filter.

#### Is there a Gumtree API for listings?

Gumtree offers no public API for its listings. This Actor works as one: call it through the Apify API and read the rows back as
JSON, in one call with `run-sync-get-dataset-items`.

#### How many ads can I get from one Gumtree search?

Every ad the search counts, up to your **Maximum ads**: past the 1,250 ads Gumtree UK serves per search (375 in South Africa), the
search is read in slices by category, place and price band, every ad delivered once. The coverage row says how many ads the site
counts, how many were delivered and whether the search is complete.

#### How do I get alerts for new Gumtree ads?

Give the run a **Monitor name** and schedule it: each run delivers only the ads this monitor has not delivered before, and with
**Track price changes** also price changes. A monitor run pays a Results page per search page it checks, so a day with nothing new costs
the start fee plus those reads.

#### Why does this Actor run with limited permissions?

It needs nothing more: it writes only to its own run's dataset and key-value store, and a monitor keeps its memory in a named
key-value store it creates itself. Limited permissions keep your other Apify data out of its reach.

### Changelog

- 0.1 (2026-10-21): first release: the UK, Australia and South Africa in one Actor; keywords, categories, places, makes, search and
  ad links; the sites' own filters, checked on every row; every page and slices past each site's reach; details with car data and
  view counts; a free price summary per search; a monitor with price change tracking and repost marks; private sellers' data behind
  the personal data switch.

### More data tools by Automation Craft

- [Kijiji Scraper: Listings, Cars, Rentals & Prices](https://apify.com/automation_craft/kijiji-scraper)
- [Craigslist Scraper: Listings, Prices & Alerts](https://apify.com/automation_craft/craigslist-scraper)
- [Marktplaats Scraper: Ads, Cars, Sellers & Alerts](https://apify.com/automation_craft/marktplaats-scraper)
- [Kleinanzeigen Scraper & API: Ads, Prices, Places](https://apify.com/automation_craft/kleinanzeigen-scraper)
- [Leboncoin Scraper: Ads, Prices, Real Estate & Cars](https://apify.com/automation_craft/leboncoin-scraper)
- [Facebook Marketplace Scraper with Sold Tracker](https://apify.com/automation_craft/facebook-marketplace-scraper)
- [OfferUp Scraper: Local Listings, Prices, Sellers](https://apify.com/automation_craft/offerup-scraper)
- [AutoScout24 Scraper: EU Car Listings & Prices](https://apify.com/automation_craft/autoscout24-scraper)

# Changelog

This Actor's version history is a separate document: https://apify.com/automation_craft/gumtree-scraper/changelog.md

# Actor input Schema

## `country` (type: `string`):

Which Gumtree the built searches read: uk (gumtree.com, the default), au (gumtree.com.au) or za (gumtree.co.za). Pasted links are read on their own site whatever this says; a bare ad id belongs to this site.

## `keywords` (type: `array`):

Search words, each one its own search (for example "sofa", "iphone 15", "bmw 320d"). Left empty, the categories and places are searched without words. Up to 100 characters each.

## `categories` (type: `array`):

Gumtree categories by the name or id the site uses, each its own search. UK: "cars", "sofas", "property-to-rent", "jobs", "dogs" (the slug in the site's links) or the name ("Sofas"). Australia: "Cars, Vans & Utes" or its id 18320. South Africa: "Cars & Bakkies", "Phones" or the ref ("hkdd7"). A name several categories share is refused with the candidates. Left empty: all categories.

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

Places to search in, each its own search. UK: a town, city, county or region as the site names it ("manchester", "London", "west-yorkshire"). Australia: a suburb or region as the site names it ("Bondi", "Bondi 2026", "Sydney Region", "Melbourne City") or its location id. South Africa: a town or suburb ("Benoni", "Cape Town") or its ref. Australian and South African places are looked up with the site's own place search; a name it gives several places for is refused with the candidates. Left empty: the whole country.

## `searchUrls` (type: `array`):

Search result links copied from gumtree.com, gumtree.com.au or gumtree.co.za (a category, place or keyword search with its filters). Each link keeps its own filters; the Actor reads every page itself, so a link with a page number other than 1 is refused.

## `adUrls` (type: `array`):

Ad links or ad ids (gumtree.com /p/... links, gumtree.com.au /s-ad/... links, gumtree.co.za links ending in an ad id such as ls26... or lr26...). Each is read with its full record and billed as a Listing plus Listing details. A removed or unknown ad is a free row.

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

Lowest price in the site's currency (GBP, AUD, ZAR). Sent to the site and checked on every row. UK rentals: per week, as Gumtree UK filters rents (a rent per month is compared as a week).

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

Highest price in the site's currency. Sent to the site and checked on every row. UK rentals: per week, as Gumtree UK filters rents (a rent per month is compared as a week).

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

any (the default), private, or trade (businesses: traders, dealers, agencies), as the search's own seller filter offers it.

## `conditions` (type: `array`):

Item condition as the site labels it (UK: "New", "As good as new", "Good condition", "Fair condition"; South Africa: "New", "Used").

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

UK: miles added around the place's own area, one of 1, 3, 5, 10, 15, 30, 50, 75, 100. Australia: kilometres, one of 2, 5, 10, 20, 50, 100, 250, 500. Needs a place. Not offered by Gumtree South Africa.

## `makes` (type: `array`):

Car or vehicle makes ("BMW", "Toyota"), each its own search, with a vehicle category such as "cars" (UK), "Cars, Vans & Utes" (Australia) or "Cars & Bakkies" (South Africa).

## `models` (type: `array`):

Models of the one make in "makes" ("3 Series", "Hilux").

## `minYear` (type: `integer`):

First registration or model year, from.

## `maxYear` (type: `integer`):

First registration or model year, to.

## `minMileage` (type: `integer`):

Mileage from: miles on Gumtree UK, kilometres in Australia and South Africa.

## `maxMileage` (type: `integer`):

Mileage to: miles on Gumtree UK, kilometres in Australia and South Africa.

## `fuelTypes` (type: `array`):

Fuel types as the site labels them ("Diesel", "Petrol", "Hybrid Electric").

## `transmissions` (type: `array`):

Gearboxes as the site labels them ("Manual", "Automatic").

## `bodyTypes` (type: `array`):

Body types as the site labels them ("Hatchback", "SUV", "Estate").

## `colours` (type: `array`):

Colours as the site labels them ("Black", "White").

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

Property: bedrooms, from (0 is a studio).

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

Property: bedrooms, to.

## `attributeFilters` (type: `object`):

Any other filter a search offers, by the site's own name or label, with a list of values or a range: {"Doors": \["5"], "vehicle_seats": \["5"], "rentals.parking_s": \["grage"], "driveType": \["4X4"], "Engine size": {"min": 1000}}. A filter the search does not offer is refused with the filters it does offer.

## `postedWithinHours` (type: `integer`):

Only ads posted in the last N hours (1 to 8760). Checked on every row; newest first searches stop at the first page past it. Gumtree Australia shows an age, not a time: an Australian ad is kept only when everything its age can mean is inside ("6 hours ago" can be up to 7 hours old; "Yesterday" is that day in any Australian time zone).

## `postedAfter` (type: `string`):

Only ads posted on or after this day (YYYY-MM-DD, UTC).

## `includeKeywords` (type: `array`):

Keep only ads whose title or text contains one of these words (all of them with "requireAllKeywords"). With details on (and on ad links), the full description is searched too.

## `requireAllKeywords` (type: `boolean`):

With "includeKeywords": an ad must contain every word, not one of them.

## `excludeKeywords` (type: `array`):

Leave out ads whose title or text contains one of these words. Checked on search rows and ad links alike.

## `excludeAdIds` (type: `array`):

Ad ids or ad links never to deliver (free).

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

newest (the default), relevance (needs keywords), priceLow, priceHigh, or nearest (Gumtree UK with a place). A pasted link keeps its own sort unless you set one.

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

The most ad rows the run delivers (and bills), over all searches and links.

## `maxItemsPerSearch` (type: `integer`):

The most ad rows one search delivers.

## `maxPagesPerSearch` (type: `integer`):

The most result pages one search reads (a page is 30 UK, 40 Australian or 25 South African ads).

## `maxRowsPerSearch` (type: `integer`):

How many result rows of each search are read at most. A monitor reads this window of each search every run (100 by default).

## `includeDetails` (type: `boolean`):

Read each ad's full record and merge it into its row: the full description, every attribute, all photos, the seller's facts (member since, rating, ads count), Australian and South African view counts, car history check flags, a business's phone (Australia). Billed as Listing details per row.

## `descriptionFormat` (type: `string`):

asServed (the default: the text exactly as the site serves it; South Africa serves HTML), text (South African HTML turned into plain text) or markdown.

## `priceSummary` (type: `boolean`):

Add a free price summary to each search's coverage row: count, lowest, quartiles, median, mean and highest of the prices met.

## `includePersonalData` (type: `boolean`):

Off by default. On: a private seller's name, seller and account ids, the masked phone the UK page shows, the full UK postcode, the ad's map point, a private vehicle's identifiers (VIN, number plate) and South African photo links (named after the seller's account) are delivered as the site shows them. Off, those fields are null for private sellers; businesses' details are always delivered. You are responsible for a lawful use of personal data (GDPR, POPIA, the Australian Privacy Act).

## `monitorName` (type: `string`):

Name a monitor to get only ads it has not delivered before: each run reads every search's newest window and bills only new ads (plus a Results page per page read). The memory is kept per name in this Actor's own storage.

## `resetMonitor` (type: `boolean`):

Forget what this monitor delivered and start again (needs a monitor name).

## `trackChanges` (type: `boolean`):

With a monitor: an ad met again with another price, title, photo count or place, as the search page shows them (ad links: as the ad's record shows them), is delivered again (change.changeType priceChanged or updated, with its previous price and price history; billed as a Listing, plus Listing details with details on).

## `changesToDeliver` (type: `string`):

With trackChanges: which changes of a known ad are delivered (and billed as a Listing): all (the default), price changes only, or price drops only (a lower price than the last one this monitor delivered). Other changes are noted for the next run and are free. Removed ads (with every search read to its end, confirmed by the ad's record) are reported only with all.

## `markReposts` (type: `boolean`):

With a monitor: mark a new ad whose title, price and seller match an ad the monitor delivered (possibleRepostOf).

## `skipReposts` (type: `boolean`):

With markReposts: leave reposts out (free).

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

Left as it is, Gumtree is read through Apify's datacenter proxy, which every Gumtree site answers. Your own proxy links (http://user:password@host:port) replace it.

## `requestsPerSecond` (type: `number`):

The pace per site, 0.1 to 1 (0.5 by default).

## `maxConcurrency` (type: `integer`):

Requests in flight per site, 1 or 2.

## `maxRequestRetries` (type: `integer`):

Tries of a failed request after the first, 0 to 5.

## Actor input object example

```json
{
  "country": "uk",
  "categories": [
    "cars"
  ],
  "locations": [
    "manchester"
  ],
  "maxItems": 20,
  "includeDetails": false,
  "priceSummary": true,
  "includePersonalData": false
}
```

# Actor output Schema

## `items` (type: `string`):

No description

# 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 = {
    "country": "uk",
    "categories": [
        "cars"
    ],
    "locations": [
        "manchester"
    ],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation_craft/gumtree-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 = {
    "country": "uk",
    "categories": ["cars"],
    "locations": ["manchester"],
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("automation_craft/gumtree-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 '{
  "country": "uk",
  "categories": [
    "cars"
  ],
  "locations": [
    "manchester"
  ],
  "maxItems": 20
}' |
apify call automation_craft/gumtree-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation_craft/gumtree-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/dbtlGOzu2Gzsv1qCe/builds/ryVK2P2qwmywi1Hyc/openapi.json
