Gumtree UK Scraper
Extract Gumtree UK listings: price, category, town, postcode, seller type, posted date, photos and full ad text. No login needed.
How it works
- 1Open it on Apify
Hit Run on Apify — it opens the tool in the cloud, no install.
- 2Set the inputs
Adjust
query,location,category(sensible defaults are pre-filled). - 3Click Run
The tool runs on Apify’s cloud and collects the data for you.
- 4Export the results
Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.
Pricing
$0.0016 per listing = $1.6 per 1,000
| You are charged for | When | Price |
|---|---|---|
| Listing returned | One classified listing returned in the dataset. Diagnostic rows and the labelled sample row are not charged. | $0.0016 |
Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-09-20, and they are what you are actually charged.
Inputs
| Field | What it does | Type |
|---|---|---|
query | What to look for, e.g. "ford focus", "sofa", "2 bed flat". Leave it empty to take everything in the category you pick. | string |
location | A UK town, city, county or postcode — "london", "leeds", "west-midlands", "OL8 3TS". Use "uk" for the whole country. Add several to run the same search in several places. Gumtree answers an unknown place with zero ads rather than an error, so a typo shows up as an empty run. | array |
category | Optional. A section ("cars-vans-motorbikes", "for-sale", "flats-houses", "pets", "jobs", "community", "business-services"), a leaf category ("cars", "property-to-rent", "dogs", "phones", "home-garden", "video-games-consoles"), or a plain label like "Cars" or "Flats to rent". 115 leaf categories are recognised. Leave empty to search everything. | array |
searchUrls | Optional. Paste Gumtree search or browse URLs instead of filling the fields above — https://www.gumtree.com/search?search_category=cars&search_location=leeds or https://www.gumtree.com/cars-vans-motorbikes/cars/uk/leeds. Filters already in the URL are kept; anything you set above overrides them. | array |
maxItems | How many listings to return in total across every search (1-50000). One returned listing is one charged result. Sample and diagnostic rows are never charged. | integer |
fetchDetails | Adds the full ad text, the attribute table (mileage, bedrooms, breed, hours), seller type, exact posted date, the full photo set and — on property ads — the postcode and map coordinates. Costs one extra page load per listing, so a 100-listing run takes roughly 90 seconds instead of 10. | boolean |
sort | Newest first is the one to use for monitoring. Note that asking Gumtree for any order other than relevance also narrows the result set it will serve. | string |
distanceMiles | Optional. How far around the location to search. Gumtree's own default radius is small, so widening this is usually the fastest way to get more results. | integer |
minPrice | Optional. Gumtree only applies a price range when a category is set — on an all-category keyword search it accepts the range and ignores it, so this Actor drops the out-of-range rows itself and does not charge for them. | integer |
maxPrice | Optional upper bound. Same caveat as the minimum. | integer |
sellerType | Private sellers or trade sellers only. Gumtree applies this inside Cars, Vans, Property and the other sections that have both; it has no effect on an all-category search. | string |
includeFeatured | Gumtree pins a handful of paid "Featured" cards to the top of every page of a search, so the same advert comes back on page 1, page 2 and page 3. They are skipped by default and not charged. Turn this on if you are tracking paid placements. | boolean |
What you get
A structured dataset — each result includes fields like:
listingIdtitlepricepriceTextlocationpostcodeAreacategoryNamesellerTypepostedAtimageCounturlExport every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.
Related tools in Developer & Research Tools
Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.
GitHub Scraper
Search GitHub repos and users: stars, forks, language, topics, licence, plus user bio, company and followers. No token needed. $0.90 per 1,000 rows.
Stack Overflow / Stack Exchange Scraper
Search Stack Overflow and Stack Exchange by keyword or tag. Score, answer count, views, reputation and body text. $2 per 1,000 questions.
Package Registry Scraper (npm + PyPI)
Get npm and PyPI package metadata as JSON. Version, license, author, repo, keywords and npm monthly downloads. $2 per 1,000 packages.
arXiv Scraper
Search arXiv papers by title, author, abstract or category. Get full abstracts, authors, categories, DOI, dates and PDF links. $2 per 1,000 papers.
OpenAlex Scholarly Works Scraper
Search 250M+ OpenAlex papers with no API key. Get titles, authors, venue, year, citations, DOI, OA links and full abstracts. $2.00 per 1,000 papers.
Crossref Scholarly Works Scraper
Search 150M+ papers on Crossref: DOI, title, authors, journal, publisher, date, citations and abstract. No API key. $1.00 per 1,000 works.
Where this tool sits
- Categories
- Developer & Research Tools
Gumtree UK Scraper: classified ads by keyword, category, town or postcode, with contact details removed
Give it a search term, a category, UK towns or postcodes, or a Gumtree URL, and it returns one row per ad with the id, title, price, category, place, photos and link. Phone numbers and email addresses are stripped out of every field before a row is written. Search results carry no posted date and only a snippet of the ad text, so if you need either, turn on Open each listing page, which makes a run roughly ten times slower.
| Input | A search term, a category, UK towns or postcodes, or Gumtree search URLs |
| Output | One row per ad |
| Ceiling | 50,000 listings per run, at 30 ads per results page |
| Account needed | None |
| Price | $1.60 per 1,000 listings, flat on every plan |
🔍 What Gumtree UK Scraper does
It reads the pages Gumtree shows a signed-out visitor, in one of two modes.
Search results only, the default, is fast: about 30 ads per page load. You get the id, title, price, town, the snippet Gumtree shows on the card, the thumbnail, the photo count and the link. On cars, vans and motorbikes the card also carries year, mileage, fuel, engine size and private or trade.
Open each listing page adds what only exists on the ad itself: the full text, the attribute table, seller type and name, the posted date, every photo and, on property ads, the postcode and map coordinates. A 50-listing run took 51 seconds with it on and about 4 with it off. Leave it off to watch a category for new ads, turn it on to build a dataset.
Sellers put their number and email in the ad body all the time, often disguised: name (at) example dot com, or a mobile broken up with spaces. Every string is scanned before it is written, and anything that looks like a phone number or an email address becomes [removed]. It errs on the side of removing too much. Prices, years, mileages, postcodes and ad ids are left alone. An audit of 451 delivered rows found no contact detail left, and the run log says how many it removed.
Paid "Featured" cards repeat at the top of every results page, so they are skipped unless you ask for them, and an ad is never returned twice in a run.
📥 What you give it
{
"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/cars-vans-motorbikes/cars/uk/leeds"]}. Both the /search?... form and the browse path work. With nothing usable to search, the run writes one free sample row and stops.
| Field | When left out | What it is |
|---|---|---|
query | none | Keywords such as ford focus or 2 bed flat. Empty takes everything in the category. |
location | the whole UK | Towns, cities, counties or postcodes: london, leeds, west-midlands, OL8 3TS. Several run the same search in several places. |
category | all | A section (cars-vans-motorbikes, for-sale, flats-houses, pets, jobs, community, business-services), a leaf slug (cars, property-to-rent, dogs, phones) or a plain label like Cars or Flats to rent. 115 leaf categories are recognised. |
searchUrls | none | Gumtree search or browse URLs. Filters in the URL are kept, and anything set in the form overrides them. |
maxItems | 100 | 1 to 50,000 listings across every search. |
fetchDetails | off | Open each listing page for the full record. One extra page load per listing. |
sort | relevance | relevance, date, price-low or price-high. |
distanceMiles | Gumtree's default | 0 to 500 miles around the location. Gumtree's own radius is small, so widening it is usually the quickest way to more results. |
minPrice, maxPrice | none | A price band in pounds. |
sellerType | any | any, private or trade. |
includeFeatured | off | Keep the paid "Featured" cards, if you are tracking paid placements. |
proxyConfiguration | not needed | Optional. Only for sending the requests through servers of your own, which are used exactly as given. |
📤 What you get back
A real row from a run on 30 September 2026, in the default mode, with the description cut short:
{
"listingId": "1515177455",
"title": "Marks & Spencer Cream Two-Seater Sofa",
"price": 0,
"priceText": "FREE",
"currency": "GBP",
"description": "Marks & Spencer two-seater sofa in cream fabric. 193cm long x 100cm deep\nStill functional and comfortable, good for a project or spare room. \nRear cor...",
"descriptionIsTruncated": true,
"categorySlug": "sofas-couches",
"categoryName": null,
"categoryPath": null,
"location": "Banstead, Surrey",
"postcode": null,
"postcodeArea": null,
"postcodeOutward": null,
"latitude": null,
"longitude": null,
"sellerType": null,
"sellerName": null,
"condition": null,
"postedAt": null,
"postedText": null,
"attributes": {},
"images": ["https://img.gumtree.com/ePR8PyKf84wPHx7_RYmEag/4c196a6991b94dbfb3_991a3c916820/86"],
"imageCount": 10,
"isFeatured": false,
"url": "https://www.gumtree.com/p/sofas-couches/marks-spencer-cream-two-seater-sofa/1515177455",
"searchUrl": "https://www.gumtree.com/search?search_location=london&q=sofa&distance=30",
"searchPage": 1,
"scrapedAt": "2026-09-30T02:27:39.016Z",
"source": "search"
}
| Field | What it is |
|---|---|
listingId, url | Gumtree's own ad id and the listing link. |
title, price, priceText, currency | price is a number in pounds: 0 for a free item, null for jobs and "please contact" ads. priceText is as shown, such as £600pm or FREE. |
description, descriptionIsTruncated | The card snippet in search mode, the full text with fetchDetails. true means you have the snippet. |
categorySlug, categoryName, categoryPath | The slug from the link, and Gumtree's breadcrumb, which only comes from the listing page. |
location, postcode, postcodeOutward, postcodeArea, latitude, longitude | Town and county as Gumtree prints them. Coordinates come on property ads, and a postcode appears where the ad or the agent gives one. |
sellerType, sellerName, condition | private, trade, agency or landlord, the seller's display name, and new or used. On motors the seller type comes from the card, elsewhere from the listing page. |
postedAt, postedAtIsApproximate, postedText, expiresAt | Listing page only. Where Gumtree shows an age such as "72 days ago", postedAt is worked out from it and postedAtIsApproximate is true. expiresAt appears only when Gumtree gives one. |
attributes | Whatever the category has: mileage, bedrooms, breed, hours, salary. |
images, imageCount | One thumbnail in search mode, the full set with fetchDetails. imageCount is the photo count either way. |
isFeatured | true on a paid placement. |
searchUrl, searchPage, scrapedAt, source | The search and page the row came from, when it was read, and search or search+listing. |
pageType, detailError | Listing pass only: which kind of listing page it was, and why a page could not be opened. That row keeps its search-result fields. |
🧾 Reading the output
| Row | How to spot it | Charged |
|---|---|---|
| A listing | no _sample and no _diagnostic field | yes |
| The sample row | _sample: true and charged: false. Only when there was nothing usable to search | no |
| A diagnostic | _diagnostic: true, ok: false, charged: false, and an errorCode | no |
Real listings carry neither ok nor charged, while the sample row carries ok: true, so filtering on ok does not work. Drop rows with _sample or _diagnostic and what is left is the listings you paid for.
errorCode | What it means |
|---|---|
NO_RESULTS | Gumtree has no ads for that search. It answers an unknown town with zero ads rather than an error, so check the spelling. |
NO_NEW_RESULTS | The search only turned up ads an earlier search in the same run had already returned. |
BAD_INPUT | A category that is not recognised, or a URL that is not a Gumtree one. |
BLOCKED, BOT_CHECK, REQUEST_FAILED | A results page did not get through. The row names the search and the page, that search stops there, and the others carry on. |
▶️ How to run it
1. Open Gumtree UK Scraper and click Try for free. 2. Fill in Search terms and Location, or paste addresses into Gumtree search URLs. 3. Pick a Category if you want a price band or Posted by to narrow the search itself. 4. Set Maximum listings, and turn on Open each listing page if you need dates and the full text. 5. Click Start, then download the dataset as JSON, CSV or Excel.
The form arrives with sofa, london and 100 already filled in, so a run started without editing it is a real search.
💰 How much does it cost?
$1.60 per 1,000 listings, flat on every Apify plan.
Not charged: the sample row, diagnostic rows, the Featured cards that are skipped, rows outside the price band you asked for, and repeats. Opening listing pages adds time, not charge. maxItems is the most listings a run can charge for.
💡 What people use it for
- Watching a category for new ads:
sortset todate, a smallmaxItems, a schedule, andlistingIdto skip what
you already have.
- Checking what the thing you are about to sell is listed for nearby.
- Rental listings with postcodes and coordinates, from the property section with
fetchDetailson. - Seeing which dealers pay for Featured placements, with
includeFeatured.
🚧 What it does not do
- No posted date in search mode. Gumtree does not put one on the cards. Sorting by
datestill returns ads in date
order.
- Some dates are approximate. Motors ads and many for-sale ads show an age, not a date, and those rows say so.
- A price band only narrows the search inside a category. On an all-category search Gumtree ignores it, so the
out-of-band rows are dropped here, uncharged, and you get fewer rows per page.
sellerTypeonly works where Gumtree has both, such as Cars, Vans and Property. An all-category search ignores
it.
- Any sort but relevance narrows what Gumtree serves. "Sofa" in London reported about 8,900 ads by relevance and
about 2,700 by date.
- 30 ads a page, fixed. A 1,000-listing pull is about 34 page loads, so for tens of thousands, split the search by
town, category or price band.
- Postcodes are patchy. Property ads carry coordinates, but a postcode only when the agent filled one in. Other
sections give the town and area and nothing more precise.
- Jobs have no price. Pay turns up in
attributeswhen the advertiser wrote it. - No seller phone or email, and nothing behind Gumtree's reveal-number button. To contact a seller, open the
listing and use Gumtree's own message button.
- Gumtree UK only. Not Gumtree Australia or South Africa.
🧭 Which classifieds scraper do you need?
| If you want | Use |
|---|---|
| Gumtree UK ads by keyword, category, town or postcode | This one |
| Craigslist listings by city and category | Craigslist Scraper |
| What things actually sold for on eBay | eBay Sold Listings Scraper |
| Classified ads in Spain from Milanuncios | Milanuncios Scraper |
| Classified ads in Brazil from OLX | OLX Brazil Scraper |
❓ Questions people ask
Do I need a Gumtree account or an API key? No. It reads the public pages a signed-out visitor sees.
How do I get the full ad text instead of the snippet? Turn on fetchDetails. The full text only exists on the listing page.
Why does postedAt carry postedAtIsApproximate: true? The ad showed an age like "1 day ago", so the timestamp was worked out from the moment of the run. Trust it to the unit Gumtree showed.
Is it legal to keep this data? These are public pages, and contact details are removed rather than collected. If you keep anything that identifies a person, that is your processing to justify under UK GDPR. Apify's write-up on the legality of web scraping is a good start, and we are not lawyers.
🆘 If something breaks
Open the Issues tab on the actor page. Send the input you used and the run ID, and the errorCode on any diagnostic row.