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

Rightmove Property Search

GET https://scrappa.co/api/rightmove/search?location=London&channel=BUY

Search UK property listings by location name or location identifier. Returns sale, rental and commercial listings with price, bedrooms, tenure, photos, floor area and agent contact details. One search sweep reaches 1025 records across 41 pages; narrow the location to go deeper. A search on a location identifier you already resolved costs 1 API request. A search by place name costs 2 the first time for that name, because the name has to be resolved into an identifier first, and 1 once that resolution is cached. Set enrich=1 to merge the mobile listing family for rent cadence, listing status, thumbnail counts and the inline branch contact — that costs 2 API requests, or 3 on the first search for a place name whose location is not cached yet.

Rightmove Property Search 1 credit/request

Endpoint

Request preview
GET
https://scrappa.co/api/rightmove/search?location=London&channel=BUY
Auth header
x-api-key
Cost
1 credit/request
channel = BUY
Response preview
200 OK
{
    "data": {
        "properties": [],
        "count": 0
    }
}

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.

channel string Required

BUY, RENT, COMMERCIAL_BUY or COMMERCIAL_RENT.

Example value BUY
location string Optional

Place name to search, e.g. "London". Resolved to a location identifier for you. The first search for a given name resolves it and costs 2 API requests; the resolution is cached, so later searches cost 1. Pass location_identifier instead to always cost 1.

Example value London
location_identifier string Optional

A resolved identifier such as REGION^87490. Always costs 1 API request.

Example value example
radius integer Optional

Search radius in miles.

Example value 10
location_name string Optional

Optional display name sent alongside the identifier so the listing cards show a place. Ignored when location_identifier is omitted.

Example value example
min_price integer Optional

Minimum price filter, applied upstream.

Example value 10
max_price integer Optional

Maximum price filter, applied upstream.

Example value 10
min_bedrooms integer Optional

Minimum number of bedrooms.

Example value 10
max_bedrooms integer Optional

Maximum number of bedrooms.

Example value 10
property_type string Optional

Property type filter, applied upstream, for example FLAT, HOUSE or BUNGALOW.

Example value example
page integer Optional

Page number, 1 to 41.

Example value 1
must_have string Optional

Required feature filter, applied upstream. For example garden, parking or garage.

Example value example
sort integer Optional

Sort order, e.g. 2 for newest first.

Example value relevance
enrich boolean Optional

Set to 1 to merge the mobile listing family into every result for rent cadence, listing status, thumbnail and floorplan counts, and the inline branch contact. This opt-in search costs 2 API requests instead of 1, and 3 the first time a given place name has to be resolved. Commercial channels have no mobile family, so enrich is a no-op there and costs the same as a plain search.

Example value true

Request Examples

PHP
<?php

$curl = curl_init();

curl_setopt_array($curl, [
    CURLOPT_URL => "https://scrappa.co/api/rightmove/search?location=London&channel=BUY",
    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/rightmove/search?location=London&channel=BUY');

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/rightmove/search?location=London&channel=BUY', 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/rightmove/search?location=London&channel=BUY',
    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/rightmove/search?location=London&channel=BUY")
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/rightmove/search?location=London&channel=BUY", 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/rightmove/search?location=London&channel=BUY', 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/rightmove/search?location=London&channel=BUY")
        .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/rightmove/search?location=London&channel=BUY", 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/rightmove/search?location=London&channel=BUY"
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/rightmove/search?location=London&channel=BUY"));
            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/rightmove/search?location=London&channel=BUY',
            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/rightmove/search?location=London&channel=BUY")
        .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.

data
JSON Response
200 OK
{
    "data": {
        "properties": [],
        "count": 0
    }
}

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.