Gumtree UK Scraper - Classified Ads & Listings avatar

Gumtree UK Scraper - Classified Ads & Listings

Pricing

from $1.60 / 1,000 listing returneds

Go to Apify Store
Gumtree UK Scraper - Classified Ads & Listings

Gumtree UK Scraper - Classified Ads & Listings

Scrape Gumtree UK classifieds: ad id, title, price, category, town and postcode, seller type, posted date, full ad text, attributes and photos. Search by keyword, category, town or postcode, or paste a Gumtree URL. No login, no API key. Phone numbers and emails are stripped from every field.

Pricing

from $1.60 / 1,000 listing returneds

Rating

0.0

(0)

Developer

Dami's Studio

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 hours ago

Last modified

Share

Gumtree UK Scraper

Pulls listings off Gumtree UK and writes one dataset row per ad: the ad id, title, price, category, town, seller type, posted date, description, photos and the listing URL.

Search by keyword, by category, by town or postcode, or just paste the Gumtree search URL you already have open in a tab. No account, no cookies, no API key.

Phone numbers and email addresses are stripped out of every text field before the row is written. Sellers type their mobile into the ad body constantly and Gumtree does nothing about it, so this Actor does. More on that below, including what it means for your data.


What you get

Two modes, and the difference between them is worth understanding before you start a big run.

Search results only (the default) is fast: roughly 30 ads per page load. You get the id, title, price, town, the short description Gumtree shows on the card, the thumbnail, the photo count and the listing URL. On Cars, Vans and Motorbikes you also get year, mileage, fuel, engine size and whether the seller is private or trade, because Gumtree puts a spec strip on those cards.

Open each listing page (fetchDetails: true) adds the things that only exist on the ad itself: the full description, the attribute table, seller type and seller name, the exact posted date, the whole photo set and, on property ads, the postcode and map coordinates.

It costs one extra page load per listing. A 50-listing run took 51 seconds with it on and about 4 seconds with it off, measured on this Actor. If you are monitoring a category for new ads, leave it off. If you are building a dataset you will analyse later, turn it on.

A real row

{
"listingId": "1802135686",
"title": "2015 Ford Focus 2.0T EcoBoost ST-2 Euro 6 (s/s) 5dr HATCHBACK Petrol Manual",
"price": 6695,
"priceText": "£6,695",
"currency": "GBP",
"description": "Full service history, two keys, HPI clear. MOT until August.",
"descriptionIsTruncated": false,
"categorySlug": "ford",
"categoryName": "Ford FOCUS",
"categoryPath": "Motors > Cars > Ford > Ford FOCUS",
"location": "Headingley, West Yorkshire",
"postcode": null,
"postcodeArea": null,
"postcodeOutward": null,
"latitude": null,
"longitude": null,
"sellerType": "trade",
"sellerName": "LEEDS AUTO SALES LTD",
"condition": "Used",
"postedAt": "2026-09-18T14:02:11.000Z",
"postedAtIsApproximate": true,
"postedText": "1 day ago",
"expiresAt": null,
"attributes": {
"Seller Type": "Trade",
"Posted": "1 day ago",
"Year": "2015",
"Mileage": "103,149 miles",
"Body Type": "Hatchback",
"Transmission": "Manual",
"Colour": "Blue",
"Seats": "5",
"Doors": "5"
},
"images": ["https://img.gumtree.com/ePR8PyKf84wPHx7_RYmEag/..."],
"imageCount": 35,
"isFeatured": false,
"url": "https://www.gumtree.com/p/ford/2015-ford-focus-.../1802135686",
"searchUrl": "https://www.gumtree.com/search?search_location=leeds&search_category=cars&q=ford+focus",
"scrapedAt": "2026-09-19T14:02:11.000Z",
"source": "search+listing"
}

A property ad fills in postcode, postcodeArea, postcodeOutward, latitude and longitude. A job ad has no price at all, so price is null and the salary, hours and contract type turn up in attributes.


Input

The minimum is a location, or a search term, or a category. Anything else is optional.

{
"query": "ford focus",
"location": ["leeds"],
"category": ["cars"],
"maxItems": 200,
"distanceMiles": 30,
"sort": "date",
"sellerType": "private",
"fetchDetails": true
}

Or paste URLs and skip the form:

{
"searchUrls": [
"https://www.gumtree.com/search?search_category=property-to-rent&search_location=manchester",
"https://www.gumtree.com/cars-vans-motorbikes/cars/uk/leeds"
],
"maxItems": 500
}

Both URL shapes work: the /search?… form and the browse path. Filters already in the URL are kept; anything you set in the form overrides them.

