# Flatmates.com.au Scraper (`memo23/flatmates-scraper`) Actor

Scrape share accommodation (rooms, people, teamups) from Flatmates.com.au — Australia's #1 share housing site. Rent, beds, baths, occupants, availability, address, photos, and verified status via the mobile GraphQL API.

- **URL**: https://apify.com/memo23/flatmates-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Real estate
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Flatmates.com.au Scraper — Share Accommodation (Rooms, People, Teamups)

Scrape share-accommodation listings from **Flatmates.com.au** — Australia's #1 share housing site. Pulls rooms for rent, people looking for a room, and teamups via the official mobile GraphQL API: rent, beds, baths, occupants, availability, address, photos, ID-verified status, and (optionally) the full description, features, and contact name.

![How it works](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-flatmates.png)

### Why use this scraper

- **Mobile GraphQL API, not HTML** — the official Android app's endpoint returns structured JSON with no Cloudflare wall and no auth, so runs are fast and reliable from any proxy.
- **All three listing types** — rooms for rent, people looking, and teamups (people forming a new household).
- **Rich per-listing fields** — weekly rent, bedrooms, bathrooms, occupants, availability, suburb, photos, ID-verified flag, age & gender (people), length of stay (people).
- **Optional full details** — fetch each listing's web page for the description, feature list, and contact name.
- **Any location** — pass a city ("Sydney"), a suburb ("Surry Hills"), a postcode suburb ("surry-hills-2010"), a raw key ("sydney_nsw"), or a full flatmates.com.au URL.
- **Filter everything the app exposes** — budget range, furnishing, room type, property type, bills included, keywords, availability date, flatmate gender/profession/preferences, and more.

### Overview

Flatmates.com.au is Australia's largest share-accommodation marketplace, run by REA Group. This scraper reproduces the official Android app's data flow: it resolves your location text to a location key via the app's `LocationSuggest` endpoint, then paginates the `Search` GraphQL query and dedupes by listing ID. Each result row carries the full summary the app shows in its search results, plus an optional web-detail enrichment pass.

### Supported inputs

- **Locations** (required): one or more of
  - A place name: `Sydney`, `Surry Hills`, `Melbourne VIC`
  - A raw location key: `sydney_nsw`, `surry-hills-2010`
  - A flatmates.com.au URL: `https://flatmates.com.au/rooms/sydney_nsw`
- **Listing type**: `rooms` (default), `people`, or `teamups`
- **Filters**: min/max weekly rent, keywords, availability date, bills included, furnishing, room type, property types, number of bedrooms, and (for people mode) flatmate age/gender/profession/preferences
- **Sort**: featured, newest, recently active, cheapest, most expensive, earliest available, lowest budget, move earliest

### Use cases

- **Market research** — track share-rent prices by suburb across Australian cities.
- **Lead generation** — collect contact names and listing URLs for outreach to landlords/agents.
- **Migration monitoring** — watch a suburb for new listings that match a budget and availability window.
- **Academic / journalism** — dataset of Australian share-housing supply and pricing.
- **Aggregation** — feed a property meta-search or a relocation concierge.

### How it works

