Childcare AU: Centres, Fees, Vacancies & NQS Ratings
Pricing
from $2.00 / 1,000 results
Childcare AU: Centres, Fees, Vacancies & NQS Ratings
Scrape Australia’s largest childcare directory careforkids.com.au with long day care, preschool, family day care, OSHC, and vacation care services. Returns centre profiles with address, fees, ratings, vacancies, features, images, and ACECQA approval numbers.
Pricing
from $2.00 / 1,000 results
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
CareForKids.com.au Scraper: Childcare Centres, Fees, Vacancies & Ratings
CareForKids.com.au Scraper turns Australia's largest childcare directory into structured data. Search any suburb and postcode across long day care, family day care, preschool, occasional care, before-school, after-school and vacation care, or paste any careforkids.com.au link straight from a browser. Every centre comes with name, address, GPS, phone, daily fee, NQS quality rating, parent rating, vacancy availability and a feature list from the search results, and switching on detail fetching adds the full fee table by age band, day-by-day vacancy schedule, all seven NQS quality areas, gallery images, contact name and hours, social links, provider group, the ACECQA service approval number and parent reviews. Flip to reviews-only output for one row per parent review instead of one per centre. Resume an interrupted multi-suburb sweep, or turn on incremental mode to monitor the same search on a schedule and get back only what changed. Export to JSON, CSV or Excel, or read the dataset through the API.
Why This Scraper?
- Two ways in. Search mode sweeps any suburb + postcode across one or more care types in a single run; URL mode accepts a pasted search page or a single centre link straight from a browser.
- A whole suburb in one page. Each suburb + postcode combination returns every centre CareForKids lists there in one page fetch, so a single run already covers a full locality without walking extra pages.
- Full profile on demand. Switch on detail fetching for the complete fee table by age band, day-by-day vacancy schedule, all seven NQS quality area ratings, gallery images, contact name and hours, socials, provider group and the ACECQA service approval number.
- Reviews as their own feed. Switch to reviews-only output and get one row per parent review (name, rating, date, full text, source, avatar) with the centre's context attached, instead of one row per centre.
- Filter before you pay. Verified-only, has-vacancies, minimum rating and maximum daily fee narrow results in Search mode and on any pasted URL, including a single centre link.
- Built for monitoring. Resume a large multi-suburb sweep that got interrupted, or turn on incremental mode to schedule the same search and get back only new, changed, reappeared or expired centres.
Use Cases
- Parents and relocation planners: compare fees, vacancies and NQS ratings across a shortlist of suburbs before enrolling.
- Childcare operators and franchise groups: track competitor pricing, vacancy trends and parent reviews in nearby suburbs.
- Directory and comparison sites: republish a normalized childcare dataset for a suburb or region alongside your own listings.
- Researchers and policy analysts: build a dataset of NQS ratings, approved-place capacity and fee bands across a state or region.
Data You Get
Sample shape: values are illustrative placeholders, not from a live listing.
| Field | Example |
|---|---|
id | 00000 |
url | https://www.careforkids.com.au/child-care/00000/sample-centre-suburb-2000 |
name | Sample Childcare Centre |
suburb / postcode / state | Sample Suburb / 2000 / NSW |
address | Sample Address, Sample Suburb, NSW |
latitude / longitude | -33.0000 / 151.0000 |
phone | +61 2 0000 0000 |
rating / reviewCount | 4.5 / 0 |
dailyFee | 200 |
hasVacancies | true |
isVerified | true |
listingType | Standard |
careTypes | ["Long Day Care", "Preschool"] |
requestedCareType | longdaycare |
services | ["Sample Service A", "Sample Service B"] |
nqsRating | Meeting |
providerGroup | Sample Provider Group |
serviceApprovalNumber | SE-00000000 |
approvedPlaces | 90 |
contactName / contactTime | Sample Contact, Director / 7:30am to 6:00pm |
websiteUrl | https://www.example.com/sample |
scrapedAt | 2026-01-01T00:00:00.000Z |
With Fetch detail pages on, a record also carries a description, Facebook and Instagram links, a logo and gallery image list, the provider's internal group id, a Google Place id, the full fee table (feeGroups, by age band), the day-by-day vacancy schedule (vacancies), the overall and all-seven-area NQS ratings (nqsRatingOverall, nqsRatingLabel, nqsAreaRatings), highlight bullets, a waitlist flag and URL, an average daily fee, a rating and review count broken out by source, an overnight-care flag, an embedded reviews list, and the full source object under raw. Reviews-only output (reviewsOnly: true) replaces all of this with one row per review: centreId, centreName, centreUrl, suburb, postcode, state, GPS, reviewerName, rating, date, text, avatarUrl, source and scrapedAt. With Incremental mode on, every centre record also carries changeType (NEW, UPDATED, UNCHANGED, REAPPEARED or EXPIRED), changedFields, firstSeenAt and lastSeenAt.
How to Use
- Pick a mode: Search (list suburb + postcode pairs and care types) or URL (paste any careforkids.com.au link).
- In Search mode, add one or more suburb + postcode pairs and pick care types. In URL mode, paste search-result pages or single centre links. The result filters (Verified centres only, Vacancies only, Minimum rating, Maximum daily fee) apply to both modes and to a single pasted centre link too.
- Turn on Fetch detail pages for the full profile, or turn on Reviews-only output to get one row per parent review instead.
- Set Max listings to control run size, click Start, then download the dataset or read it through the API.
Search by suburb + postcode:
{"mode": "search","locations": [{ "suburb": "Sydney", "postcode": "2000" }],"careTypes": ["all"],"fetchDetails": false,"maxListings": 20}
Multiple suburbs, specific care types, vacancies only, full profile:
{"mode": "search","locations": [{ "suburb": "Sydney", "postcode": "2000" },{ "suburb": "Bondi", "postcode": "2026" },{ "suburb": "Parramatta", "postcode": "2150" }],"careTypes": ["longdaycare", "preschool"],"vacanciesOnly": true,"fetchDetails": true}
Supported URL shapes (URL mode):
| Shape | Example | Notes |
|---|---|---|
| Search listing, all care types | https://www.careforkids.com.au/child-care/sydney/2000 | Suburb and postcode in the path. |
| Care-type search listing | https://www.careforkids.com.au/pre-school/sydney/2000 | Prefixes: family-day-care, occasional-care, pre-school, before-school-care, vacation-care, after-school-care. |
| Long day care prefix | https://www.careforkids.com.au/child-care-centre/melbourne/3000 | The site redirects this to the all-care-types listing, so the run logs a warning and returns all care types. |
| Centre detail page | https://www.careforkids.com.au/child-care/k60qk/ku-phillip-park-childrens-centre-woolloomooloo-2011 | One centre. |
A trailing slash, tracking parameters (?utm_...) and the non-www host all work. Any other shape (other pages, a suburb without postcode in the path, other domains) is skipped with a warning in the run log naming the URL, never a silent empty result.
URL mode, paste search pages:
{"mode": "url","urls": ["https://www.careforkids.com.au/child-care/sydney/2000","https://www.careforkids.com.au/family-day-care/melbourne/3000"],"fetchDetails": true}
Reviews-only output (one record per parent review):
{"mode": "search","locations": [{ "suburb": "Sydney", "postcode": "2000" }],"careTypes": ["all"],"reviewsOnly": true,"maxListings": 50,"maxReviewsPerCentre": 10}
Run it from your code
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("abotapi/careforkids-com-au-scraper").call(run_input={"mode": "search","locations": [{"suburb": "Sydney", "postcode": "2000"}],"careTypes": ["all"],})for centre in client.dataset(run["defaultDatasetId"]).iterate_items():print(centre["name"], centre["suburb"], centre["dailyFee"])
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('abotapi/careforkids-com-au-scraper').call({mode: 'search',locations: [{ suburb: 'Sydney', postcode: '2000' }],careTypes: ['all'],});const { items } = await client.dataset(run.defaultDatasetId).listItems();
Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.
Resume and recurring updates
- Resume (
resumeFromRunId) continues one interrupted centre-listing run: paste its run or dataset id and the actor seeds every centre id it already collected before scraping starts, so those centres are skipped instead of being re-fetched and re-billed. An id your account can't read fails the run immediately, before anything is scraped, instead of quietly starting an overlapping pull. Because each suburb + postcode combination is a single page fetch with nothing further to page through, Resume's benefit is skipping centres you already have across a large multi-suburb sweep, not resuming a paused walk through one suburb's own results. Does not apply to Reviews-only output. - Incremental mode (
incrementalMode) is for scheduling the same search again and again. Each centre is classifiedNEW,UPDATED(withchangedFields),UNCHANGED(suppressed and not billed unless Emit unchanged is on),REAPPEAREDorEXPIRED. A centre is only ever marked gone, and later eligible to reappear, after a run that scanned the full tracked search end to end (uncapped, not resumed) with Emit expired switched on; a capped, resumed or partially unreachable run leaves the previous state untouched instead of guessing. State key names or shares one monitoring campaign; leave it blank and the actor derives one automatically from your locations, care types, filters and Fetch detail pages setting, so unrelated searches never mix state. Change detection compares every returned field exceptscrapedAtand the volatileraw.WaitlistUrl/raw.SpecialOfferImage(a per-request routing value and a cache-busting image URL); use Ignore fields when detecting changes to exclude more (matched by field name at any depth; they are still returned, just never counted as a change or listed inchangedFields). Changing that list does not cause a wave of UPDATED rows, because the saved baseline is re-compared with the current list. Saved baselines from before the Verified-badge and review-cap update migrate silently: a pasted centre whose Verified badge now reads true instead of the old fixed false, and a detail row whose embedded reviews are now cut to the Max reviews per centre cap, are kept as unchanged (not returned, not billed) once, instead of showing up as a one-time wave of updated centres. Does not apply to Reviews-only output.
A pasted centre link and the Verified filter
A single pasted centre page still returns the full profile (fees, vacancies, NQS ratings, gallery, contact, reviews) even with Fetch detail pages left off, since that page is the only source of data for a single-centre link; the detail surcharge is only charged when Fetch detail pages is switched on. The centre's verified badge is read from that page, so isVerified reflects the centre's real status and Verified centres only keeps or drops a pasted centre link accordingly.
Send results into your apps (MCP connectors)
Optionally pipe the scraped results 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 record - not the full JSON. Each item 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 items 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 | search builds URLs from Locations and Care types; url passes through Search URLs directly. |
locations | array | (none; prefill: Sydney 2000) | Search mode only. Each entry is { "suburb": "...", "postcode": "0000" }. Suburb name is slugified automatically. The postcode is optional: with only a suburb name it is looked up on the site, and a name with no match is logged as an error and skipped. Multiple locations supported. |
careTypes | array | ["all"] | Service types to search. all fetches every type in one request. Multi-select: each location x type pair becomes a separate fetch. |
verifiedOnly | boolean | false | Drop centres not flagged as verified. Applies in Search mode and to any pasted URL, including a single centre link. |
vacanciesOnly | boolean | false | Drop centres reporting no current vacancies. Applies in Search mode and to any pasted URL, including a single centre link. |
minRating | integer | (off) | Minimum 1-5 parent rating. Centres without a rating are kept. Applies in Search mode and to any pasted URL, including a single centre link. |
maxDailyFee | integer | (off) | Maximum advertised average daily fee in AUD. Centres without an advertised fee are kept. Applies in Search mode and to any pasted URL, including a single centre link. |
urls | array | three example URLs (one per shape, listed under Supported URL shapes) | URL mode only. Paste any careforkids.com.au link: a search page, a care-type search page, or a single centre page. Behaviour change: in URL mode, leaving this field untouched now scrapes the three example URLs (one per shape) instead of doing nothing. The four filters above still apply, including to a single pasted centre link. |
maxListings | integer | 20 | Stop after this many centres across all searches. 0 = no cap. |
fetchDetails | boolean | false | Fetch each centre's own page for the full fee table, vacancy schedule, NQS quality areas, gallery, contact and socials, ACECQA number, feature list and parent reviews. Forced on when Reviews-only output is on. A meaningful share of centre pages currently don't carry the embedded data this relies on at all, in which case every detail-only field comes back null even though the fetch itself succeeded and is still billed; for a search or category walk the base fields (name, address, phone, GPS) are unaffected since those come from the search results page, but for a pasted single-centre link, which has no other data source, this can leave the whole record null. |
reviewsOnly | boolean | false | Emit one row per parent review instead of one per centre. Pairs with either Search or URL mode. |
maxReviewsPerCentre | integer | 20 | Cap on reviews per centre, applied to Reviews-only rows and to the reviews embedded on detail rows. Behaviour change: the default was previously unlimited; 0 now means the ceiling of 1000, and values above 1000 are clamped to 1000. |
resumeFromRunId | string | (none) | Continue one interrupted centre-listing run without re-fetching or re-billing centres it already collected. Does not apply to Reviews-only output. |
incrementalMode | boolean | false | Turn on for recurring monitoring of the same search. Classifies each centre as NEW, UPDATED, UNCHANGED, REAPPEARED or EXPIRED. Does not apply to Reviews-only output. |
stateKey | string | (none) | Name or share an incremental-mode monitoring campaign. Leave blank to derive one automatically from the search scope. |
emitUnchanged | boolean | false | Incremental mode only. Also return (and bill) centres unchanged since the last run. |
emitExpired | boolean | false | Incremental mode only. Also return (and bill) centres no longer found, once a run has scanned the full tracked search end to end. |
ignoreFieldsForChanges | array | [] | Incremental mode only. Field names (any depth) that never count as a change and are left out of changedFields; still returned in the output. |
proxy | object | (none; prefill: Apify Proxy) | Optional proxy configuration. Leave the default unless you need your own routing. |
mcpConnectors | array | (none) | Optional: send a summary of each record to apps you authorized under Integrations. |
notionParentPageUrl | string | (none) | Notion connector only: page under which records 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 listing.
{"id": "00000","url": "https://www.careforkids.com.au/child-care/00000/sample-centre-suburb-2000","name": "Sample Childcare Centre","suburb": "Sample Suburb","postcode": "2000","state": "NSW","address": "Sample Address, Sample Suburb, NSW","latitude": -33.0000,"longitude": 151.0000,"phone": "+61 2 0000 0000","rating": 4.5,"reviewCount": 0,"dailyFee": 200,"hasVacancies": true,"isVerified": true,"listingType": "Standard","careTypes": ["Long Day Care"],"requestedCareType": "longdaycare","services": ["Sample Service A", "Sample Service B"],"nqsRating": "Meeting","nqsRatingOverall": "Meeting","nqsRatingLabel": "Meeting National Quality Standard","nqsAreaRatings": ["Meeting NQS", "Meeting NQS", "Meeting NQS","Meeting NQS", "Meeting NQS", "Meeting NQS", "Meeting NQS"],"providerGroup": "Sample Provider Group","googlePlaceId": "ChIJ0000000000","logoUrl": "https://img-cdn.example.com/api/img?type=UserPhoto&id=00000","galleryImageUrls": ["https://img-cdn.example.com/api/img?type=UserImage&id=00001","https://img-cdn.example.com/api/img?type=UserImage&id=00002"],"feeGroups": [{"careType": "Long Day Care","fees": [{ "fromWeeks": 6, "toYears": 2, "maxPrice": 200, "feeTypeDisplay": "/day" },{ "fromYears": 2, "toYears": 5, "maxPrice": 200, "feeTypeDisplay": "/day" }]}],"vacancies": [{"careType": "Long Day Care","ageGroup": "6 wks to 2 yrs","ageGroupLabel": "Babies","daysOfWeek": [false, true, true, true, true, true, false]}],"serviceExtras": [{ "id": 1, "name": "Sample Service Feature", "iconId": "sample-feature" }],"highlights": "Sample highlight bullet|Another sample bullet|Final sample bullet","hasWaitlist": false,"dailyAverageFee": 200,"approvedPlaces": 90,"serviceApprovalNumber": "SE-00000000","contactName": "Sample Contact, Director","contactTime": "7:30am to 6:00pm","websiteUrl": "https://www.example.com/sample","facebookUrl": "https://www.facebook.com/sample-childcare-centre","instagramUrl": "https://www.instagram.com/sample_childcare_centre","scrapedAt": "2026-01-01T00:00:00.000Z"}
Plan Requirement
The default proxy setting uses Australian residential connections, because the site refuses datacenter connections outright. If a connection is refused, retries move to another connection automatically, and the run log says when a backup connection served the pages. Apify free plans do not include residential proxies; on a free plan the run continues on a backup connection where possible, and you can upgrade at https://apify.com/pricing or supply your own proxy URLs.
FAQ
How much does it cost?
You pay per record returned into the dataset. In centre mode that's one charge per centre; turning on Fetch detail pages adds a one-time surcharge on top for each centre record that carries the extra detail-page fields (skipped for a centre that returned no detail data at all); a record suppressed by incremental mode's unchanged or expired settings is never charged. In Reviews-only mode, every review is its own dataset row and is billed as such, plus one detail surcharge for each centre that returned at least one review (a centre with zero reviews skips that surcharge). The Pricing tab shows the current rates, and Max listings caps the size, and cost, of any run.
Is it legal to scrape CareForKids.com.au?
This actor collects only publicly available childcare directory listings. You are responsible for how you use the data: follow CareForKids.com.au's terms and the laws that apply to you, and get legal advice before any commercial redistribution, especially of contact details or parent reviews.
Can I monitor a suburb and get only new or changed centres?
Yes. Schedule the actor and turn on Incremental mode. Each run then returns only new, updated, reappeared or expired centres for that search, and unchanged ones are not billed unless you turn Emit unchanged on. This does not apply to Reviews-only output.
What happens when no page can be loaded?
If the run could not load a single page (every connection refused, or the site served nothing usable), it ends as FAILED with a status message saying whether the proxy was refused for your plan or the site could not be reached. It does not finish as SUCCEEDED with an empty dataset. A run where pages loaded but no centre matched (for example a wrong suburb and postcode pair) still finishes normally with 0 centres and a log message: double-check the suburb and 4-digit postcode pair, or try URL mode with a link copied from the site.
Does Verified centres only work on a pasted centre link?
Yes. The centre page's Verified badge is read, so a pasted centre link carries its real isVerified value. With Verified centres only on, a verified centre is kept and an unverified centre is dropped.
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 results into Notion, Linear or Airtable.
🔗 Want more leads data?
Pair this actor with these related scrapers from the same team:
| 📇 TrueLocal AU Directory Listings & Reviews Scraper Scrape TrueLocal.com.au business listings by keyword, location, or URL. Extract names... | 🏠 Domain.com.au Extract enriched Domain.com.au property listings across buy, rent, and sold, with... |
| 🚗 EasyAuto123 Scraper Scrape EasyAuto123 vehicle listings into clean structured data. Extract prices, VINs... | 🏠 Homely.com.au Scrape Homely.com.au properties for sale, rent, and sold, plus agent finder, suburb... |
| 🔌 Appliances Online Scraper Scrape appliancesonline.com.au by category, keyword, or URL. Extract title, brand, AUD... | 🏠 REIWA Scraper Scrape REIWA.com.au across sale, rental, sold, commercial, business and rural properties... |
💬 Support
- 🐞 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 contact@abotapi.com.
- ⭐ Enjoying it? A quick review on the actor page helps other users find it.