Skip to content
Scrappa Get API key
Flatmates API 1 credit/request

Flatmates Room Search API Documentation

GET https://scrappa.co/api/flatmates/search?location=sydney&property_type=share-houses&bathroom_type=ensuite&min_budget=200&max_budget=300

Scrappa's GET /api/flatmates/search returns Flatmates.com.au rooms and shared rentals in Australia as structured JSON.

Rentals only

Flatmates lists rooms, shares and rentals. It has no sale listings, so this API has no sale parameter.

What you get

One request returns one page of 12 rooms in data. Each room has id, link, title, subtitle, description, rent (display text, min, max, AUD, per week), bills, date_available, suburb, bedroom, bathroom and occupant counts, photos and activated_at. Call the listing endpoint with the link for rooms, deposit, address and the lister.

Location

location is a city slug such as sydney, or the key of a suburb (bondi-2026), train station (central-station-sydney) or university (uc) from /api/flatmates/location-autocomplete. Station and university searches add distance to each room. An unknown location returns 422 (upstream_rejected).

Filters are honoured

Flatmates applies every filter and the sort itself, and all of them combine. Flatmates reports the filters it applied. If one is missing from that report, the request returns 422 (upstream_rejected) instead of unfiltered rooms. A room whose weekly rent lies fully outside your budget is also removed. pagination.filtered_out counts them, so a page can hold fewer than 12 rooms. Unknown parameters and values are rejected with 422. Filters not offered yet (bedrooms, date available) are not accepted rather than ignored.

Pagination

page is 1-based and the label always equals the page Flatmates served. has_more and next_page tell you whether another page exists. Flatmates gives no total count in its data feed, so none is returned.

Data quality

sort=cheapest lists rooms priced $0 first and most-expensive starts with $9,999. These are placeholders, kept in place so paging stays honest, and flagged with rent.price_valid = false.

Flatmates Room Search API Documentation 1 credit/request

Endpoint

