# Gumtree Scraper — UK Listings, Prices and Images (`s-r/gumtree-scraper`) Actor

Gumtree scraper for UK classifieds: collect numeric GBP prices, images, locations, condition, seller IDs and posting dates. Search by keyword or paste a filtered Gumtree URL. Up to 1250 deduplicated listings per search, free items included.

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

## Pricing

$1.50 / 1,000 listing returneds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

Gumtree scraper for UK classifieds: collect prices, images, locations, condition, seller identifiers and publication dates from gumtree.com to track second-hand prices, local supply and rental offers. Enter a keyword or paste a search URL, then export unique listings from the Apify dataset as JSON, CSV or Excel, or call the Actor as a Gumtree API from your own code.

### What the Gumtree scraper collects

Each result is one public advertisement. The same listing appearing on several search pages is delivered once. Featured advertisements are included by default and can be excluded with include_featured.

The supported market is Gumtree UK at gumtree.com. Goods, vehicles, property and pets use the supported listing format. Australian, New Zealand and South African Gumtree sites are separate services. Jobs and services searches are outside the current scope. The Actor reports an input error when a supplied page is outside that scope.

Results describe the public search page at collection time. An asking price is what the advertiser requested, rather than evidence of a completed sale. A listing can change or disappear after collection. Keep listing_id and fetched_at when storing snapshots so repeated collections can be compared on the same identifier.

### Use cases for Gumtree data

- **Resale pricing.** Compare asking prices for used phones, consoles, bikes or furniture before you buy stock or set a price.
- **Market monitoring.** Run the same search daily, sorted by date, and see which advertisements are new, repriced or gone.
- **Vehicle supply.** Count local car and van advertisements per make, price band and seller type.
- **Rental analysis.** Collect monthly asking rents with their payment period and postcode district for a town or area.
- **Trade versus private sellers.** Filter on seller type, or group repeated advertisements by the public seller identifier.

### Input

For a keyword search, use the following input, which was tested against actual UK listings:

```json
{"query":"iphone 13","max_items":25}
```

query is the keyword. max_items controls the maximum number of unique advertisements for the entire search, with a default of 100 and a maximum of 1250. maxItems is also accepted and takes precedence when both names are supplied. The default sorting is date, giving the newest advertisements first. The alternatives are relevance, price_asc, price_desc and distance.

For a prepared search, supply url with a Gumtree UK search or category URL. A copied URL keeps the filters and sort order chosen on Gumtree. It takes precedence over query, category, location and the other search filter fields. The Actor follows the pagination supplied by that search, including category paths.

Available keyword filters are category, location, distance_miles, price_min, price_max and seller_type. Price limits are numeric GBP amounts and require a category. Distance sorting and distance_miles require a location. Seller type accepts all, private or trade. A place name or UK postcode can be used for location. Unknown locations are reported instead of silently returning nationwide listings.

Gumtree can include advertisements outside the requested radius. Read the distance value on each returned row when geographical precision matters. Likewise, relevance ordering may change while pages are being collected. Date ordering is a better choice for repeated monitoring, although every collection still reflects a changing marketplace.

### Output

Each dataset row includes listing_id, title, url, price, currency, country, image_url, images, image_count and location. Other fields include condition, brand, description, seller_type, seller_id, is_pro_account, is_featured, is_urgent, shipping_available, delivery, posted_label, posted_at, category and attributes.

The description is the search-page teaser. The images array contains image URLs exposed on the search page; image_count describes the total reported for the advertisement and can be larger than the returned array. Brand is supplied when the source provides a vehicle make. It is null when the page does not explicitly provide a brand.

This is a selection of fields from a real advertisement collected on 5 October 2026:

```json
{
  "listing_id": "1803515361",
  "title": "Apple iPhone 13 – White, As Good As New",
  "price": 200,
  "currency": "GBP",
  "location": "Congleton, Cheshire",
  "condition": "As good as new",
  "url": "https://www.gumtree.com/p/iphone/apple-iphone-13-white-as-good-as-new/1803515361",
  "posted_at": "2026-10-05T09:55:38.488Z",
  "source": "gumtree-scraper",
  "fetched_at": "2026-10-05T10:33:13.008Z"
}
```

price is numeric and currency is GBP. A FREE advertisement has price zero. price_text retains the source display, while price_frequency records a rental period such as pm. For property comparisons, always keep that payment period beside the numeric amount. A monthly asking rent should be compared with another monthly rent. Vehicle advertisements may include a separate vat_note.

postcode_district contains the outward portion of a UK postcode. Full postcodes and vehicle registration numbers are excluded. Public seller identifiers remain available, allowing repeated advertisements from the same source account to be grouped. Phone numbers, seller names, coordinates and full detail-page descriptions are outside this Actor's output.

### Gumtree API: use the scraper from code

If you need Gumtree search results through an API, this Actor works as one: start it through the Apify API with the same JSON input as above, wait for the run, and read the dataset items. Every Apify client (JavaScript, Python, plain HTTP) works, as do schedules, webhooks and integrations such as Make, Zapier or Google Sheets. A scheduled run with a fixed url and date sorting is the simplest way to keep a daily snapshot of a Gumtree search.

### Pagination and result limits