1. Each location input is resolved to a GraphQL location key via `LocationSuggestQuery` (the app's autocomplete).
2. The `SearchQuery` GraphQL operation is paginated per location, collecting listing summaries.
3. Listings are deduplicated by ID across locations and pages.
4. (Optional) When `fetchFullDetails` is on, each listing's web page is fetched through an AU residential proxy to add the description, features, and contact name.
5. Rows are pushed to the dataset as they're produced.

### Input configuration

| Field | Type | Default | Description |
|---|---|---|---|
| `locations` | string\[] | `["Sydney"]` | Locations to scrape (place name, key, or URL). |
| `mode` | enum | `rooms` | `rooms`, `people`, or `teamups`. |
| `sort` | enum | — | Sort order. |
| `minBudget` / `maxBudget` | integer | — | Weekly rent range in AUD. |
| `keywords` | string | — | Free-text keyword filter. |
| `dateAvailable` | string | — | ISO date; only listings available on/after this date. |
| `billsIncluded` | boolean | `false` | Only listings with bills included. |
| `furnishingType` | enum | — | `furnished` / `unfurnished`. |
| `roomType` | enum | — | `private_room` / `shared_room` (rooms mode). |
| `propertyTypes` | string\[] | — | Property type filters (rooms mode). |
| `numberOfBedroom` | integer | — | Exact bedroom count (rooms mode). |
| `maxItems` | integer | `100` | Max listings across all locations. |
| `maxPages` | integer | `0` | Max pages per location (0 = unlimited). |
| `fetchFullDetails` | boolean | `false` | Fetch each listing's web page for description, features, contact name. |
| `maxConcurrency` | integer | `8` | Detail-page concurrency (only with `fetchFullDetails`). |
| `proxy` | object | AU residential | Optional proxy override. |

### Output overview

Each dataset row is one listing. See the Output tab for the full schema and a sample.

### Output samples

**Rooms mode (property listing):**

```json
{
  "listingId": "1976211",
  "url": "https://flatmates.com.au/student-accommodation-sydney-darlinghurst-2010-P1976211",
  "type": "property",
  "mode": "rooms",
  "heading": "Student accommodation for rent",
  "rent": "$375",
  "rentWeekly": 375,
  "availability": "Available 3 November 2026",
  "displayAddress": "Darlinghurst, Sydney",
  "suburb": "Darlinghurst",
  "bedroomCount": 4,
  "bathroomCount": 1,
  "occupantCount": 4,
  "images": ["https://flatmates-res.cloudinary.com/..."],
  "scrapedAt": "2026-10-18T10:26:27.496Z"
}
```

**People mode (person listing):**

```json
{
  "listingId": "4708037",
  "url": "https://flatmates.com.au/F4708037",
  "type": "person",
  "mode": "people",
  "heading": "Carlota",
  "ageAndGender": "24 year old woman",
  "lengthOfStay": "6 months stay",
  "rentWeekly": 400,
  "scrapedAt": "2026-10-18T10:28:00.000Z"
}
```

### Key output fields

- `listingId` — Flatmates internal listing ID.
- `url` — public web URL.
- `type` — `property` or `person`.
- `mode` — `rooms`, `people`, or `teamups`.
- `heading` — listing heading (property address or person's name).
- `rent` / `rentWeekly` — rent as displayed and as a numeric AUD value.
- `availability` — availability text.
- `displayAddress`, `suburb`, `state`, `postcode` — location (property listings).
- `bedroomCount`, `bathroomCount`, `occupantCount` — property listings.
- `ageAndGender`, `lengthOfStay` — person listings.
- `idVerified` — ID-verified flag.
- `interactionBadge` — e.g. "Boosted", "New".
- `images` — Cloudinary image URLs.
- `description`, `features`, `contactName` — only when `fetchFullDetails` is on.

### FAQ

**Do I need a proxy?** No. The GraphQL search endpoint has no anti-bot and works from datacenter IPs. The actor still routes through Apify AU residential so the optional `fetchFullDetails` web pages clear Cloudflare. You can override the proxy in the input if you prefer your own.

**Does it need login?** No. Search and location-suggest are unauthenticated. Authenticated features (messaging, shortlist, your own profile) are out of scope.

**How many listings can I get?** As many as Flatmates has for your locations. Sydney returns thousands of rooms; set `maxItems` to cap your run and `maxPages` to cap depth per location.

**Why are `description`, `features`, and `contactName` null?** They're only populated when `fetchFullDetails` is on, because they come from the web detail page rather than the GraphQL summary. The detail page sits behind Cloudflare; the actor routes through AU residential proxies and retries, but some runs may be rate-limited. When that happens the row is still emitted with all the GraphQL summary fields (rent, beds, baths, availability, address, photos, etc.) and only the detail-only fields are left null.

### Support

If something breaks, [open an issue](https://apify.com/memo23/flatmates-scraper/issues/open) with the run ID and your input. For custom output fields, locations, or integrations, the author is reachable through the Apify Store.

### Additional services

Need a custom field, a different output shape, a webhook to your CRM, or a one-off bulk scrape of every Australian suburb? The author takes custom work — reach out through the Store page.

### Explore more scrapers

See the full [memo23 portfolio on the Apify Store](https://apify.com/memo23) for Australian and international real-estate, jobs, and directory scrapers.

### For AI Agents & LLM Apps

This actor accepts a plain `locations` array and a `mode` and returns one row per listing. To use it from an LLM tool call:

```json
{
  "locations": ["Sydney", "Melbourne VIC"],
  "mode": "rooms",
  "maxItems": 50,
  "fetchFullDetails": false
}
```

The output is stable JSON with predictable field names (`listingId`, `url`, `rentWeekly`, `suburb`, `bedroomCount`, …). For retrieval, filter by `suburb`/`state` and sort by `rentWeekly`. Each row is self-contained — no joins needed.

### Disclaimer

This scraper is for personal, research, and lead-generation use. You are responsible for complying with Flatmates.com.au's Terms of Service and all applicable laws. The author and this actor are not affiliated with Flatmates.com.au or REA Group. Use responsibly.

### SEO Keywords

flatmates scraper, flatmates.com.au scraper, share accommodation scraper australia, share housing data, rooms for rent scraper sydney, melbourne share rooms, sydney flatmates listings, australian share accommodation api, flatmates graphql, rea group share housing, rent rooms australia scraper, teamups scraper, flatmates.com.au data extraction, share housing market research australia, suburb rent prices share

# Actor input Schema

## `locations` (type: `array`):

Locations to scrape. Accepts a place name ("Sydney", "Surry Hills", "Melbourne VIC"), a raw location key ("sydney_nsw", "surry-hills-2010"), or a flatmates.com.au URL (https://flatmates.com.au/rooms/sydney_nsw). Each is resolved to a location key via the app's location-suggest API.

## `mode` (type: `string`):

rooms = rooms for rent; people = people looking for a room; teamups = people forming a new household.

## `sort` (type: `string`):

Sort order for results.

## `minBudget` (type: `integer`):

Minimum weekly rent in AUD.

## `maxBudget` (type: `integer`):

Maximum weekly rent in AUD.

## `keywords` (type: `string`):

Free-text keyword filter (matched against listing description/heading).

## `dateAvailable` (type: `string`):

ISO date (YYYY-MM-DD) — only listings available on or after this date.

## `billsIncluded` (type: `boolean`):

Only listings where bills are included in the rent.

## `furnishingType` (type: `string`):

Furnishing type filter.

## `roomType` (type: `string`):

Room type filter (rooms mode).

## `propertyTypes` (type: `array`):

Property type filters (rooms mode).

## `numberOfBedroom` (type: `integer`):

Exact number of bedrooms (rooms mode).

## `maxItems` (type: `integer`):

Maximum number of listings to scrape across all locations.

## `maxPages` (type: `integer`):

Maximum pages to fetch per location (0 = unlimited).

## `fetchFullDetails` (type: `boolean`):

Fetch each listing's web detail page for the full description, features, and contact name. Off = faster, listing-level fields only. One extra request per listing when on. Best-effort: the detail page sits behind Cloudflare, so some runs may be rate-limited and the detail-only fields left null while the GraphQL summary fields are always present.

## `maxConcurrency` (type: `integer`):

Maximum number of detail pages fetched in parallel (only used when fetchFullDetails is on).

## `proxy` (type: `object`):

Leave empty — the actor routes through Apify AU residential so the optional web detail page clears Cloudflare. The GraphQL search itself needs no proxy. Only set this to use your own proxies.

## Actor input object example

```json
{
  "locations": [
    "Sydney"
  ],
  "mode": "rooms",
  "billsIncluded": false,
  "maxItems": 100,
  "maxPages": 0,
  "fetchFullDetails": false,
  "maxConcurrency": 8
}
```

# Actor output Schema

## `results` (type: `string`):

The scraped Flatmates.com.au listings in the default dataset.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "locations": [
        "Sydney"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/flatmates-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "locations": ["Sydney"] }

# Run the Actor and wait for it to finish
run = client.actor("memo23/flatmates-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "locations": [
    "Sydney"
  ]
}' |
apify call memo23/flatmates-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,memo23/flatmates-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/UPhHisWu17MEG2v2t/builds/ucdmelOsO9sM1Wekw/openapi.json
