Rightmove Market Comps Analyzer
Pricing
from $16.15 / 1,000 aggregate market comps report delivereds
Rightmove Market Comps Analyzer
Aggregate buyer-authorized normalized UK asking-price observations into privacy-bounded comparable-market reports without contacting Rightmove or another source.
Pricing
from $16.15 / 1,000 aggregate market comps report delivereds
Rating
0.0
(0)
Developer
Tim Zinin
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
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.

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_REPORTin 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
reportLabelin 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.
{"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
- The Actor validates the complete closed Input, buyer-authority acknowledgement, uniqueness, and the 2,097,152-byte input ceiling.
- It normalizes safe text, area thousandths, and row identities, then sorts observations deterministically. Input order cannot change the report.
- 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.
- Published groups receive nearest-rank price distributions. For a sorted sample of size
n, percentile index isceil(percent × n / 100) - 1; values are not interpolated. - 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.
- 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.
- Only after that Dataset write is confirmed does it request one
result-foundcharge. 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

A successful run stores exactly one row. The public sample produces these core fields and one group:
{"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_SOURCEmeans every contributing row was markedpartial: false; it does not certify that the observations represent the complete external market.BOUNDED_OR_PARTIAL_SAMPLEmeans at least one contributing row was declared partial.suppressedMarketDealGroupCountcounts small location/deal groups without revealing their prices.pricePerSqmPenceisnullunless 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.
reportIdandinputFingerprintare 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.
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:
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
INPUTrecord. The delivered Dataset contains aggregates and fixed notices, not the raw array or privatereportLabel. - 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.