The Actor automatically collects further pages until it reaches the requested number or the end of the accessible search. Gumtree limits a search to 50 pages, normally around 1250 ordinary advertisements. The displayed total number of matching advertisements may be much larger. Refine category, location or price filters when the accessible pages do not cover the whole search.

Duplicate listing identifiers are removed before delivery and charging. position counts the accepted rows in order. Search results are a changing collection: pagination cannot guarantee that every advertisement existing at one instant will be captured. If collection is interrupted after some rows were obtained, those rows remain available and the summary reports partial results and a warning.

The default key-value store contains OUTPUT with itemCount, status, charges, warnings and free-tier information. The errors record explains failed or empty searches. A blocked search, a timeout before a page was collected, or persistent rate limiting is reported as a failed run. A valid search with no advertisements is an empty result and has no listing charge. Starting beyond the last results page returns an explicit no-results error.

### How this Gumtree scraper compares

Several Gumtree scrapers exist in the Apify Store. They differ in which Gumtree sites they cover, whether they open each advertisement page, and how they charge.

| | This Actor | Typical alternatives |
|---|---|---|
| Market | Gumtree UK (gumtree.com) | some cover UK, Australia, New Zealand and South Africa |
| Input | keyword with filters, or any UK search or category URL | start URLs, keyword, or a fixed category list |
| Prices | numeric GBP, FREE as zero, rent period kept separately | varies by Actor |
| Duplicates | removed before delivery and charging | varies |
| Detail pages and phone numbers | not collected | offered by some, at extra cost per row |
| Charge | per delivered listing, no start fee | per row, many with a start fee or extra events for detail pages |

Choose this Actor when you need clean search-page data from Gumtree UK at a flat price per listing. Choose a detail-page scraper when you need full descriptions or contact details, or a different Gumtree country.

### Pricing

The starting price is $1.50 per 1000 unique listings, equivalent to $0.0015 for each delivered row, with no start event. Check the current Pricing tab before running. Only delivered rows generate listing events. Repeated appearances of the same advertisement do not create extra listing events, and an empty result has zero listing events.

Users without a paid Apify plan receive at most ten listings per run. The input limit and delivered dataset are capped, and listing events cannot exceed those ten rows. Paying users can request the full supported limit. OUTPUT includes freeTierDelivered, freeTierCapped and free_tier_remaining; a paying run reports minus one for the remaining free allowance.

### FAQ

#### Can I use this as a Gumtree API?

Yes. Start the Actor through the Apify API with a JSON input and read the dataset items when the run finishes. It returns the public Gumtree UK search results as structured data, so your code never has to parse the website itself.

#### Can I paste a filtered Gumtree search URL?

Yes. Paste a UK search or category URL in url. Its existing filters take precedence over the separate keyword filter fields. Individual advertisement URLs are outside the supported input.

#### Are free listings included?

Yes. Advertisements marked FREE are retained with a numeric price of zero. They count as delivered listings because their title, identifier and other listing data are still collected.

#### Why is the dataset smaller than the total shown on Gumtree?

The site's advertised matching total can exceed its accessible pages. The result also depends on your maximum, duplicate advertisements, excluded featured listings and any collection warning. The run summary describes the delivered count.

#### Does the Actor collect phone numbers or full addresses?

The output contains public search-page listing data. It returns the postcode district and public seller identifier. Full postcodes, vehicle registration numbers and contact details are outside its scope.

#### How can I compare repeated runs?

Join rows by listing_id, then compare price, condition and posted_at while retaining fetched_at. Use the source field to distinguish this Gumtree collection from another marketplace dataset. An absent listing is not proof that the item sold; it may have been removed, moved or omitted by the search ordering.

# Actor input Schema

## `query` (type: `string`):

Search keyword on Gumtree UK.

## `url` (type: `string`):

Gumtree UK search or category URL. Overrides query and filters.

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

Gumtree category slug, such as iphone or for-sale.

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

Town or UK postcode used by the search.

## `distance_miles` (type: `integer`):

Search radius in miles; requires location. Allowed values: 1, 3, 5, 10, 15, 30, 50, 75, 100, 1000.

## `price_min` (type: `integer`):

Minimum listing price in GBP; requires category.

## `price_max` (type: `integer`):

Maximum listing price in GBP; requires category.

## `seller_type` (type: `string`):

Seller filter.

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

Newest first by default; relevance may shift between pages.

## `max_items` (type: `integer`):

Maximum unique listings across the whole search.

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

Alias for max_items, taking precedence when both are supplied.

## `include_featured` (type: `boolean`):

Include featured listings once, after deduplication.

## `cursor` (type: `string`):

Opaque continuation returned as next_cursor. Keep the original input.

## Actor input object example

```json
{
  "query": "iphone 13",
  "seller_type": "all",
  "sort": "date",
  "max_items": 100,
  "include_featured": true
}
```

# Actor output Schema

## `results` (type: `string`):

One row per unique Gumtree listing.

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

Delivered rows, charges, free tier and errors.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("s-r/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 = {}

# Run the Actor and wait for it to finish
run = client.actor("s-r/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 '{}' |
apify call s-r/gumtree-scraper --silent --output-dataset

```

## MCP server setup

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