Request preview
GET
https://scrappa.co/api/flatmates/search?location=sydney&property_type=share-houses&bathroom_type=ensuite&min_budget=200&max_budget=300
Auth header
x-api-key
Cost
1 credit/request
location = sydney
Response preview
200 OK
{
    "success": true,
    "data": [
        {
            "id": 1432574,
            "link": "https://flatmates.com.au/share-house-sydney-balgowlah-2093-P1432574",
            "listing_kind": "property",
            "tile_kind": "listing",
            "label": null,
            "title": "Ensuite room in a sunny house",
            "subtitle": "Balgowlah, NSW",
            "summary": "Share house, 3 bedrooms",
            "description": "Bright room close to the bus and the beach.",
            "rent": {
...

Parameters

Start with the required fields, then add optional filters only when your use case needs them.

Runnable path

1 required parameter needed before sending a request.

13 optional filters available.

location string Required

City slug (sydney) or a suburb, station or university key (bondi-2026) from location-autocomplete.

Example value sydney
page integer Optional

Result page, 1-based. 12 rooms per page.

Example value 1
sort string Optional

cheapest, most-expensive, newest, earliest-available or recently-active. Default: featured first. Combines with every filter.

Example value relevance
property_type string Optional

share-houses, whole-properties, granny-flats, homestays, studios, 1-beds or student-accommodation.

Example value share-houses
bathroom_type string Optional

ensuite or ensuite-or-own.

Example value ensuite
min_budget integer Optional

Minimum weekly rent in AUD.

Example value 200
max_budget integer Optional

Maximum weekly rent in AUD.

Example value 300
stay_length string Optional

1-week, 2-weeks, 3-weeks, 4-weeks, 2-months, 3-months, 6-months or 12-months.

Example value example
room_type string Optional

private-room or shared-room.

Example value example
gender string Optional

females, males or couples.

Example value example
furnishings string Optional

furnished or unfurnished.

Example value example
parking string Optional

no-parking, off-street-parking or on-street-parking.

Example value example
bills_included boolean Optional

true for rooms with bills included in the rent.

Example value true
preferences string Optional

Comma-separated: lgbt-friendly, retirees, students.

Example value example

Request Examples

PHP
<?php

$curl = curl_init();

curl_setopt_array($curl, [
    CURLOPT_URL => "https://scrappa.co/api/flatmates/search?location=sydney&property_type=share-houses&bathroom_type=ensuite&min_budget=200&max_budget=300",
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_ENCODING => "",
    CURLOPT_MAXREDIRS => 10,
    CURLOPT_TIMEOUT => 30,
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
    CURLOPT_CUSTOMREQUEST => "GET",
    CURLOPT_HTTPHEADER => [
        "x-api-key: YOUR_API_KEY_HERE"
    ],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
    echo "cURL Error #:" . $err;
} else {
    echo $response;
}
PHP
<?php

use Illuminate\Support\Facades\Http;

$response = Http::timeout(30)
    ->withHeaders(['x-api-key' => 'YOUR_API_KEY_HERE'])
    ->get('https://scrappa.co/api/flatmates/search?location=sydney&property_type=share-houses&bathroom_type=ensuite&min_budget=200&max_budget=300');

if ($response->successful()) {
    echo $response->body();
} else {
    echo "Error: " . $response->status();
}
JavaScript
const options = {
    method: 'GET',
    headers: {
        'x-api-key': 'YOUR_API_KEY_HERE'
    }
};

fetch('https://scrappa.co/api/flatmates/search?location=sydney&property_type=share-houses&bathroom_type=ensuite&min_budget=200&max_budget=300', options)
    .then(response => {
        if (!response.ok) {
            throw new Error(`HTTP error! status: ${response.status}`);
        }
        return response.text();
    })
    .then(data => console.log(data))
    .catch(error => console.error('Error:', error));
JavaScript
const axios = require('axios');

const options = {
    method: 'GET',
    url: 'https://scrappa.co/api/flatmates/search?location=sydney&property_type=share-houses&bathroom_type=ensuite&min_budget=200&max_budget=300',
    headers: {
        x-api-key: 'YOUR_API_KEY_HERE',
    }
};

try {
    const response = await axios(options);
    console.log(response.data);
} catch (error) {
    console.error('Error:', error.message);
}
Ruby
require 'net/http'
require 'uri'

uri = URI.parse("https://scrappa.co/api/flatmates/search?location=sydney&property_type=share-houses&bathroom_type=ensuite&min_budget=200&max_budget=300")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = uri.scheme == 'https'

request = Net::HTTP::Get.new(uri.request_uri)
request['x-api-key'] = 'YOUR_API_KEY_HERE'

begin
    response = http.request(request)
    puts response.body
rescue => e
    puts "Error: #{e.message}"
end
Python
import http.client
import json

conn = http.client.HTTPSConnection("scrappa.co")

headers = {
    'x-api-key': 'YOUR_API_KEY_HERE',
}

try:
    conn.request("GET", "/api/flatmates/search?location=sydney&property_type=share-houses&bathroom_type=ensuite&min_budget=200&max_budget=300", headers=headers)
    res = conn.getresponse()
    data = res.read()
    print(data.decode("utf-8"))
except Exception as e:
    print(f"Error: {e}")
finally:
    conn.close()
Python
import requests

headers = {
    'x-api-key': 'YOUR_API_KEY_HERE',
}

try:
    response = requests.get('https://scrappa.co/api/flatmates/search?location=sydney&property_type=share-houses&bathroom_type=ensuite&min_budget=200&max_budget=300', headers=headers)
    response.raise_for_status()
    print(response.text)
except requests.exceptions.RequestException as e:
    print(f"Error: {e}")
Java
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;

public class ApiExample {
    public static void main(String[] args) {
        OkHttpClient client = new OkHttpClient();

        Request request = new Request.Builder()
            .url("https://scrappa.co/api/flatmates/search?location=sydney&property_type=share-houses&bathroom_type=ensuite&min_budget=200&max_budget=300")
        .addHeader("x-api-key", "YOUR_API_KEY_HERE")
            .build();

        try (Response response = client.newCall(request).execute()) {
            if (response.isSuccessful()) {
                System.out.println(response.body().string());
            } else {
                System.out.println("Error: " + response.code());
            }
        } catch (IOException e) {
            System.out.println("Error: " + e.getMessage());
        }
    }
}
Go
package main

import (
    "fmt"
    "net/http"
    "io/ioutil"
)

func main() {
    client := &http.Client{}
    req, err := http.NewRequest("GET", "https://scrappa.co/api/flatmates/search?location=sydney&property_type=share-houses&bathroom_type=ensuite&min_budget=200&max_budget=300", nil)
    if err != nil {
        fmt.Println("Error creating request:", err)
        return
    }
    req.Header.Set("x-api-key", "YOUR_API_KEY_HERE")

    resp, err := client.Do(req)
    if err != nil {
        fmt.Println("Error making request:", err)
        return
    }
    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Println("Error reading response:", err)
        return
    }

    fmt.Println(string(body))
}
Terminal
#!/bin/bash

curl -X GET \
    -H "x-api-key: YOUR_API_KEY_HERE" \
    "https://scrappa.co/api/flatmates/search?location=sydney&property_type=share-houses&bathroom_type=ensuite&min_budget=200&max_budget=300"
C#
using System;
using System.Net.Http;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        using var client = new HttpClient();
        client.DefaultRequestHeaders.Add("x-api-key", "YOUR_API_KEY_HERE");

        try
        {
            var response = await client.SendAsync(new HttpRequestMessage(HttpMethod.Get, "https://scrappa.co/api/flatmates/search?location=sydney&property_type=share-houses&bathroom_type=ensuite&min_budget=200&max_budget=300"));
            var content = await response.Content.ReadAsStringAsync();
            Console.WriteLine(content);
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error: {ex.Message}");
        }
    }
}
TypeScript
import axios from 'axios';

async function run(): Promise<void> {
    try {
        const response = await axios({
            method: 'GET',
            url: 'https://scrappa.co/api/flatmates/search?location=sydney&property_type=share-houses&bathroom_type=ensuite&min_budget=200&max_budget=300',
            headers: {
        'x-api-key': 'YOUR_API_KEY_HERE',
            },
        });

        console.log(response.data);
    } catch (error) {
        console.error('Error:', error);
    }
}

void run();
RUST
use reqwest::Client;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = Client::new();

    let response = client
        .get("https://scrappa.co/api/flatmates/search?location=sydney&property_type=share-houses&bathroom_type=ensuite&min_budget=200&max_budget=300")
        .header("x-api-key", "YOUR_API_KEY_HERE")
        .send()
        .await?;

    println!("{}", response.text().await?);

    Ok(())
}

Response Schema

Example response fields are illustrative; inspect the JSON before integrating.

Example response fields

Scan these fields before integrating.

success data pagination applied_filters meta

Common data fields

id link listing_kind tile_kind
JSON Response
200 OK
{
    "success": true,
    "data": [
        {
            "id": 1432574,
            "link": "https://flatmates.com.au/share-house-sydney-balgowlah-2093-P1432574",
            "listing_kind": "property",
            "tile_kind": "listing",
            "label": null,
            "title": "Ensuite room in a sunny house",
            "subtitle": "Balgowlah, NSW",
            "summary": "Share house, 3 bedrooms",
            "description": "Bright room close to the bus and the beach.",
            "rent": {
                "display": "$280",
                "min": 280,
                "max": 280,
                "currency": "AUD",
                "period": "week",
                "price_valid": true
            },
            "bills": "Bills included",
            "date_available": "Available now",
            "suburb": "Balgowlah",
            "locality": "Balgowlah, NSW 2093",
            "distance": null,
            "bedrooms": 3,
            "bathrooms": 2,
            "occupants": 3,
            "photo": "https://flatmates-res.cloudinary.com/image/upload/example-small.jpg",
            "photos": [
                {
                    "mobile": "https://flatmates-res.cloudinary.com/image/upload/example-small.jpg",
                    "desktop": "https://flatmates-res.cloudinary.com/image/upload/example.jpg"
                }
            ],
            "activated_at": "2026-10-20T01:12:00.000Z",
            "member_id": 8123456
        }
    ],
    "pagination": {
        "page": 1,
        "page_size": 12,
        "returned": 1,
        "filtered_out": 0,
        "has_more": true,
        "next_page": 2
    },
    "applied_filters": {
        "location": "sydney",
        "property_type": "share-houses",
        "bathroom_type": "ensuite",
        "min_budget": 200,
        "max_budget": 300
    },
    "meta": {
        "endpoint_family": "search",
        "billable": true,
        "attempts": 1
    }
}

Errors

Handle these documented responses before retrying or showing customer-facing failures.

422

Location or Filter Rejected

Flatmates does not know the `location`, or did not apply a requested filter (`upstream_rejected`). The request is rejected instead of returning unfiltered rooms. Use a `key` from location-autocomplete. Non-billable.

{
    "meta": {
        "attempts": 1,
        "billable": false,
        "retryable": false,
        "endpoint_family": "search"
    },
    "error": {
        "code": "upstream_rejected",
        "message": "Flatmates does not know that location or filter combination. Use a key from location-autocomplete."
    },
    "success": false
}
422

Validation Error

A query parameter is missing, unknown or unusable. Unknown parameters are rejected, never ignored. Non-billable.

{
    "errors": {
        "sort": [
            "The selected sort is invalid."
        ]
    },
    "message": "The selected sort is invalid."
}
503

Upstream Unavailable

Flatmates could not be reached after retries or answered with something unusable (`upstream_unavailable`, `upstream_blocked`, `parser_drift`). Retryable and never billed. Clients are never rate limited.

{
    "meta": {
        "attempts": 3,
        "billable": false,
        "retryable": true,
        "endpoint_family": "search"
    },
    "error": {
        "code": "upstream_unavailable",
        "message": "Flatmates is temporarily unavailable. Please retry."
    },
    "success": false
}

Generate Code with AI

Copy a ready-made prompt with all the endpoint details, parameters, and example responses. Paste it into ChatGPT, Claude, or any AI assistant to instantly generate working code.

Try It Live

Test this endpoint in our interactive playground with real data.