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.
Run this endpoint
Endpoint
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.
string
Required
City slug (sydney) or a suburb, station or university key (bondi-2026) from location-autocomplete.
sydney
integer
Optional
Result page, 1-based. 12 rooms per page.
1
string
Optional
cheapest, most-expensive, newest, earliest-available or recently-active. Default: featured first. Combines with every filter.
relevance
string
Optional
share-houses, whole-properties, granny-flats, homestays, studios, 1-beds or student-accommodation.
share-houses
string
Optional
ensuite or ensuite-or-own.
ensuite
integer
Optional
Minimum weekly rent in AUD.
200
integer
Optional
Maximum weekly rent in AUD.
300
string
Optional
1-week, 2-weeks, 3-weeks, 4-weeks, 2-months, 3-months, 6-months or 12-months.
example
string
Optional
private-room or shared-room.
example
string
Optional
females, males or couples.
example
string
Optional
furnished or unfurnished.
example
string
Optional
no-parking, off-street-parking or on-street-parking.
example
boolean
Optional
true for rooms with bills included in the rent.
true
string
Optional
Comma-separated: lgbt-friendly, retirees, students.
example
Request Examples
<?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
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();
}
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));
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);
}
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
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()
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}")
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());
}
}
}
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))
}
#!/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"
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}");
}
}
}
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();
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
{
"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.
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
}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."
}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.