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

Rightmove Sold Prices

GET https://scrappa.co/api/rightmove/sold-properties?postcode=SW1A1AA

Search historical sold prices across the UK by postcode or region, with optional property type, tenure and time-window filters. Sold data pages far deeper than active listings, so it is the way to cover a large area. A postcode search costs 3 API requests the first time for a given postcode, because the postcode has to resolve to its outcode and then to the numeric id sold data is keyed on; both resolutions are cached, so later searches for the same postcode cost 1. Send location_id with its location_type to always cost 1.

Rightmove Sold Prices 1 credit/request

Endpoint

Request preview
GET
https://scrappa.co/api/rightmove/sold-properties?postcode=SW1A1AA
Auth header
x-api-key
Cost
1 credit/request
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

This endpoint has no required query parameters.

9 optional filters available.

postcode string Optional

Full postcode such as SW1A1AA. Resolved to its outcode, then to the numeric area id sold prices are keyed on. Costs 3 API requests for a postcode not seen before; later searches for the same postcode cost 1, because both resolution hops are cached.

Example value SW1A1AA
location_id integer Optional

Numeric location id when you already have one, e.g. 87490. Sold data is keyed on this numeric id, never on an outcode string. Always costs 1 API request, and it needs a matching location_type.

Example value 1234567890
location_type string Optional

REGION, OUTCODE, POSTCODE, BRANCH or STATION. Must match the id you pass; resolve ids with /api/rightmove/locations/typeahead.

Example value example
property_type string Optional

DETACHED, FLAT, TERRACED or SEMI_DETACHED.

Example value example
tenure string Optional

FREEHOLD or LEASEHOLD.

Example value example
sold_in integer Optional

Rolling window in months: 3, 6, 12, 24 or 120.

Example value 10
page integer Optional

Page number. Sold data pages very deep.

Example value 1
radius integer Optional

Search radius in miles, 0 to 50. Applied upstream.

Example value 10
page_size integer Optional

Records per page, up to 100.

Example value 10

Request Examples

PHP
<?php

$curl = curl_init();

curl_setopt_array($curl, [
    CURLOPT_URL => "https://scrappa.co/api/rightmove/sold-properties?postcode=SW1A1AA",
    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/sold-properties?postcode=SW1A1AA');

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/sold-properties?postcode=SW1A1AA', 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/sold-properties?postcode=SW1A1AA',
    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/sold-properties?postcode=SW1A1AA")
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/sold-properties?postcode=SW1A1AA", 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/sold-properties?postcode=SW1A1AA', 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/sold-properties?postcode=SW1A1AA")
        .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/sold-properties?postcode=SW1A1AA", 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/sold-properties?postcode=SW1A1AA"
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/sold-properties?postcode=SW1A1AA"));
            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/sold-properties?postcode=SW1A1AA',
            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/sold-properties?postcode=SW1A1AA")
        .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.