# Rightmove Market Comps Analyzer (`zinin/rightmove-market-comps-analyzer`) Actor

Aggregate buyer-authorized normalized UK asking-price observations into privacy-bounded comparable-market reports without contacting Rightmove or another source.

- **URL**: https://apify.com/zinin/rightmove-market-comps-analyzer.md
- **Developed by:** [Tim Zinin](https://apify.com/zinin) (community)
- **Categories:** Real estate
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $16.15 / 1,000 aggregate market comps report delivereds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Rightmove Market Comps Analyzer

Turn 3–500 buyer-authorized normalized UK asking-price observations into one deterministic, privacy-bounded market-comps report. The Actor performs analysis only: it does not visit Rightmove, call another data source, crawl listing pages, or enrich the supplied rows.

![Buyer-authorized observations become privacy-bounded aggregate market groups](https://api.apify.com/v2/key-value-stores/6kNcTiL5gABbgwm5w/records/rightmove-authorized-aggregate-flow.png)

The result describes the sample you supplied. It is not sold-price evidence, a property valuation, a survey, an appraisal, a complete-market claim, or financial, mortgage, tax, legal, or investment advice. “Rightmove” is used only to describe compatible source provenance; this Actor is not affiliated with, endorsed by, or operated by Rightmove.

### What you get

- One strict `MARKET_COMPS_REPORT` in the default Dataset after the complete input passes validation.
- Separate sale and normalized-monthly-rent distributions for each `(location_identifier, deal_type)` group containing at least three observations.
- Integer minimum, nearest-rank p25, median, p75, and maximum asking prices in GBP.
- Price-per-square-metre statistics when at least three rows in a published group contain area.
- Property-type and room-count subsegments only when the subsegment itself contains at least three rows.
- Explicit partial-versus-complete sample counts, source-portal labels, deterministic fingerprints, and fixed rights and interpretation notices.
- No raw observation array, address, listing title, description, image, URL, coordinate, contact, or private `reportLabel` in the output.

This is useful for property-research briefs, market-content planning, campaign evidence tables, and buyer-controlled analytics pipelines where the observations have already been collected lawfully.

### Quick start with the public Task

Run the public Task `analyze-rightmove-market-comps-sample`. Its illustrative rows form one three-observation sale group. Replace them with observations you are authorized to process before using the result in a real workflow.

```json
{
  "observations": [
    {
      "location_identifier": "REGION^87490",
      "deal_type": "sale",
      "found": true,
      "price": 450000,
      "currency": "GBP",
      "property_type": "Terraced",
      "rooms": 3,
      "area_sqm": 90,
      "posted_date": "2026-08-01T09:00:00Z",
      "partial": false,
      "source_portal": "rightmove"
    },
    {
      "location_identifier": "REGION^87490",
      "deal_type": "sale",
      "found": true,
      "price": 475000,
      "currency": "GBP",
      "property_type": "Terraced",
      "rooms": 3,
      "area_sqm": 95,
      "posted_date": "2026-08-02T09:00:00Z",
      "partial": false,
      "source_portal": "rightmove"
    },
    {
      "location_identifier": "REGION^87490",
      "deal_type": "sale",
      "found": true,
      "price": 525000,
      "currency": "GBP",
      "property_type": "Terraced",
      "rooms": 3,
      "area_sqm": 100,
      "posted_date": "2026-08-03T09:00:00Z",
      "partial": false,
      "source_portal": "rightmove"
    }
  ],
  "reportLabel": "London asking-price sample",
  "minimumSegmentSize": 3,
  "acknowledgeBuyerAuthority": true
}
```

The Task uses `latest`, 128 MB, a 100-second timeout, and a `$0.028` maximum charge. Consume its Dataset only when the Run status is `SUCCEEDED`.

### Input reference

The Input is a closed object. Unknown top-level or observation fields are rejected.

| Field | Required | Contract |
| --- | --- | --- |
| `observations` | Yes | Array of 3–500 unique normalized observation objects. |
| `reportLabel` | No | Non-sensitive private correlation label, 0–80 safe Unicode characters. It contributes to input identity but is not returned. |
| `minimumSegmentSize` | Yes | Must be the integer `3`. |
| `acknowledgeBuyerAuthority` | Yes | Must be `true`; confirms your authority and the analytical-only scope. |

Each observation has this exact shape:

| Observation field | Required | Contract |
| --- | --- | --- |
| `location_identifier` | Yes | Uppercase grouping key such as `REGION^87490`, matching `^[A-Z][A-Z0-9_]*\^[1-9][0-9]{0,15}$`; it is not an address. |
| `deal_type` | Yes | `sale` or `rent`. Sale and rent never share a distribution. |
| `found` | Yes | Must be `true`; failed or missing source observations are not analyzable rows. |
| `price` | Yes | Integer GBP asking price from 1 to 1,000,000,000. Rent must already be normalized per calendar month. |
| `currency` | Yes | Must be `GBP`. |
| `property_type` | Yes | Safe normalized category of 1–80 characters; no address or listing prose. |
| `rooms` | No | Integer 0–100 or `null`. |
| `area_sqm` | No | Number 1–100,000 with at most three fractional digits, or `null`. |
| `posted_date` | Yes | Real Gregorian UTC timestamp in canonical `YYYY-MM-DDTHH:mm:ssZ` form. |
| `partial` | Yes | `true` when the supplied source sample was bounded, capped, or otherwise incomplete. |
| `source_portal` | Yes | Lowercase provenance label of 1–40 characters, for example `rightmove`; the label grants no source rights. |

Exact duplicate normalized observations reject the complete Input. Numeric strings, non-GBP rows, `found: false`, invalid dates, unsafe Unicode controls, formula-leading text, HTML-like text, accessors, prototypes, and non-finite numbers are also rejected rather than repaired or guessed.

### How the analysis works

1. The Actor validates the complete closed Input, buyer-authority acknowledgement, uniqueness, and the 2,097,152-byte input ceiling.
2. It normalizes safe text, area thousandths, and row identities, then sorts observations deterministically. Input order cannot change the report.
3. Rows are grouped by exact location identifier and deal type. Groups with fewer than three observations are suppressed; if every group is suppressed, no report is delivered.
4. Published groups receive nearest-rank price distributions. For a sorted sample of size `n`, percentile index is `ceil(percent × n / 100) - 1`; values are not interpolated.
5. Price per square metre is calculated only from the rows with area and only when at least three such rows exist. Property-type and room segments use the same three-row privacy threshold.
6. The Actor builds one aggregate report with no raw observation tuples. It verifies the run's exact Pay Per Event pricing and budget, proves that the default Dataset was empty for this fresh run, stores the report, and confirms the stored row.
7. Only after that Dataset write is confirmed does it request one `result-found` charge. Delivery, billing, restart, or receipt uncertainty fails closed instead of claiming a paid success.

The analytical runtime makes zero source-network requests. It has no browser, crawler, proxy, geocoder, LLM, secondary Actor, Rightmove credential, or arbitrary URL input. Normal Apify platform calls are used only for the Run input, default Dataset, and billing state.

### Output Dataset

![The aggregate report is delivered before the single result event is charged](https://api.apify.com/v2/key-value-stores/6kNcTiL5gABbgwm5w/records/rightmove-report-delivery-flow.png)

A successful run stores exactly one row. The public sample produces these core fields and one group:

```json
{
  "schemaVersion": "1.0",
  "rowType": "MARKET_COMPS_REPORT",
  "reportId": "b4130f53e35955677ec76e362ee783330bdf39eef86791f9e1976c02353752ee",
  "analysisType": "RIGHTMOVE_MARKET_COMPS_ANALYZER",
  "sourceMode": "BUYER_AUTHORIZED_INLINE_OBSERVATIONS",
  "acceptedObservationCount": 3,
  "partialObservationCount": 0,
  "completeObservationCount": 3,
  "publishedMarketDealGroupCount": 1,
  "suppressedMarketDealGroupCount": 0,
  "minimumSegmentSize": 3,
  "percentileMethod": "NEAREST_RANK_CEIL",
  "priceUnit": "GBP_ASKING_PRICE",
  "sourcePortals": ["rightmove"],
  "marketDealReports": [
    {
      "locationIdentifier": "REGION^87490",
      "dealType": "sale",
      "sampleCount": 3,
      "partialCount": 0,
      "completeCount": 3,
      "sampleProvenance": "COMPLETE_SOURCE",
      "postedDateRange": {
        "earliest": "2026-08-01T09:00:00Z",
        "latest": "2026-08-03T09:00:00Z"
      },
      "askingPriceGbp": {
        "minimum": 450000,
        "p25": 450000,
        "median": 475000,
        "p75": 525000,
        "maximum": 525000
      },
      "pricePerSqmPence": {
        "sampleCount": 3,
        "minimum": 500000,
        "p25": 500000,
        "median": 500000,
        "p75": 525000,
        "maximum": 525000
      },
      "propertyTypeSegments": [
        {
          "propertyType": "Terraced",
          "sampleCount": 3,
          "partialCount": 0,
          "completeCount": 3,
          "sampleProvenance": "COMPLETE_SOURCE",
          "askingPriceGbp": {
            "minimum": 450000,
            "p25": 450000,
            "median": 475000,
            "p75": 525000,
            "maximum": 525000
          }
        }
      ],
      "roomSegments": [
        {
          "rooms": 3,
          "sampleCount": 3,
          "partialCount": 0,
          "completeCount": 3,
          "sampleProvenance": "COMPLETE_SOURCE",
          "askingPriceGbp": {
            "minimum": 450000,
            "p25": 450000,
            "median": 475000,
            "p75": 525000,
            "maximum": 525000
          }
        }
      ]
    }
  ],
  "rightsBoundary": "CONDITIONAL_BUYER_AUTHORIZED_DERIVED_AGGREGATES_ONLY",
  "networkRequests": 0
}
```

The actual row also contains `inputFingerprint`, area units, the complete fixed rights/scope/advice notices, and the closed six-tier `billingContract`. Use the connected Dataset schema as the machine-readable contract.

#### Interpreting the report

- `COMPLETE_SOURCE` means every contributing row was marked `partial: false`; it does not certify that the observations represent the complete external market.
- `BOUNDED_OR_PARTIAL_SAMPLE` means at least one contributing row was declared partial.
- `suppressedMarketDealGroupCount` counts small location/deal groups without revealing their prices.
- `pricePerSqmPence` is `null` unless at least three contributing rows have area. Values are integer pence per square metre.
- Segment arrays include only categories with at least three rows and are capped at 100 deterministic entries each.
- `reportId` and `inputFingerprint` are deterministic identifiers, not source signatures, rights certificates, or evidence of market completeness.

### Pricing

The Actor uses six-tier Pay Per Event pricing. The platform charges one automatic Actor Start, and the Actor charges one primary `result-found` only after the complete report is confirmed in the default Dataset. Dataset items have no separate price.

| Tier | Actor Start | One stored report | Maximum successful run |
| --- | ---: | ---: | ---: |
| FREE | $0.009000 | $0.019000 | $0.028000 |
| BRONZE | $0.008550 | $0.018050 | $0.026600 |
| SILVER | $0.008100 | $0.017100 | $0.025200 |
| GOLD | $0.007650 | $0.016150 | $0.023800 |
| PLATINUM | $0.007380 | $0.015580 | $0.022960 |
| DIAMOND | $0.007200 | $0.015200 | $0.022400 |

The release Task cap is `$0.028`, enough for one successful report at every tier. Invalid input, a sample with no publishable three-row group, a failed Dataset write, or unconfirmed delivery creates no `result-found`; the automatic Actor Start may still be charged by Apify. The runtime checks the active price pair, prior counters, and remaining budget before delivery.

Do not blindly retry a timed-out or failed paid Run. First inspect its original status, default Dataset, and charged event counts: a report can have been stored before a later confirmation failed, and the fail-closed contract intentionally avoids claiming success when delivery or billing is ambiguous.

### API and automation

Start the public Task and wait for a terminal status. Keep API tokens outside source code, workflow exports, URLs copied into tickets, and shared logs.

```bash
curl -X POST \
  "https://api.apify.com/v2/actor-tasks/zinin~analyze-rightmove-market-comps-sample/runs?token=YOUR_APIFY_TOKEN&waitForFinish=120" \
  -H "Content-Type: application/json" \
  --data @authorized-observations.json
```

Read `defaultDatasetId` from the completed Run object, then fetch the one report:

```bash
curl \
  "https://api.apify.com/v2/datasets/DEFAULT_DATASET_ID/items?clean=1&format=json&token=YOUR_APIFY_TOKEN"
```

For **Make**, use Apify's “Run a Task” module, select `analyze-rightmove-market-comps-sample`, provide the four top-level fields, wait for `SUCCEEDED`, and then use “Get dataset items”. Route `BOUNDED_OR_PARTIAL_SAMPLE` and non-zero suppressed-group counts to human review.

For **n8n**, call the same Task-run endpoint with an HTTP Request node, poll or wait for a terminal Run, and fetch the returned Dataset only after success. Use `reportId` as a deterministic deduplication key, while retaining the Run ID and Dataset ID as operational evidence.

The Apify platform persists each Run's submitted input as the `INPUT` record in that Run's default Key-Value Store under your account's retention and access settings. This Actor does not write a second copy or a dynamic `OUTPUT` KVS record; its product output is the default Dataset. Because the `INPUT` record contains every supplied observation, submit no secrets or personal data and delete retained storage when it is no longer needed.

### Security, privacy, and source rights

- You must have lawful authority to process every supplied observation. A public page, portal label, or compatibility with another Actor does not by itself grant collection, reuse, or republication rights.
- The Actor neither obtains nor validates Rightmove permission. `source_portal: "rightmove"` is nominative provenance only and does not establish affiliation, endorsement, licensing, completeness, or authenticity.
- Do not submit addresses, names, contact details, listing prose, URLs, images, coordinates, credentials, or other fields outside the closed schema. Unknown fields are rejected, not silently stored in output.
- The runtime uses Apify `LIMITED_PERMISSIONS`, makes no source HTTP or DNS request, calls no other Actor, and uses no browser, proxy, or AI service.
- Raw observations remain in the platform-managed default KVS `INPUT` record. The delivered Dataset contains aggregates and fixed notices, not the raw array or private `reportLabel`.
- Runtime logs contain only fixed error codes and aggregate completion counts. They do not intentionally log observations or arbitrary source text.
- Apply your own retention, access-control, and deletion policy to Apify Run storage. Avoid personal data and data whose licence or contractual terms prohibit this processing.

### Hard limits

| Boundary | Limit |
| --- | ---: |
| Observations | 3–500 |
| Input JSON | 2,097,152 UTF-8 bytes |
| Output report | 2,097,152 UTF-8 bytes |
| Publishable market/deal group | At least 3 rows |
| Publishable property/room subsegment | At least 3 rows |
| Property-type segments per group | 100 |
| Room-count segments per group | 100 |
| Price | Integer GBP 1–1,000,000,000 |
| Area | 1–100,000 m², at most 3 decimals |
| Actor memory / timeout | 128 MB / 100 seconds |
| Source-network requests | 0 |
| Dataset reports / named result charges | Exactly 1 / exactly 1 on confirmed success |

### Limits and responsible interpretation

- Asking prices are seller or advertiser intentions, not completed transaction prices. They can change, be withdrawn, duplicate another real-world property, or differ from the eventual sale or rent.
- The Actor cannot determine whether supplied observations are accurate, current, independent, representative, lawfully obtained, or complete. It analyzes the declared rows only.
- A three-row privacy threshold limits small-group publication; it is not statistical proof, anonymization certification, a confidence score, or permission to process personal data.
- Nearest-rank percentiles describe the bounded sample. They are not interpolated estimates, forecasts, hedonic adjustments, comparable-property selections, or valuations.
- Location identifiers are grouping keys supplied by the buyer. The Actor does not geocode them or prove their geographic meaning.
- Sale and normalized monthly rent are separated, but the Actor does not normalize weekly or annual rent for you and does not compute yield or growth.
- Property condition, tenure, lease terms, floor level, renovation, concessions, incentives, listing age, transaction context, and current demand are outside the model.
- Never use this report alone for lending, taxation, insurance, tenancy, acquisition, investment, legal, planning, or consumer-impacting decisions.

### Troubleshooting

**Why did the Run fail with `input_invalid`?**

Check that the top level has only `observations`, optional `reportLabel`, `minimumSegmentSize: 3`, and `acknowledgeBuyerAuthority: true`. Every observation must use the exact closed keys and types, `found: true`, `currency: "GBP"`, a canonical UTC timestamp, and a unique normalized identity. Rent values must already be monthly.

**Why did the Run fail with `no_publishable_group`?**

No exact `(location_identifier, deal_type)` group contained at least three valid observations. Add authorized rows to one group; do not mix sale and rent or alter location identifiers merely to evade the threshold.

**Why is `pricePerSqmPence` null or a segment missing?**

At least three rows in that exact group need valid `area_sqm` for area statistics. A property-type or room-count segment likewise needs three rows of its own. Suppression is deliberate.

**Why did the Run fail with `budget_insufficient` or `pricing_misconfigured`?**

The Run cap could not cover the exact active Actor Start plus one report event, or the live event contract differed from the six prices above. Use a cap of at least `$0.028` for the release Task and verify the Actor's current pricing before retrying.

**Why did the Run fail with `restart_state_conflict`?**

The run storage or billing counters did not represent a fresh, empty delivery. Inspect the original Run and Dataset. The Actor refuses to append or charge again when restart evidence is present.

**Why did the Run fail with `delivery_failed`, `delivery_uncertain`, or `billing_confirmation_failed`?**

Apify storage or billing did not provide an unambiguous confirmation. Do not immediately rerun. Inspect the original Dataset and charged event counts first; fail-closed behavior is designed to prevent a false success or duplicate result charge.

**Why did the Run fail with `delivery_reserve_exhausted` or `output_too_large`?**

The run lacked the fixed time reserve required for safe delivery, or the aggregate report exceeded its byte ceiling. Split independently meaningful authorized samples rather than increasing the Actor's fixed runtime limits.

### FAQ

**Does this Actor scrape Rightmove?**

No. It performs zero Rightmove or other source-network requests. You supply normalized observations inline and remain responsible for collection rights and accuracy.

**Can I pass a Rightmove URL, search area, postcode, or API token?**

No. URLs, source queries, credentials, addresses, and arbitrary fields are outside the closed Input schema.

**Are these sold-price comparables or a valuation?**

No. They are derived aggregates of supplied asking-price observations. Use an authoritative transaction source and qualified professional for sold-price or valuation work.

**Can I analyze rents?**

Yes, with `deal_type: "rent"`, but every price must already be an integer monthly GBP asking rent. Rent and sale groups remain separate.

**Does `partial: false` prove complete market coverage?**

No. It only records your declaration about that row's supplied source sample. The Actor never verifies external completeness.

**Why is the minimum group size fixed at three?**

It prevents publication of one- and two-row price groups and keeps the V1 contract deterministic. It is a product privacy boundary, not a universal anonymization guarantee.

**Where are my original observations stored?**

Apify retains the submitted Run input in the default Key-Value Store's `INPUT` record according to your account settings. The Actor's one-row Dataset contains derived aggregates, not the raw observation array.

**How many paid result events can one successful Run create?**

Exactly one `result-found`, and only after the single report is confirmed in the default Dataset. The automatic Actor Start is a separate platform event.

# Actor input Schema

## `observations` (type: `array`):

Three to 500 strict factual rows you are authorized to process. Rent prices must already be normalized per calendar month.

## `reportLabel` (type: `string`):

Optional non-sensitive buyer label used only in the input identity; it is not returned in the report.

## `minimumSegmentSize` (type: `integer`):

Fixed at three observations in V1 so smaller market and subsegment groups remain suppressed.

## `acknowledgeBuyerAuthority` (type: `boolean`):

Required and must remain true: you are authorized to process every supplied observation and understand that output is derived asking-price research, not a valuation or complete market. False is rejected by the runtime.

## Actor input object example

```json
{
  "observations": [
    {
      "location_identifier": "REGION^87490",
      "deal_type": "sale",
      "found": true,
      "price": 450000,
      "currency": "GBP",
      "property_type": "Terraced",
      "rooms": 3,
      "area_sqm": 90,
      "posted_date": "2026-08-01T09:00:00Z",
      "partial": false,
      "source_portal": "rightmove"
    },
    {
      "location_identifier": "REGION^87490",
      "deal_type": "sale",
      "found": true,
      "price": 475000,
      "currency": "GBP",
      "property_type": "Terraced",
      "rooms": 3,
      "area_sqm": 95,
      "posted_date": "2026-08-02T09:00:00Z",
      "partial": false,
      "source_portal": "rightmove"
    },
    {
      "location_identifier": "REGION^87490",
      "deal_type": "sale",
      "found": true,
      "price": 525000,
      "currency": "GBP",
      "property_type": "Terraced",
      "rooms": 3,
      "area_sqm": 100,
      "posted_date": "2026-08-03T09:00:00Z",
      "partial": false,
      "source_portal": "rightmove"
    }
  ],
  "reportLabel": "London asking-price sample",
  "minimumSegmentSize": 3,
  "acknowledgeBuyerAuthority": true
}
```

# Actor output Schema

## `marketCompsReport` (type: `string`):

Derived buyer-authorized sample aggregates only; groups below three are suppressed and no raw listing row is returned.

# 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 = {
    "observations": [
        {
            "location_identifier": "REGION^87490",
            "deal_type": "sale",
            "found": true,
            "price": 450000,
            "currency": "GBP",
            "property_type": "Terraced",
            "rooms": 3,
            "area_sqm": 90,
            "posted_date": "2026-08-01T09:00:00Z",
            "partial": false,
            "source_portal": "rightmove"
        },
        {
            "location_identifier": "REGION^87490",
            "deal_type": "sale",
            "found": true,
            "price": 475000,
            "currency": "GBP",
            "property_type": "Terraced",
            "rooms": 3,
            "area_sqm": 95,
            "posted_date": "2026-08-02T09:00:00Z",
            "partial": false,
            "source_portal": "rightmove"
        },
        {
            "location_identifier": "REGION^87490",
            "deal_type": "sale",
            "found": true,
            "price": 525000,
            "currency": "GBP",
            "property_type": "Terraced",
            "rooms": 3,
            "area_sqm": 100,
            "posted_date": "2026-08-03T09:00:00Z",
            "partial": false,
            "source_portal": "rightmove"
        }
    ],
    "reportLabel": "London asking-price sample",
    "minimumSegmentSize": 3,
    "acknowledgeBuyerAuthority": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("zinin/rightmove-market-comps-analyzer").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 = {
    "observations": [
        {
            "location_identifier": "REGION^87490",
            "deal_type": "sale",
            "found": True,
            "price": 450000,
            "currency": "GBP",
            "property_type": "Terraced",
            "rooms": 3,
            "area_sqm": 90,
            "posted_date": "2026-08-01T09:00:00Z",
            "partial": False,
            "source_portal": "rightmove",
        },
        {
            "location_identifier": "REGION^87490",
            "deal_type": "sale",
            "found": True,
            "price": 475000,
            "currency": "GBP",
            "property_type": "Terraced",
            "rooms": 3,
            "area_sqm": 95,
            "posted_date": "2026-08-02T09:00:00Z",
            "partial": False,
            "source_portal": "rightmove",
        },
        {
            "location_identifier": "REGION^87490",
            "deal_type": "sale",
            "found": True,
            "price": 525000,
            "currency": "GBP",
            "property_type": "Terraced",
            "rooms": 3,
            "area_sqm": 100,
            "posted_date": "2026-08-03T09:00:00Z",
            "partial": False,
            "source_portal": "rightmove",
        },
    ],
    "reportLabel": "London asking-price sample",
    "minimumSegmentSize": 3,
    "acknowledgeBuyerAuthority": True,
}

# Run the Actor and wait for it to finish
run = client.actor("zinin/rightmove-market-comps-analyzer").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 '{
  "observations": [
    {
      "location_identifier": "REGION^87490",
      "deal_type": "sale",
      "found": true,
      "price": 450000,
      "currency": "GBP",
      "property_type": "Terraced",
      "rooms": 3,
      "area_sqm": 90,
      "posted_date": "2026-08-01T09:00:00Z",
      "partial": false,
      "source_portal": "rightmove"
    },
    {
      "location_identifier": "REGION^87490",
      "deal_type": "sale",
      "found": true,
      "price": 475000,
      "currency": "GBP",
      "property_type": "Terraced",
      "rooms": 3,
      "area_sqm": 95,
      "posted_date": "2026-08-02T09:00:00Z",
      "partial": false,
      "source_portal": "rightmove"
    },
    {
      "location_identifier": "REGION^87490",
      "deal_type": "sale",
      "found": true,
      "price": 525000,
      "currency": "GBP",
      "property_type": "Terraced",
      "rooms": 3,
      "area_sqm": 100,
      "posted_date": "2026-08-03T09:00:00Z",
      "partial": false,
      "source_portal": "rightmove"
    }
  ],
  "reportLabel": "London asking-price sample",
  "minimumSegmentSize": 3,
  "acknowledgeBuyerAuthority": true
}' |
apify call zinin/rightmove-market-comps-analyzer --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,zinin/rightmove-market-comps-analyzer"
        }
    }
}

```

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/97zK2WsKECQpXe4XX/builds/r4R1TPza8PH3mMZYu/openapi.json
