TrueLocal AU Directory Listings & Reviews Scraper at a glance
TrueLocal AU Directory Listings & Reviews Scraper is a ready-to-run Apify actor from abotapi for collecting lead generation data. Its documented output includes listing id, review listing id, review #, profile url and name, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $2.00 per 1,000 results on the Apify Free plan and from $1.20 on paid plans, with smaller per-run or optional feature charges listed on Apify.
- Runs on
- Apify cloud: console, API, schedules and integrations
- Data type
- Lead Generation, Developer Tools, Automation
- Region
- Oceania
- Pricing
- $2.00 per 1,000 results (Free plan), from $1.20 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 18 options
Scrape TrueLocal.com.au business listings by keyword, location, or URL. Extract names, addresses, GPS coordinates, phones, emails, websites, ratings, and review counts. Optional review mode exports individual reviews with author, rating, text, and date. Automatic pagination included.
What TrueLocal AU Directory Listings & Reviews Scraper can do
- Three modes in one actor. Search by keyword and location, paste TrueLocal search or profile URLs, or switch to a flat one-row-per-review mode.
- Rich listing data. Name, full address, GPS coordinates, phone, secondary phone, email, website, category trail, star rating and structured weekly and holiday opening hours.
- Verified disjoint pagination. Forward auto-pagination walks confirmed non-overlapping result pages, so one search can enumerate thousands of listings without duplicate rows.
- Cross-product search expansion. Pass several keywords and several locations and every combination is searched.
- Lean mode for fast enumeration. Turn off profile fetching to get the SERP card alone (name, URL, phone, category) at low cost.
- Built for schedules. Incremental mode classifies each listing as new, updated, unchanged or vanished on every recurring run, and Resume mode continues one interrupted large crawl.
Choose what to collect
These inputs let you configure TrueLocal AU Directory Listings & Reviews Scraper. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring · required | Search = keyword + location builder (one record per listing). URL = paste TrueLocal search or profile URLs. Reviews = same inputs as Search/URL but the output is one flat record PER review. |
searchTermsarray | Keywords or categories to search, e.g. "restaurants", "plumber", "hairdresser". One or more. |
searchQueriesarray | Alias of Search terms, accepted so inputs written for other TrueLocal scrapers work unchanged. Used only when Search terms is empty. |
locationsarray | Free-text locations, e.g. "Sydney NSW", "Melbourne VIC", "Bondi Beach". Suburb-level granularity is accepted. Enter "Australia" to search nationwide. A location TrueLocal does not recognise is skipped with a warning. Every keyword above is searched in every location here. |
urlsarray | One or more full TrueLocal URLs. Either a search URL (https://www.truelocal.com.au/search?search_terms=cafe&geo_location_terms=Sydney+NSW) which is paginated forward, a browse URL (https://www.truelocal.com.au/find/cafe/melbourne-vic) of which only the first page is read, or a profile URL (https://www.truelocal.com.au/sydney-nsw/tlp/some-listing-580000000) which is fetched directly. Multi-URL supported. Left untouched, URL mode scrapes these 3 examples; in Search and Reviews modes the untouched examples are ignored. |
fetchDetailsboolean | OFF by default: a run returns the lean SERP card (name, profile URL, phone, category) and is fast and cheap. Turn ON to also open each listing's profile page for full address, GPS, email, website, star rating and reviews; each listing opened adds one Profile-page enrichment event. Reviews mode and pasted profile URLs always fetch profile pages regardless of this setting. |
maxPagesinteger | How many SERP pages to walk per keyword/location (or per pasted search URL). Each page returns up to ~30 listings. Leave empty (or 0) to walk every result page, the walk stops naturally once a page comes back empty or repeats listings already collected, or sooner once Max listings is reached. |
Show 11 more inputs
| Input | What it controls |
|---|---|
maxListingsinteger | Stop after this many listings across all searches. In Reviews mode this caps the number of listings whose reviews are emitted. Defaults to 20 so a run stays small unless you raise it. 0 = unlimited (bounded only by the natural stop on Max pages). |
maxBusinessesinteger | Alias of Max listings. Used only when Max listings is not set. |
resumeFromRunIdstring | Paste a previous run ID or dataset ID to continue a full-catalogue walk across separate runs. Listings already collected there (matched by id) are skipped, so this run only saves the new ones. For recurring daily/weekly monitoring of the same search, use Incremental mode below instead. Leave empty for a normal fresh run. |
incrementalModeboolean | Turn this on for daily or recurring monitoring. The first run returns all matching listings as NEW. Later runs compare each listing's data (name, categories, contact details, address, hours, rating, review count and reviews) with the saved copy; the scrape time, the review-returned counter, image-link hosts and the order of categories and reviews are ignored. Later runs normally return only NEW, UPDATED, and REAPPEARED listings, unchanged ones are suppressed (and not billed). Turn on "Emit unchanged" or "Emit expired" only when you also want those listings returned (and billed). State is kept separately for each mode/keyword/location/URL and detail-mode setup; use State key when you want to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above. |
stateKeystring | Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the mode/keyword/location/URL and detail settings, different searches then never mix state with each other. |
emitUnchangedboolean | Off by default. Turn on to also return listings that have not changed since the last run, marked UNCHANGED. This returns, and bills, extra rows you already have, so leave it off unless you specifically want the full snapshot every run. |
emitExpiredboolean | Off by default. Turn on to also return listings that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search in Search or URL mode, not when Max listings/Max pages capped it, not when Resume was used, and not in Reviews mode. This returns, and bills, extra synthetic rows, so leave it off unless you need expiry tracking. |
ignoreFieldsForChangesarray | Field names to leave out when deciding whether a listing changed, for example ratingValue or reviewCount. Use a dotted path for nested fields, such as reviews.date. The fields stay in the output; they just never turn a listing into UPDATED. Changing this list does not mark everything as changed. |
mcpConnectorsarray | Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. Notion gets a page per item; other connectors receive a best-effort write/digest. Leave empty to skip, this never changes the dataset output. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com). |
notionParentPageUrlstring | URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors. |
maxNotifyListingsinteger | Cap on items written to each connector per run. Does not affect the dataset. |
Fields in the output
The documented dataset includes the fields below. Availability can depend on the source page and selected mode.
idListing IDbusinessIdReview listing IDreviewIndexReview # (number)urlProfile URL (link)nameNamephonePhonefullAddressAddressprimaryCategoryPrimary categoryratingValueRating (number)reviewCountReview count (number)businessNameReview listingbusinessUrlReview profile URL (link)Show 41 more fields
businessCategoryReview categorybusinessRatingReview avg rating (number)businessReviewCountReview total (number)authorReview authorratingReview rating (number)reviewBodyReviewdatePublishedReview datescrapedAtScrapeddescriptionDescriptioncategoriesCategoriessecondaryPhone2nd phoneemailEmailwebsiteWebsite (link)suburbSuburbstateStatepostcodePostcodelatitudeLatlongitudeLngopeningHoursOpening hourspermanentlyClosedClosedreviewsReturnedReviews returnedaddressStreetStreetcategoryCategorysloganSloganyearsInBusinessYears in businesssearchQuerySearch querylocationSearch locationsourceSourceobservedAtObservedchangeTypeChange (incremental mode)changedFieldsChanged fieldsfirstSeenAtFirst seen (incremental mode)lastSeenAtLast seen (incremental mode)businessSuburbSuburbbusinessStateStatestreetStreetcountryCountryholidayHoursHoliday hoursreviewsreviewsbodyReviewdateReview dateExample output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"id": "00000001",
"url": "https://www.truelocal.com.au/sydney-nsw/tlp/sample-listing-00000001",
"name": "Sample Listing Name",
"description": "The listing's own description text, when the owner wrote one.",
"categories": [
"Sample Category"
],
"primaryCategory": "Sample Category",
"categoryCodes": [
"00000000"
],
"categoryId": "00000000",
"phone": "(02) 0000 0000",
"secondaryPhone": null,
"email": "contact@example.com",
"website": "https://example.com",
"image": "https://example.com/photo.jpg",
"street": "1 Sample Street",
"suburb": "Sydney",
"state": "NSW",
"postcode": "2000",
"country": "AU",
"fullAddress": "1 Sample Street, Sydney NSW 2000",
"latitude": -33,
"longitude": 151,
"openingHours": {
"MONDAY": "0000-2359",
"TUESDAY": "0000-2359",
"WEDNESDAY": "0000-2359",
"THURSDAY": "0000-2359",
"FRIDAY": "0000-2359",
"SATURDAY": "0000-2359",
"SUNDAY": "0000-2359"
},
"holidayHours": {
"New Year's Day": [
[
"2026/01/01",
"Open 24 Hours"
]
]
},
"permanentlyClosed": false,
"ratingValue": 5,
"reviewCount": 6,
"reviewsReturned": 6,
"reviews": [
{
"author": "Jane D.",
"rating": 5,
"body": "Review text, when reviews are present on the listing.",
"date": "2024-01-01"
}
],
"scrapedAt": "2026-01-01T00:00:00.000Z",
"addressStreet": "1 Sample Street",
"category": "Restaurants",
"slogan": null,
"yearsInBusiness": null,
"searchQuery": "restaurants",
"location": "Sydney NSW",
"source": "truelocal.com.au",
"observedAt": "2026-01-01T00:00:00.000Z"
}Ways to use this data
- Lead generation and sales prospecting: build contact lists of businesses by category and suburb, with phone, email and website.
- Local SEO and citation audits: track a client's or competitor's listing, category and star rating over time.
- Market and location research: map business density and category mix across Australian suburbs and cities.
- Directory and aggregator sites: mirror a category from TrueLocal and refresh it on a schedule.
- Review monitoring and reputation tracking: collect raw customer reviews for sentiment analysis or alerts on new reviews.
Before you run
Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.
Questions about this actor
What data does TrueLocal AU Directory Listings & Reviews Scraper return?
The documented output for TrueLocal AU Directory Listings & Reviews Scraper includes listing id, review listing id, review #, profile url, name, phone, address and primary category. Availability of each field depends on the source page and the selected mode.
How much does TrueLocal AU Directory Listings & Reviews Scraper cost?
It costs $2.00 per 1,000 results on the Apify Free plan and from $1.20 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.
Can I get only new or changed listings on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Every scheduled run then returns only NEW and UPDATED listings by default, and unchanged ones are not billed. REAPPEARED listings only appear after an earlier run that had Emit expired on and completed a full, uncapped scan; only then does a later reappearance get classified as REAPPEARED instead of NEW.
What is the difference between Resume and Incremental mode?
Resume (resumeFromRunId) continues one specific interrupted or partial crawl by skipping listings a past run or dataset already collected; use it to finish one large catalogue walk across multiple runs. Incremental mode is for running the same search again and again, for example daily, and getting only what changed; it remembers its own state, so you never paste a run ID. Turning both on together for a search that already has saved incremental state fails the run on purpose, so remove one of the two.
Why does a run fail instead of returning an empty dataset?
The run fails outright when resumeFromRunId does not match a run or dataset your account can read, when Incremental mode is combined with resumeFromRunId on a search that already has saved incremental state, or when no usable page could be loaded at all (see Plan Requirement). Partial failures finish as a completed run with a partial dataset and a warning in the log. Re-run it; a fresh run picks a new connection.
Can I use it with AI agents or MCP?
Yes. Call the actor from any Apify integration or MCP client, and use the "Pipe results into your apps" field to send a digest of each record to Notion, Linear or Airtable after the scrape finishes.
