Gumtree UK - Classifieds, Prices, Sellers & Reviews
Pricing
from $1.30 / 1,000 listing results
Gumtree UK - Classifieds, Prices, Sellers & Reviews
Scrape gumtree.com classifieds across motors, property, jobs, services, pets and goods for sale. Extract titles, descriptions, prices, photos, locations, listing attributes, seller ratings, star distributions and reviews. Supports keyword, category, location and URL modes.
Pricing
from $1.30 / 1,000 listing results
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
7 days ago
Last modified
Categories
Share
Gumtree UK Scraper: Listings, Prices, Seller Ratings and Contact Details
Gumtree UK Scraper turns gumtree.com classifieds into structured data. Get the title, price, photos, category attributes and map location for any listing across every vertical, motors, property, jobs, services, pets, community and the general for-sale categories, plus the seller's aggregate rating, star breakdown and individual reviews once full listing detail is on. Search by category, location and keyword, or paste a gumtree.com results URL you already refined in a browser, then export to JSON, CSV or Excel, or read the dataset through the API.
Why This Scraper?
- Two ways in. Build a search from category, location and keyword filters, or paste a gumtree.com results URL you already refined in a browser, sub-categories and the sort, price, keyword, location, make and seller-type filters included.
- Every vertical, one record shape. Motors, property, jobs, services, pets, community and the general for-sale categories all come back with the same clean fields.
- Full listing detail on demand. Switch on the full description, map coordinates, postcode and the richer grouped attribute set per run, and pay only when a listing is actually opened.
- Seller trust signals. Aggregate rating, the count per star, individual reviews and activity stats, captured from the listing page.
- Optional seller phone reveal. Get the seller's full number instead of Gumtree's masked form, with a clear per-listing status whenever one is not available.
- Built for schedules. Incremental mode returns only new, changed, reappeared or expired listings on recurring runs, and Resume continues one interrupted crawl without re-billing what it already collected.
- Fails loud, not quiet. A run that could not read the site stops with a clear message instead of reporting a false "no listings".
Use Cases
- Car buyers and dealers: track new and price-changed listings for specific makes and models to spot underpriced cars quickly.
- Letting agents and house hunters: monitor new property listings in target towns as soon as they appear.
- Resellers and price researchers: benchmark second-hand prices for a product category across the whole UK.
- Local trade and job seekers: watch new services and jobs postings in a region.
- Buyer due diligence: check a seller's aggregate rating, star breakdown and review history before making contact.
Data You Get
Sample shape: values are illustrative placeholders, not from a live record.
| Field | Example |
|---|---|
id | "3300118842" |
url | "https://www.gumtree.com/p/renault-clio/renault-clio-1-5-dci-dynamique/3300118842" |
title | "Renault Clio 1.5 dCi Dynamique, 2017, Diesel" |
price / priceText | 4250.0 / "£4,250" |
currency | "GBP" |
vertical | "motors" (also "for-sale", "jobs") |
categoryName | "Cars" |
location / distance | "Bristol" / "5 miles" |
postedDate / postedTimestamp | "3 days ago" / "2026-06-20T09:15:00Z" |
attributes | [{ "name": "Mileage", "value": "58,400", "key": "vehicle_mileage", "unit": "miles" }] |
images / imageCount | array of photo URLs / 9 |
urgent / featured / premium | false / true / false |
detailFetched | true (only once detail enrichment has run for this listing) |
description | "Well looked after, one previous owner, full service history..." |
latitude / longitude / postcode | 51.4545 / -2.5879 / "BS1 4DJ" |
seller.name / seller.type | "Tom H" / "private" (or "trade") |
seller.rating / seller.reviewCount | 4.6 / 18 |
seller.ratingDistribution | { "1": 0, "2": 0, "3": 1, "4": 3, "5": 14 } |
seller.phone / seller.phoneMasked / seller.phoneStatus | "07700 900123" / "0770090XXXX" / "revealed" |
seller.postingSince / seller.totalAdvertCount | "2 years" / 5 |
scrapedAt | "2026-06-23T10:00:00Z" |
Every record also carries category ids (l1CategoryId, l2CategoryId), ad-type flags (standout, bumpup, proAccount, favouriteCount), and address fields (area, subArea, address); with detail enrichment on, motors listings can additionally carry vehicleHistoryCheck, videoUrls and questionsAndAnswers, and services sellers carry a seller.skills list. In incremental mode every record also carries changeType, changedFields, firstSeenAt and lastSeenAt.
How to Use
- Pick a mode:
search(build the query from category, location and keyword) orurl(paste a gumtree.com results URL). - In search mode, choose a category, an optional location and keyword, then narrow by price and sort order if you need to.
- Turn on Fetch full listing detail for the description, map location and seller rating and reviews, and Also reveal the seller's phone number if you need the full contact number.
- Set Max listings and Max pages to bound the run, then click Start. Download as JSON, CSV or Excel, or read the dataset through the API.
Cars in a price band, with full detail:
{"mode": "search","category": "cars","location": "London","minPrice": 5000,"maxPrice": 8000,"fetchDetails": true,"maxItems": 50}
A national keyword search, results-page fields only:
{"mode": "search","category": "all","keywords": "iphone","fetchDetails": false,"maxItems": 30}
Paste a results URL you already refined in a browser:
{"mode": "url","urls": ["https://www.gumtree.com/cars-vans-motorbikes/cars/uk/london"],"fetchDetails": false,"maxPages": 2,"maxItems": 60}
Reveal the seller's phone number:
{"mode": "search","category": "cars","location": "Manchester","fetchDetails": true,"revealSellerPhone": true,"maxItems": 20}
urls accepts gumtree.com search or category results pages, keeping the sub-category and the sort, price, keyword, location, make and seller-type filters from the URL; any other filter parameter in the pasted link is dropped, and paging then follows the site's own next-page links from that filtered first page. A single listing page URL is not accepted in this mode.
Run it from your code
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("abotapi/gumtree-uk-scraper").call(run_input={"mode": "search", "category": "cars", "location": "London", "maxItems": 50})for listing in client.dataset(run["defaultDatasetId"]).iterate_items():print(listing["title"], listing["priceText"])
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('abotapi/gumtree-uk-scraper').call({mode: 'search', category: 'cars', location: 'London', maxItems: 50,});const { items } = await client.dataset(run.defaultDatasetId).listItems();
Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.
Seller phone numbers
Gumtree shows a seller's phone number in full only to a signed-in visitor; everyone else sees it masked, for example 0770090XXXX. Turn on Also reveal the seller's phone number and the actor signs in through an account it manages and caches securely for itself, reused by every later run, so each listing then carries the full number in seller.phone. It needs detail enrichment, which is switched on automatically, and it adds no extra request or charge per listing: the number arrives in the detail fetch that already happens.
Not every seller publishes a number, and seller.phoneStatus is only set at all when the listing page itself was read (it stays null if detail enrichment was off, the fetch failed, or a near-timeout shortcut skipped it). When it is set, the values are:
seller.phoneStatus | Meaning |
|---|---|
revealed | seller.phone holds the full number |
no-phone | Gumtree confirmed this seller published no number at all |
not-requested | the option was off for this run, or sign-in itself failed before any reveal was attempted |
session-expired | signed-in access lapsed mid-run; it renews automatically on the next run |
refused | the site did not honour the reveal for this particular listing |
unavailable | this listing's contact details could not be read at all |
seller.phoneMasked always carries the masked form Gumtree shows publicly, so nothing is lost either way. Phone numbers are personal data: keep collecting and using them lawful and proportionate under UK GDPR and Gumtree's terms, as the operator of this run.
Resume and recurring updates
- Resume (
resumeFromRunId) continues one interrupted crawl: paste its run or dataset id and this run still walks every result page from the start of the search, but skips every listing id that run already collected, so pagination is never cut short by the dedup and you are not billed twice for the same listing. - Incremental mode (
incrementalMode) is for scheduling this actor against the same search repeatedly. Each listing is classifiedNEW,UPDATED(withchangedFields),UNCHANGED(suppressed and not billed unlessemitUnchangedis on),REAPPEARED, orEXPIRED.EXPIREDis only produced, and a listing is only marked gone in the stored state, after a run that reaches the natural end of results for every search in the call, withemitExpiredon and no Resume id set; a capped, time-limited, or resumed run leaves the previous state untouched instead of guessing that a listing is gone.REAPPEAREDcan therefore only happen for a listing a prior run already marked gone this way.stateKeynames or shares the stored state; leave it empty and the actor derives one automatically from the mode, category, location, keyword, sort, price filters and the detail-enrichment toggle, so two different filter setups never share a baseline. With Incremental mode off, output is exactly as before.
Send results into your apps (MCP connectors)
Optionally pipe the scraped listings into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape: the Apify dataset is never changed.
What gets written to the connector: a condensed, human-readable summary of each listing, not the full JSON. Each listing becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.
- Authorize a connector once under Apify → Settings → Integrations (Notion, Linear, Airtable, or Apify).
- Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
- For Notion, also set
notionParentPageUrlto the page where listings should be created.
The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | string | search | Pick search to build the query from the filters below, or url to paste gumtree.com results URLs. |
urls | array | (none, prefill: one sample URL) | gumtree.com search or category results pages to walk (URL mode). A single listing page URL is not accepted here. |
category | string | all | Category to search: all (for-sale goods), motors, cars, property, jobs, services, pets, or community. |
location | string | (none, prefill London) | Town, city or region. Empty searches all of the UK. |
keywords | string | (none) | Free-text keyword search, optionally narrowed by location. |
sortBy | string | (none, site's relevance order) | best_match, most_recent, price_asc, price_desc, or nearest. |
minPrice | integer | (none) | Only return listings priced at or above this amount (GBP). |
maxPrice | integer | (none) | Only return listings priced at or below this amount (GBP). |
fetchDetails | boolean | true | Open each listing for its full description, map location, richer attributes and the seller's rating, reviews and activity stats. Adds a detail-enrichment charge per listing actually opened. |
revealSellerPhone | boolean | false | Return the seller's full phone number in seller.phone instead of Gumtree's masked form. Needs detail enrichment, which is switched on automatically; adds no extra charge. |
maxItems | integer | 100 | Maximum listings to return across the whole run. 0 = no limit (bounded by Max pages). |
maxPages | integer | 5 | Result pages to walk forward per search (30 listings per page). |
resumeFromRunId | string | (none) | Continue one interrupted crawl: listings already collected under this run/dataset id are skipped. |
incrementalMode | boolean | false | For scheduled runs of the same search: classify each listing as NEW / UPDATED / UNCHANGED / REAPPEARED / EXPIRED against the previous run instead of returning everything again. |
stateKey | string | (none, auto-derived from the filters) | Optional label to isolate this search's incremental state. |
emitUnchanged | boolean | false | Also return (and bill) UNCHANGED listings instead of suppressing them. |
emitExpired | boolean | false | Also return (and bill) listings no longer found, once, after a run that completes a full scan of every search. |
proxy | object | { "useApifyProxy": true } | Connection settings; the default automatic setting rotates connections for you. |
mcpConnectors | array | (none) | Optionally send a summary of each listing to apps you authorized under Integrations. |
notionParentPageUrl | string | (none) | Notion connector only: page under which item pages are created. |
maxNotifyListings | integer | 50 | Cap on items written to each connector per run. Does not affect the dataset. |
Output Example
Sample shape: values are illustrative placeholders, not from a live record.
{"id": "3300118842","url": "https://www.gumtree.com/p/renault-clio/renault-clio-1-5-dci-dynamique/3300118842","title": "Renault Clio 1.5 dCi Dynamique, 2017, Diesel","price": 4250.0,"priceText": "£4,250","currency": "GBP","categoryId": "9311","categoryName": "Cars","vertical": "motors","location": "Bristol","distance": "5 miles","postedDate": "3 days ago","postedTimestamp": "2026-06-20T09:15:00Z","shortDescription": "One owner, full service history, new MOT","description": "Well looked after Renault Clio, one previous owner, full service history, two keys, recently serviced with a new MOT.","images": ["https://img.gumtree.com/bbbbbbbb/5555555555_6666666666/max800","https://img.gumtree.com/bbbbbbbb/7777777777_8888888888/max800"],"imageCount": 9,"attributes": [{ "name": "Make", "value": "Renault", "key": "vehicle_make" },{ "name": "Year", "value": "2017", "key": "vehicle_registration_year" },{ "name": "Mileage", "value": "58,400", "key": "vehicle_mileage", "unit": "miles" },{ "name": "Fuel type", "value": "Diesel", "key": "vehicle_fuel_type" }],"latitude": 51.4545,"longitude": -2.5879,"postcode": "BS1 4DJ","detailFetched": true,"seller": {"name": "Tom H","type": "private","rating": 4.6,"reviewCount": 18,"ratingDistribution": { "1": 0, "2": 0, "3": 1, "4": 3, "5": 14 },"reviews": [{ "rating": 5, "text": "Straightforward sale, car as described.", "date": "2026-05-02" }],"postingSince": "2 years","totalAdvertCount": 5,"phone": "07700 900123","phoneMasked": "0770090XXXX","phoneStatus": "revealed"},"scrapedAt": "2026-06-23T10:00:00Z"}
Plan Requirement
The default proxy setting works out of the box, and the run automatically retries with a different connection when one is refused. For large or frequent runs, the residential proxy group gives more headroom; pick it under Connection. Billing follows the Pricing tab: a run start fee, a charge per listing returned, and a further charge per listing but only for listings where Fetch full listing detail actually opened that listing's page. Revealing the seller's phone number adds no charge of its own.
FAQ
How much does it cost?
You pay a run start fee, a charge per listing returned, and a further detail-enrichment charge per listing, but only for listings where Fetch full listing detail actually opened the listing page (a listing suppressed by incremental mode is never charged). Revealing the seller's phone number adds no extra charge of its own; it reuses that same detail fetch. The Pricing tab shows the current rates. Use Max listings and Max pages to cap the cost of any run.
Is it legal to scrape Gumtree?
This actor collects only publicly available classified listings. Seller names, phone numbers and other contact details are personal data: collecting and using them is subject to UK GDPR and to Gumtree's terms, and that responsibility sits with you as the operator. Keep usage lawful and proportionate, and get legal advice if you plan commercial redistribution.
Can I get only new or changed listings on a schedule?
Yes. Schedule the actor against the same search and turn on Incremental mode. Each run then classifies every listing as NEW, UPDATED, UNCHANGED, REAPPEARED or EXPIRED against the previous run, and UNCHANGED listings are suppressed (and not billed) unless you turn on Also return UNCHANGED listings.
Why don't I see any REAPPEARED or EXPIRED listings?
EXPIRED rows, and the underlying "this listing is gone" state, are only produced after a run that reaches the natural end of results for every search in the call, with Also return EXPIRED listings on and no Resume id set. A capped run, a time-limited run, or one using Resume, leaves the previous state exactly as it was rather than guessing a listing is gone. REAPPEARED can only ever happen for a listing a prior run already marked gone this way, so a search that has never yet completed a full scan with that option on will never show either changeType.
Does Resume work if I run the exact same search again?
Yes. Paste the previous run or dataset id into Resume from run/dataset ID and this run still walks every result page from the start of the search, but skips any listing id already collected there, so pagination continues normally and you are not billed twice for the same listing.
Why did my run fail instead of returning an empty dataset?
If every result page comes back unreadable, the run stops with a clear message instead of reporting zero listings, so a genuine connection problem is never confused with an empty search. If seller phone numbers were requested and every attempted reveal came back session-expired or refused with none revealed, the run also fails loudly rather than returning a column of nulls; switch the phone option off to keep collecting every other field. If sign-in itself fails at the start of the run, reveal is skipped entirely rather than failing the run: every record gets phoneStatus: "not-requested" instead. A search that genuinely has no matching listings still ends as a clean, successful empty result.
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push a summary of each listing into Notion, Linear or Airtable.
🔗 Want more Gumtree data?
Pair this actor with these related scrapers from the same team:
| 🏷️ Gumtree AU Scraper Scrape gumtree.com.au classifieds across every vertical: for-sale goods, motors, real... | 🚗 Trade Me NZ Scraper Scrape trademe.co.nz across all five sections: Marketplace goods and auctions, Property... |
| 🏷️ Kijiji.ca Scraper Scrape Kijiji.ca listings across property, vehicles, jobs, electronics, furniture... | 🚗 Willhaben.at Scraper From $1/1K. Scrape Willhaben.at listings into clean JSON with 40+ structured fields... |
| 🏷️ Tutti.ch Scrape listings from tutti.ch across all 23 categories, including vehicles, property... | 🏷️ Daangn Scraper From $1/1K. Scrape Daangn (당근) marketplace listings by keyword and region. Returns 35+... |
💬 Support & custom scrapers
- 🐞 Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
- 🛠️ Need another site, extra fields or a private build? Email abotapi@proton.me or message Telegram @abotapi.
- ⭐ Enjoying it? A quick review on the actor page helps other users find it.