FieldWhat it does
queryKeywords. Leave empty to take the whole category.
locationA town, city, county or postcode. "uk" for the whole country. Several run the same search in several places.
categoryA section, a leaf category, or a plain label. 115 leaf categories are recognised.
searchUrlsPaste Gumtree URLs instead of filling the fields.
maxItemsTotal listings across every search. One listing is one charged result.
fetchDetailsOpen each listing page for the full record.
sortMost relevant, newest, cheapest or dearest.
distanceMilesRadius around the location. Gumtree's own default is narrow, so widening this is usually the quickest way to more results.
minPrice / maxPricePrice band in pounds. See the caveat below.
sellerTypePrivate or trade.
includeFeaturedKeep Gumtree's paid "Featured" cards. Off by default.

Categories

Pass a section (cars-vans-motorbikes, for-sale, flats-houses, pets, jobs, community, business-services), a leaf slug (cars, property-to-rent, dogs, phones, home-garden, video-games-consoles, music-instruments, freebies), or a plain label. "Cars", "Flats to rent", "Puppies" all resolve. If a name is not recognised the run writes an uncharged row telling you so instead of quietly searching everything.


What this does not do

This is the section people skip and then file a support ticket about, so it is near the top.

Search results carry no posted date. Gumtree does not put one on the cards. If you need to know when an ad went up, turn on fetchDetails. The one exception is that sorting by newest gets you the ads in date order even without the timestamps.

Some posted dates are approximate. Motors ads and a lot of for-sale ads render the age as text rather than a date: "17 mins ago", "72 days ago". Those are converted to a timestamp relative to when the run happened, and the row carries postedAtIsApproximate: true so you can tell which ones are exact and which are derived. Property ads and most for-sale ads carry a real date and come back exact.

A price range only narrows the search inside a category. On an all-category keyword search Gumtree accepts min_price and max_price and then ignores them. Rather than hand you rows outside the band you asked for, this Actor drops them itself and does not charge for them, but it means a tightly-banded all-category search returns fewer rows per page than you might expect. Pick a category and Gumtree does the filtering properly.

sellerType only applies where Gumtree has both. Cars, Vans, Property and the other sections with a private/trade split honour it. An all-category search ignores it.

Asking for any sort other than relevance narrows the result set. This is Gumtree's behaviour, not a bug here: a "sofa in London" search reports about 8,900 ads sorted by relevance and about 2,700 sorted by date, because relevance mode pulls in adjacent categories and date mode does not.

30 results per page, and that is fixed. Gumtree accepts pageSize, size and perPage and ignores all three. Deep runs are page loads, so a 1,000-listing pull is about 34 of them.

An unknown town is not an error. Gumtree answers "0 ads in zzzznotaplace" with a normal page, so a typo in the location shows up as an empty run. When a search returns nothing the Actor writes an uncharged row saying so and reminding you to check the spelling.

Postcodes and coordinates are property-only, and the postcode depends on the agent. Property ads carry map coordinates reliably; whether they carry a postcode depends on what the letting agent filled in, so expect it on some and not others. Other sections give you the town and neighbourhood ("Headingley, West Yorkshire") and nothing more precise, because that is all Gumtree publishes. When a postcode does appear in a title or a location line it is picked up anyway and split into postcode / postcodeOutward / postcodeArea.

Jobs have no price. price and priceText are null on job ads; pay shows up in attributes when the advertiser filled it in, which many do not.

Featured ads are skipped by default. Gumtree pins a handful of paid cards to the top of every page of a search, so the same advert reappears on page 1, page 2 and page 3. They are dropped and not charged. Set includeFeatured: true if you are specifically tracking paid placements.

Gumtree sometimes asks a request to prove it is a browser. It is rare, and the Actor retries and carries on. If a page genuinely cannot be fetched, the run writes an uncharged row naming the search and the page number rather than pretending the search was empty.


Contact details are removed

Classifieds are written by people who want to be phoned, so ad bodies are full of mobile numbers and email addresses, often deliberately mangled to get past Gumtree's own filter. Every string this Actor emits is scanned before it is written, and anything that looks like a phone number or an email address is replaced with [removed].

What it looks for: email addresses in plain form and obfuscated form (name (at) example dot com, name[at]example.co.uk); UK mobile and landline numbers in every separator style, with or without the leading zero, with or without +44; and any run of eleven or more digits sitting in ad copy.

It errs on the side of removing too much. A redacted product code is a nuisance; a published mobile number is somebody's phone ringing. Prices, years, mileages, dimensions, postcodes and Gumtree's own ad ids are left alone. Those were checked against real listings, not assumed.

