# Gumtree UK Scraper (`tortuga/gumtree-scraper`) Actor

Scrape Gumtree UK listings from any search URL: price, title, location, category attributes (mileage, year, bedrooms, salary), images, posting date and seller type. Cars, property, jobs, services and for-sale ads.

- **URL**: https://apify.com/tortuga/gumtree-scraper.md
- **Developed by:** [Trevor Ortega](https://apify.com/tortuga) (community)
- **Categories:** Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 listing scrapeds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Gumtree UK Scraper

Scrape Gumtree UK (gumtree.com) classified ads from any results page: price, title, area, town and postcode district, map coordinates, category attributes (make, model, year, mileage, fuel, gearbox, body type for vehicles; bedrooms, property type, availability for property; job type, contract, salary for jobs; condition for goods), photos, posting date, seller type and featured / urgent flags. Works for cars, vans and motorbikes, property to rent and for sale, jobs, services, pets, community and every for-sale category.

Paste the Gumtree URL you see in your browser (with whatever filters and sort you picked) or pick a category, a location and a keyword, and get every ad as clean JSON, CSV or Excel, or straight into your app through the API. Built for reliability: it reads the structured data Gumtree embeds in every page instead of scraping the visual layout, avoids the bot-protected `/search` route by rewriting your URL to Gumtree's canonical browse path, uses browser-grade TLS fingerprints, throttles itself and retries on a fresh proxy session when challenged, so runs finish instead of failing halfway. You pay only for the listings you get.

### What data does Gumtree UK Scraper extract?

Every ad from the results page gives you:

| Field | Description |
|---|---|
| `id`, `url` | Gumtree ad id and the ad URL |
| `title` | Ad title |
| `price`, `priceCurrency`, `priceText`, `priceFrequency` | Numeric price in GBP, the text as shown ("£3,250.00", "£900.00pm") and the rent period (`pm`, `pw`) when there is one. Jobs have no price. |
| `category`, `categoryId` | Top-level category: Motors, Property, Jobs, For Sale, Services, Pets, Community |
| `subcategory`, `subcategoryId` | Second level, e.g. Cars, Vans, To Rent, Housekeeping & Cleaning, Phones, Mobile Phones & Telecoms |
| `leafCategory`, `leafCategoryId` | The ad's own category, e.g. Honda, Apple iPhone, Domestic |
| `location` | `{area, town, postcodeDistrict, postcode}`, e.g. `{"area": "Barking", "town": "London", "postcodeDistrict": "RM8"}`. The full postcode is included for trade / business sellers only. |
| `latitude`, `longitude` | Map coordinates when the ad shows a map |
| `make`, `model`, `year`, `mileage`, `fuel`, `gearbox`, `bodyType`, `engineSize`, `colour`, `doors`, `seats` | Vehicle columns (mileage in miles, engine size in cc) |
| `propertyType`, `bedrooms`, `bathrooms`, `roomType`, `furnished`, `availableFrom` | Property columns |
| `jobType`, `contractType`, `jobLevel`, `salary`, `salaryPeriod`, `salaryMin`, `salaryMax`, `recruiter`, `recruiterType`, `closesAt`, `workingFromHome`, `immediateStart` | Job columns (`salaryMin` / `salaryMax` is Gumtree's salary band in GBP, e.g. 20000 - 24999 per annum or 12.00 - 14.99 per hour) |
| `condition` | Goods: "As good as new", "Used", ... |
| `attributes` | Every attribute Gumtree shows for the ad, as `{key: value}` (e.g. `vehicle_registration_year`, `vehicle_insurance_group`, `vrn`, `property_number_beds`, `mobile_storage_capacity`, `common_for_sale_colour`) |
| `images`, `imageCount`, `hasVideo` | Photo URLs |
| `publishedAt`, `postedText` | Posting time (ISO 8601, UTC) and the relative text ("11 days ago") |
| `sellerType`, `sellerBusinessName`, `isProAccount`, `sellerId` | `trade` or `private` (null for jobs); the recruiter name for jobs; whether the account is a Gumtree Pro business account; the numeric seller account id. Private sellers' names are never exported. |
| `isFeatured`, `isUrgent`, `isPremium`, `favouritesCount`, `deliveryAvailable`, `vat` | Ad flags and stats |
| `shortDescription`, `status` | The first 250 characters of the description; `LIVE` |
| `sourceUrl`, `scrapedAt` | The results URL the ad came from and the scrape timestamp |

Turn on **Include listing details** to also open each ad page and add:

| Field | Description |
|---|---|
| `description` | Full ad text (plain text, line breaks kept) |
| `attributes`, `attributesDetailed` | The complete attribute table (cars: running costs, performance, safety and comfort features, insurance group; every category: everything Gumtree shows), plus the list form with display names and units |
| `categoryPath` | Breadcrumb path, e.g. `["Motors", "Cars", "Honda", "Honda JAZZ"]` |
| `latitude`, `longitude`, `location` | Map coordinates and the exact area / town from the ad page |
| `sellerBusinessName` | Trade seller / business contact name (private sellers' names are not exported) |
| `sellerAdsCount`, `sellerAdsLastYear`, `sellerMemberSince`, `sellerLastActiveAt`, `sellerRating` | Seller stats as shown on the ad: live ads, ads posted in the last year, "8+ months", last active time, `{average, total}` rating |
| `phoneAvailable` | Whether the ad shows a "reveal phone number" button (the number itself is never collected) |
| `videos`, `images` | Video URLs and the full photo set |
| `createdAt`, `updatedAt`, `expiresAt` | Ad lifecycle dates |
| `employmentType`, `salaryMin`, `salaryMax` | Jobs: Google-for-Jobs employment type (FULL\_TIME, PART\_TIME, ...) and the salary band |
| `vehicleHistoryChecked` | Cars: whether Gumtree ran its vehicle history check |

### How to scrape Gumtree listings

1. Open gumtree.com, run the search you want (category, location, distance, price range, make, fuel, bedrooms, sort) and copy the URL from the address bar into **Start URLs**. Both URL styles work: `https://www.gumtree.com/search?search_category=cars&search_location=london&q=bmw&sort=date` and `https://www.gumtree.com/cars-vans-motorbikes/cars/uk/london?min_price=1000`. Or fill **Category** (`cars`, `vans`, `property-to-rent`, `property-for-sale`, `jobs`, `for-sale`, `phones`, `dogs`, ...), **Location** (`london`, `manchester`, `west-midlands`, `scotland`, `uk`, ...) and an optional **Search query**, price range, distance and sort.
2. Set **Max items** (cost cap). Optionally turn on **Include listing details**.
3. Click **Start**. Results appear in the **Dataset** tab; export as JSON, CSV or Excel, or read them through the API.

A single ad URL (`https://www.gumtree.com/p/…/1802087355`) returns that one listing with full details.

### Input example

```json
{
  "startUrls": [{ "url": "https://www.gumtree.com/search?search_category=cars&search_location=london&min_price=1000&max_price=5000&sort=date" }],
  "maxItems": 500,
  "includeDetails": false
}
```

or, by category:

```json
{
  "category": "property-to-rent",
  "location": "manchester",
  "searchQuery": "2 bedroom",
  "minPrice": 500,
  "maxPrice": 1500,
  "sort": "date",
  "maxItems": 200,
  "includeDetails": true
}
```

### Output example

```json
{
  "id": "1802087355",
  "url": "https://www.gumtree.com/p/honda/honda-jazz-hatchback-2006-semi-auto-1339-cc-5-doors/1802087355",
  "title": "Honda, JAZZ, Hatchback, 2006, Semi-Auto, 1339 (cc), 5 doors",
  "price": 3250,
  "priceCurrency": "GBP",
  "priceText": "£3,250.00",
  "priceFrequency": null,
  "category": "Motors",
  "categoryId": 2551,
  "subcategory": "Cars",
  "subcategoryId": 9311,
  "leafCategory": "Honda",
  "leafCategoryId": 10307,
  "location": { "area": "Barking", "town": "London", "postcodeDistrict": "RM8", "postcode": "RM82JR" },
  "latitude": 51.5454,
  "longitude": 0.112972,
  "make": "Honda",
  "model": "JAZZ",
  "year": 2006,
  "mileage": 74095,
  "fuel": "Petrol",
  "gearbox": "Semi-Auto",
  "bodyType": "Hatchback",
  "engineSize": 1339,
  "colour": "Silver",
  "doors": 5,
  "seats": 5,
  "attributes": { "vehicle_make": "Honda", "vehicle_model": "JAZZ", "vehicle_registration_year": "2006", "vehicle_mileage": "74095", "seller_type": "Trade", "vehicle_body_type": "Hatchback", "vehicle_transmission": "Semi-Auto", "vehicle_fuel_type": "Petrol", "vehicle_engine_size": "1339", "vehicle_colour": "Silver", "vehicle_doors": "5", "vehicle_emission": "139", "vehicle_euro_emission": "Euro 4", "vrn": "YG56DVZ" },
  "images": ["https://img.gumtree.com/ePR8PyKf84wPHx7_RYmEag/b31d96a195dd456ab9_5cf841d24c61/86"],
  "imageCount": 12,
  "hasVideo": false,
  "publishedAt": "2026-08-28T17:11:36+00:00",
  "postedText": "11 days ago",
  "sellerType": "trade",
  "sellerBusinessName": null,
  "isProAccount": false,
  "sellerId": "100694765",
  "isFeatured": true,
  "isUrgent": false,
  "isPremium": false,
  "favouritesCount": 2,
  "deliveryAvailable": false,
  "vat": "No VAT",
  "shortDescription": "2007 Honda Jazz 1.4 Petrol Automatic\nA reliable and economical Honda Jazz Automatic, presented in good condition with 74,000 miles.",
  "status": "LIVE",
  "sourceUrl": "https://www.gumtree.com/cars-vans-motorbikes/cars/uk/london?sort=date",
  "scrapedAt": "2026-09-09T18:02:11+00:00"
}
```

A property ad has `propertyType`, `bedrooms`, `availableFrom` and `priceFrequency` instead of the vehicle columns; a job has `jobType`, `contractType`, `salary`, `salaryMin`, `salaryMax`, `recruiter`, `closesAt`; a for-sale item has `condition`.

### How many listings can I get per search?

Gumtree shows about 30 ads per page and serves at most 50 pages, so one results URL yields up to about 1,500 listings. To go beyond that, split the search: by location (`london`, `manchester`, `west-midlands`, `scotland`), by subcategory (`cars` instead of `cars-vans-motorbikes`, `property-to-rent` instead of `flats-houses`), by make / fuel / bedrooms filters, or by price band (`min_price` / `max_price`). Run several URLs in one run; results are de-duplicated by ad id. Sorting by newest (`sort=date`, or **Sort: Most recent first**) is the best way to collect fresh ads on a schedule; relevance order shifts between page loads and repeats featured ads.

### Does it work for property, jobs and services, not just cars?

Yes. Every Gumtree UK category is supported: paste the results URL, or set **Category** to its slug (the value of `search_category=` in the browser URL, e.g. `property-to-rent`, `property-for-sale`, `property-to-share`, `jobs`, `computing-it-jobs`, `business-services`, `dogs`, `iphone`). The `attributes` object always carries every attribute Gumtree shows for that category; the vehicle, property and job columns are filled in whenever the attributes exist.

### Does it collect seller phone numbers or names?

No. This Actor collects public listing data only. Business / trade seller names and recruiter names are exported as `sellerBusinessName`; names of private sellers and all phone numbers are never collected. `phoneAvailable` (details only) just tells you whether the ad shows a phone button. Full postcodes are exported for trade sellers only; private ads carry the postcode district (e.g. `RM8`).

### Do I need a proxy?

Apify Proxy is enabled by default. Gumtree sits behind a bot manager that challenges the `/search` route and rate-limits bursts; the Actor uses Gumtree's canonical browse pages, throttles to a few requests per second and retries on a fresh proxy session whenever it is challenged. If a run logs many "bot challenge" warnings, switch the proxy to the RESIDENTIAL group.

### Pricing

Pay per result: a small fee for every listing saved from a results page, plus a small fee per ad page opened when **Include listing details** is on (see the Pricing tab). There is no subscription and no start fee; Apify's free plan is enough to try it.

### Integrations and API

Use the run in Zapier, Make, n8n, Google Sheets, or call it from Python/Node with the Apify client. See the **API** tab for ready-made snippets.

### Is it legal to scrape Gumtree?

This Actor collects only publicly available, non-personal listing data (no phone numbers, no names of private sellers). You are responsible for how you use the data and for complying with Gumtree's terms, UK GDPR and other applicable law.

### Support

Found a bug or need a field added? Open an issue in the **Issues** tab; it is usually answered within a day.

# Actor input Schema

## `startUrls` (type: `array`):

Gumtree UK results pages with any filters and sort applied in the browser. Both URL forms work: https://www.gumtree.com/search?search\_category=cars\&search\_location=london\&q=bmw\&sort=date and https://www.gumtree.com/cars-vans-motorbikes/cars/uk/london?min\_price=1000\&max\_price=5000. A single ad URL (https://www.gumtree.com/p/…/<id>) is also accepted and returns that one listing with full details. Leave empty if you use Category / Location / Search query instead.

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

Alternative to Start URLs: a Gumtree category slug as used in search\_category=, e.g. cars, vans, motorbikes-scooters, property-to-rent, property-for-sale, property-to-share, jobs, for-sale, phones, mobile-phones, iphone, business-services, pets, dogs. Leave empty to search all categories.

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

Used with Category / Search query: a UK town, city, region or country as Gumtree names it, e.g. london, manchester, birmingham, milton-keynes, west-midlands, scotland, england, uk. Leave empty for the whole UK.

## `searchQuery` (type: `string`):

Keyword search within the category and location, e.g. "bmw 3 series", "2 bedroom flat", "iphone 15".

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

Used with Category / Location / Search query.

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

Used with Category / Location / Search query.

## `distance` (type: `integer`):

Used with Category / Location / Search query: radius around the location in miles (1, 3, 5, 10, 15, 30, 50, 75, 100). Leave empty for Gumtree's default.

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

Used with Category / Location / Search query. Gumtree's default is relevance; 'Most recent first' is the best choice for complete, stable crawls.

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

Stop after this many listings in total (across all start URLs). Keeps cost predictable. Gumtree shows about 30 ads per page and serves at most 50 pages (about 1,500 ads) per search, so split large searches by location, subcategory or price band to get more.

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

Also open every ad page to get the full description, the complete attribute table (running costs, safety features, insurance group for cars), map coordinates, category path, seller stats (ads count, member since, rating, last active), trade seller business name, videos and created / updated / expiry dates. One extra request per listing; charged extra per listing (see pricing).

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

Apify Proxy is recommended. Gumtree sits behind Radware Bot Manager; the Actor retries on a fresh proxy session when it is challenged. If a run logs many 'bot challenge' warnings, switch to the RESIDENTIAL group.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.gumtree.com/cars-vans-motorbikes/cars/uk/london?sort=date"
    }
  ],
  "sort": "",
  "maxItems": 100,
  "includeDetails": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (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 = {
    "startUrls": [
        {
            "url": "https://www.gumtree.com/cars-vans-motorbikes/cars/uk/london?sort=date"
        }
    ],
    "category": "",
    "location": "",
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("tortuga/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 = {
    "startUrls": [{ "url": "https://www.gumtree.com/cars-vans-motorbikes/cars/uk/london?sort=date" }],
    "category": "",
    "location": "",
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("tortuga/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 '{
  "startUrls": [
    {
      "url": "https://www.gumtree.com/cars-vans-motorbikes/cars/uk/london?sort=date"
    }
  ],
  "category": "",
  "location": "",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call tortuga/gumtree-scraper --silent --output-dataset

```

## MCP server setup

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