Gumtree already masks the number in its own contact panel (0788275XXXX) and this Actor does not collect it, the seller's email, or the token behind the "reveal number" button. If you need to contact a seller, use the listing URL in the row and Gumtree's own message button.

The run log tells you what was removed: "Removed contact details from 8 listing(s): 8 phone number(s) and 0 email address(es)."


Billing

One returned listing is one charged result. That is the whole model.

Nothing else bills:

  • the sample row you get back from an empty run
  • diagnostic rows: an unknown category, a search that found nothing, a page that did not load
  • paid "Featured" cards that were skipped
  • rows dropped because they fell outside the price range you asked for

So a run that finds nothing costs you the run fee and nothing more, and a run that returns 87 listings charges for 87.

maxItems is a hard ceiling, so it is also your budget control: set it to what you are willing to pay for and the run stops there.


FAQ

Does this need a Gumtree account or an API key? No. It reads the same public pages a signed-out visitor sees. There is no login, no cookie and no key to supply.

Can it scrape Gumtree Australia or South Africa? No. This one is Gumtree UK (gumtree.com) only. The other Gumtree sites run on different software and would need a different Actor.

How do I get the full ad text instead of the two-line summary? Set fetchDetails to true. The search page only carries a truncated snippet; the full body only exists on the listing page.

How many listings can I get from one search? Gumtree serves 30 per page and paginates deep, so several hundred from one search is routine. If you need tens of thousands, split the search by town, by sub-category or by price band rather than paging one broad search forever. Narrower searches also return fresher, more relevant ads.

Can I monitor a category for new ads? Yes. Set sort to date, keep maxItems small, and run it on a schedule. Each row carries listingId, so de-duplicating against what you already have is a single comparison.

Why is the seller's phone number missing? It is removed on purpose. See the section above. Gumtree masks it too.

Why did my run return one row that says _sample? That is what an empty input produces: a labelled example row so you can see the output shape. It is not charged. Fill in a location, a search term or a category and run it again.

Why does postedAt say 2026-09-19T14:02:11Z with postedAtIsApproximate: true? Because the ad rendered "1 day ago" rather than a date, so the timestamp was worked out from when the run happened. Treat it as accurate to the unit Gumtree showed.

Can I use my own proxies? Yes. Put them in proxyConfiguration.proxyUrls and they are used exactly as given. You do not need to.

What happens if Gumtree blocks a page? The request is retried. If it still cannot get through, you get an uncharged row naming the search and the page, so a partial run is visible rather than silent.


Output fields

FieldNotes
listingIdGumtree's own ad id, from the listing URL
title
priceNumber in pounds. 0 for a free listing, null for jobs and "please contact" ads
priceTextAs shown: "£6,695", "£600pm", "Free"
currency"GBP" when there is a price
descriptionCard snippet in search mode, full body with fetchDetails. Contact details removed
descriptionIsTruncatedtrue when it is the card snippet
categorySlugFrom the listing URL
categoryName, categoryPathThe breadcrumb Gumtree shows. Listing pass only
locationTown and county as Gumtree prints it
postcode, postcodeOutward, postcodeAreaProperty ads, and anywhere a postcode is written into the text
latitude, longitudeProperty ads
sellerTypeprivate, trade, agency or landlord. On motors this comes from the search card; elsewhere it needs the listing pass
sellerNameThe seller's display name on Gumtree. Listing pass only
conditionNew or Used where Gumtree states it
postedAt, postedAtIsApproximate, postedTextListing pass only
expiresAtWhen Gumtree publishes one
attributesWhatever the category has: mileage, bedrooms, breed, hours, engine size
images, imageCountOne thumbnail in search mode, the full set with fetchDetails. imageCount is the number of photos on the ad either way
isFeaturedtrue for Gumtree's paid placements
url, searchUrl, searchPageThe listing, and the search it came from
scrapedAt, source"search" or "search+listing"

Diagnostic rows carry _diagnostic: true, charged: false and an errorCode: BAD_INPUT, NO_RESULTS, NO_NEW_RESULTS, BLOCKED, BOT_CHECK or REQUEST_FAILED, plus a plain-English error and hint. Filter on ok === true if you only want listings.


This reads pages that Gumtree serves publicly to anyone, signed out. It does not log in, does not create accounts, and does not touch anything behind Gumtree's contact-reveal button. Personal contact details are removed from the output rather than collected.

You are responsible for what you do with the data. If you are in the UK or the EU and you intend to keep anything that identifies a person, that is your processing to justify under UK GDPR, not Gumtree's and not this Actor's.