# Rental Price Analyzer — Rentometer Alternative (`khadinakbar/rentometer-alternative`) Actor

Analyze rental prices from a subject property and comparables you supply. Get a recommended monthly rent, median, weighted mean, percentile range, and similarity scores while retaining the source observations.

- **URL**: https://apify.com/khadinakbar/rentometer-alternative.md
- **Developed by:** [Khadin Akbar](https://apify.com/khadinakbar) (community)
- **Categories:** Real estate, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $250.00 / 1,000 rent comparable analysis reports

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## Rental Price Analyzer — Rentometer Alternative

Analyze rental prices from a subject property and comparables you supply. Get a recommended monthly rent, median, weighted mean, percentile range, and similarity scores while retaining the source observations. For property managers, the dataset returns one rental analysis that retains the comparable observations supporting the estimate.

### Workflow: put the results to work

Supply the subject property and at least three authorized rental observations. Review which comparables survive the filters and how similarity affects the result. Use the range and underlying observations together when preparing a rent recommendation; this workflow does not discover listings from an address.

### When to use this Actor

Use it when you already have rental comparables from an authorized listing export, property-management system, MLS feed, or your own research and need a reproducible analysis in JSON. It is a good fit for landlords, property managers, analysts, and PropTech workflows that need to retain each comparable row and its provenance.

For address-only data discovery, managed listing data, tenant screening, appraisals, lending, or automated rent-setting, use a purpose-built data or professional workflow. The Actor keeps its role narrow: it does not retrieve listings, geocode addresses, convert currencies, or verify availability. It reports the inputs and assumptions it used so a human can review the result.

### Output and price

Review the Pricing tab for current event rates. Total run cost includes the events actually charged and Apify platform usage; any separately billed provider access is described in the input and data-access guidance.

| Field | Meaning |
| --- | --- |
| `recommendedMonthlyRent` | Weighted median by default, or weighted mean when selected. |
| `medianMonthlyRent` and `weightedMeanMonthlyRent` | Two transparent statistics for review. |
| `rentRange` | 25th–75th percentile range of retained comparable rents. |
| `comparables` | Retained caller-provided rows with source URLs/labels when supplied. |
| `sourceProvenance` | The caller-provided boundary and source-count details. |
| `methodology` and report boundaries | Applied filters, outlier treatment, and decision boundaries. |

The Actor displays the maximum event charge before analysis. One execution produces at most one billable report; invalid input and valid-empty outcomes produce no report charge.

### Input contract

Required inputs are `subject` and `comparables`.

- `subject` accepts available context such as address, bedrooms, bathrooms, type, square footage, and coordinates. Only paired latitude/longitude values enable distance filtering.
- `comparables` accepts 3–200 authorized rental observations. Each needs `rentMonthly`; optional fields include `currency`, bedroom/bath counts, property type, size, observed time, source URL/label, and coordinates.
- `currency`, age/distance limits, similarity score, outlier strategy, and report-row cap have practical defaults and are fully reflected in the report.

The Actor uses a transparent heuristic: comparable attributes reduce a score only when both values exist; a supplied distance can exclude a row; and IQR outlier removal is optional. Missing facts stay null rather than being invented.

### Example

```json
{
  "subject": {
    "address": "15 Broad St, Boston, MA",
    "bedrooms": 2,
    "bathrooms": 1,
    "propertyType": "apartment"
  },
  "comparables": [
    { "id": "comp-1", "rentMonthly": 4200, "currency": "USD", "bedrooms": 2, "bathrooms": 1, "propertyType": "apartment", "sourceLabel": "Authorized portfolio export" },
    { "id": "comp-2", "rentMonthly": 4350, "currency": "USD", "bedrooms": 2, "bathrooms": 1, "propertyType": "apartment", "sourceLabel": "Authorized portfolio export" },
    { "id": "comp-3", "rentMonthly": 4100, "currency": "USD", "bedrooms": 2, "bathrooms": 1, "propertyType": "apartment", "sourceLabel": "Authorized portfolio export" }
  ],
  "currency": "USD",
  "analysisMethod": "weightedMedian"
}
```

The resulting record has the following shape:

```json
{
  "recommendedMonthlyRent": 4200,
  "currency": "USD",
  "medianMonthlyRent": 4200,
  "weightedMeanMonthlyRent": 4216.67,
  "rentRange": { "percentile25": 4150, "percentile75": 4275 },
  "comparableCount": 3,
  "sourceProvenance": { "mode": "caller-provided", "sourceUrlsProvided": 0 },
  "methodology": { "version": "rent-comp-v1", "analysisMethod": "weightedMedian" }
}
```

### Workflow story: from authorized export to reviewed rent report

Start with a rental export that you are authorized to analyze. Then run this Actor with the subject and comparable rows, review the report's range and provenance, and pass the final dataset record into your own approved pricing or portfolio-review workflow. Start a run with Apify's API, then read its dataset and compact `OUTPUT` record after completion.

```bash
curl -X POST "https://api.apify.com/v2/acts/khadinakbar~rentometer-alternative/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d @input.json
```

For recurring workflows, execute your authorized listing-export Actor first and pass its curated rows into this Actor. Preserve the original source URL, source label, and observation time on every row. Schedules, webhooks, and Actor chaining are platform capabilities; configure and test them for your own workflow before relying on them.

### AI-agent prompt

Review the Pricing tab for current event rates. Total run cost includes the events actually charged and Apify platform usage; any separately billed provider access is described in the input and data-access guidance.

An AI agent can call the Actor through the Apify API with the same JSON contract. Read `OUTPUT` for the outcome, then read the dataset for the report and its source context. The report has one compact page of comparable rows; tighten `maxComparablesInReport` when a downstream agent needs fewer rows.

### Report outcomes

- `COMPLETE`: a billable report was persisted from at least three retained comparables.
- `VALID_EMPTY`: valid input left fewer than three comparable rows after transparent filters; no report charge is made.
- `INVALID_INPUT`: fix the subject, comparable count, currency, or documented bounds; no report charge is made.
- `PARTIAL`: a report was persisted while a configured charge cap prevented the primary event charge.
- `CONFIG_ERROR` or `UPSTREAM_FAILED`: the run records a truthful diagnostic in `RUN_SUMMARY` for review.

### How this workflow compares with Rentometer

This Actor is a focused workflow alternative for **analyzing rental comparables you already control**. It starts from authorized comparable rows and returns machine-readable statistics, filters, provenance, and interpretation notes. Rentometer remains the broader choice when you need its address-first U.S. rent-data service, its proprietary comparable dataset, hosted reports, mobile experience, or account features.

| Decision | This Actor | Rentometer | Best fit |
| --- | --- | --- | --- |
| Scope | Analyze caller-authorized comparable rows into one report. | Address-first U.S. rent analysis with its own data service. | Choose this Actor when you bring the comp data. |
| Billing | Pay per event plus platform usage; see the Pricing tab for current rates. | Subscription and credit-based product access. | Choose based on your required data access and execution frequency. |
| Input friction | Requires 3–200 authorized comparable rows. | Can begin from a U.S. property address. | Rentometer is better for an address-only lookup. |
| Effective efficiency | Completes the calculation step from prepared comparable rows in one API execution. | Combines address-first lookup with its managed data service. | Choose according to whether your comparable data is already prepared. |
| Output contract | JSON row retains applied filters, scores, caller provenance, and interpretation notes. | Rent summary and comparable outputs through its product/API. | Choose this Actor for a transparent, pipeline-ready analysis of your own data. |
| Integration and automation | API-first report execution with dataset readback. | Authenticated API access through its product. | Choose the interface that fits your established property-data workflow. |
| Freshness and provenance | Preserves each caller-supplied source label, URL, and observation time; does not claim verification. | Uses its own managed data and methodology. | Choose the system whose data boundary meets your review requirement. |

Rentometer is a trademark of its owner. This independent Actor is not affiliated, associated, or endorsed by Rentometer.

### Best results and responsible use

Submit only rental observations you are authorized to access and use. Keep the comparable input focused on listing and property facts, and process sensitive personal information only through an appropriate approved system. The Actor stores the report in the run dataset and the compact terminal records in its default key-value store, subject to your Apify storage controls. Review source terms, applicable housing rules, and your local professional requirements before using any report in a business decision.

### Builder's note

I designed this Actor to separate data collection from rent analysis. In my testing, a numerical estimate only becomes reviewable when its comparable rows, input filters, and source context remain visible; this Actor therefore retains that context and keeps caller-provided data distinct from independently sourced data. A later address-first integration needs a separately licensed, policy-compliant rental-data provider and its own release matrix.

### Pricing and run costs

This Actor uses **Pay per event plus Apify platform usage**. The [Pricing tab](https://apify.com/khadinakbar/rentometer-alternative/pricing) lists the current event rates and billing terms.

| Event | Billing unit | When it applies |
|---|---|---|
| `apify-actor-start` | Actor Start | Charged when the Actor starts running. Number of events charged depends on Actor memory (one event per GB, minimum one event). |
| `rent-comp-report` | Rent comparable analysis report | Charged for each persisted rent-comparable analysis report. |

Run cost combines the charged events and Apify platform usage. Review the run charge limit and requested result count before starting.

### Connect an AI agent

Use the [Apify MCP configurator](https://mcp.apify.com) to choose an available client connection. Inspect this Actor’s current input schema and required credentials before running it.

#### Example agent request

> Analyze rental prices from a subject property and comparables you supply. Use the inputs I supply, confirm the result limit, and return the available results with their source context and any partial or missing-data outcome.

# Actor input Schema

## `subject` (type: `object`):

Property context used to score comparable rentals, for example an address with bedrooms and coordinates. Provide only facts you are authorized to process; a working example is {"address":"15 Broad St, Boston, MA","bedrooms":2,"bathrooms":1,"propertyType":"apartment"}. Coordinates are optional but enable distance filtering when comparable coordinates are also supplied. This is not a request for the Actor to discover a property or retrieve private records.

## `comparables` (type: `array`):

Rental listings or observations you are authorized to analyze, with monthly rent and optional property facts. Supply at least three candidates; each item can include rentMonthly, bedrooms, bathrooms, propertyType, squareFeet, observedAt, sourceUrl, and coordinates. The prefill demonstrates three USD apartments near one subject property. This is not a place to submit private tenant, owner, credit, or payment information.

## `currency` (type: `string`):

Three-letter currency used for this one report, for example USD. A comparable with no currency inherits this value, while a comparable with another currency is excluded rather than converted. Defaults to USD. This is not a currency conversion service or an exchange-rate assumption.

## `analysisMethod` (type: `string`):

Select how the reported recommendation is calculated from accepted comparable rents. Use weightedMedian for a robust default or weightedMean when a score-weighted average is required. Defaults to weightedMedian and still returns both statistics for review. This is not a vendor AVM or an appraisal methodology.

## `maxComparableAgeDays` (type: `integer`):

Ignore a comparable when its observedAt value is older than this many days. Enter an integer from 1 to 1825; 365 keeps a one-year lookback. Defaults to 365 and only applies to comparables that include a valid observedAt timestamp. This is not a guarantee that a listing is currently available.

## `maxComparableDistanceMiles` (type: `number`):

Maximum distance allowed when both the subject and a comparable have latitude and longitude. Enter a value from 0.1 to 100; 5 is a practical local-market default. Defaults to 5 and does not exclude a comparable whose coordinates are unavailable. This is not a geocoder and it never guesses missing coordinates.

## `minimumComparableScore` (type: `number`):

Lowest 0–1 similarity score a comparable must meet after optional bedroom, bathroom, type, size, and distance checks. Enter a value from 0.1 to 1; 0.5 retains moderately similar rentals while rejecting weak matches. Defaults to 0.5. This is a transparent heuristic, not an independently validated accuracy score.

## `outlierStrategy` (type: `string`):

Choose whether to exclude rents outside the 1.5×IQR range before calculating the report. Use iqr for the default robust treatment or none to retain every accepted comparable. Defaults to iqr and reports the excluded count. This is not a hidden adjustment to individual rents.

## `maxComparablesInReport` (type: `integer`):

Maximum accepted comparable rows retained in the output, ranked by similarity. Enter an integer from 3 to 50; the analysis can evaluate more candidates but keeps the report compact. Defaults to 25. This is not a source-collection limit or a guarantee of a minimum number of matches.

## Actor input object example

```json
{
  "subject": {
    "address": "15 Broad St, Boston, MA",
    "bedrooms": 2,
    "bathrooms": 1,
    "propertyType": "apartment"
  },
  "comparables": [
    {
      "id": "comp-1",
      "address": "19 Broad St, Boston, MA",
      "rentMonthly": 4200,
      "currency": "USD",
      "bedrooms": 2,
      "bathrooms": 1,
      "propertyType": "apartment",
      "observedAt": "2026-08-15T00:00:00.000Z",
      "sourceUrl": "https://example.com/listings/comp-1"
    },
    {
      "id": "comp-2",
      "address": "23 Broad St, Boston, MA",
      "rentMonthly": 4350,
      "currency": "USD",
      "bedrooms": 2,
      "bathrooms": 1,
      "propertyType": "apartment",
      "observedAt": "2026-08-20T00:00:00.000Z",
      "sourceUrl": "https://example.com/listings/comp-2"
    },
    {
      "id": "comp-3",
      "address": "31 Broad St, Boston, MA",
      "rentMonthly": 4100,
      "currency": "USD",
      "bedrooms": 2,
      "bathrooms": 1,
      "propertyType": "apartment",
      "observedAt": "2026-08-27T00:00:00.000Z",
      "sourceUrl": "https://example.com/listings/comp-3"
    }
  ],
  "currency": "USD",
  "analysisMethod": "weightedMedian",
  "maxComparableAgeDays": 365,
  "maxComparableDistanceMiles": 5,
  "minimumComparableScore": 0.5,
  "outlierStrategy": "iqr",
  "maxComparablesInReport": 25
}
```

# Actor output Schema

## `rentCompReport` (type: `string`):

Completed report rows with estimate, comparable rents, provenance, and limitations.

## `runOutput` (type: `string`):

Stable terminal outcome and billable-event counts.

## `runSummary` (type: `string`):

Detailed diagnostics, filters, and safe warnings for this run.

# 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 = {
    "subject": {
        "address": "15 Broad St, Boston, MA",
        "bedrooms": 2,
        "bathrooms": 1,
        "propertyType": "apartment"
    },
    "comparables": [
        {
            "id": "comp-1",
            "address": "19 Broad St, Boston, MA",
            "rentMonthly": 4200,
            "currency": "USD",
            "bedrooms": 2,
            "bathrooms": 1,
            "propertyType": "apartment",
            "observedAt": "2026-08-15T00:00:00.000Z",
            "sourceUrl": "https://example.com/listings/comp-1"
        },
        {
            "id": "comp-2",
            "address": "23 Broad St, Boston, MA",
            "rentMonthly": 4350,
            "currency": "USD",
            "bedrooms": 2,
            "bathrooms": 1,
            "propertyType": "apartment",
            "observedAt": "2026-08-20T00:00:00.000Z",
            "sourceUrl": "https://example.com/listings/comp-2"
        },
        {
            "id": "comp-3",
            "address": "31 Broad St, Boston, MA",
            "rentMonthly": 4100,
            "currency": "USD",
            "bedrooms": 2,
            "bathrooms": 1,
            "propertyType": "apartment",
            "observedAt": "2026-08-27T00:00:00.000Z",
            "sourceUrl": "https://example.com/listings/comp-3"
        }
    ],
    "currency": "USD",
    "analysisMethod": "weightedMedian",
    "maxComparableAgeDays": 365,
    "maxComparableDistanceMiles": 5,
    "minimumComparableScore": 0.5,
    "outlierStrategy": "iqr",
    "maxComparablesInReport": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("khadinakbar/rentometer-alternative").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 = {
    "subject": {
        "address": "15 Broad St, Boston, MA",
        "bedrooms": 2,
        "bathrooms": 1,
        "propertyType": "apartment",
    },
    "comparables": [
        {
            "id": "comp-1",
            "address": "19 Broad St, Boston, MA",
            "rentMonthly": 4200,
            "currency": "USD",
            "bedrooms": 2,
            "bathrooms": 1,
            "propertyType": "apartment",
            "observedAt": "2026-08-15T00:00:00.000Z",
            "sourceUrl": "https://example.com/listings/comp-1",
        },
        {
            "id": "comp-2",
            "address": "23 Broad St, Boston, MA",
            "rentMonthly": 4350,
            "currency": "USD",
            "bedrooms": 2,
            "bathrooms": 1,
            "propertyType": "apartment",
            "observedAt": "2026-08-20T00:00:00.000Z",
            "sourceUrl": "https://example.com/listings/comp-2",
        },
        {
            "id": "comp-3",
            "address": "31 Broad St, Boston, MA",
            "rentMonthly": 4100,
            "currency": "USD",
            "bedrooms": 2,
            "bathrooms": 1,
            "propertyType": "apartment",
            "observedAt": "2026-08-27T00:00:00.000Z",
            "sourceUrl": "https://example.com/listings/comp-3",
        },
    ],
    "currency": "USD",
    "analysisMethod": "weightedMedian",
    "maxComparableAgeDays": 365,
    "maxComparableDistanceMiles": 5,
    "minimumComparableScore": 0.5,
    "outlierStrategy": "iqr",
    "maxComparablesInReport": 25,
}

# Run the Actor and wait for it to finish
run = client.actor("khadinakbar/rentometer-alternative").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 '{
  "subject": {
    "address": "15 Broad St, Boston, MA",
    "bedrooms": 2,
    "bathrooms": 1,
    "propertyType": "apartment"
  },
  "comparables": [
    {
      "id": "comp-1",
      "address": "19 Broad St, Boston, MA",
      "rentMonthly": 4200,
      "currency": "USD",
      "bedrooms": 2,
      "bathrooms": 1,
      "propertyType": "apartment",
      "observedAt": "2026-08-15T00:00:00.000Z",
      "sourceUrl": "https://example.com/listings/comp-1"
    },
    {
      "id": "comp-2",
      "address": "23 Broad St, Boston, MA",
      "rentMonthly": 4350,
      "currency": "USD",
      "bedrooms": 2,
      "bathrooms": 1,
      "propertyType": "apartment",
      "observedAt": "2026-08-20T00:00:00.000Z",
      "sourceUrl": "https://example.com/listings/comp-2"
    },
    {
      "id": "comp-3",
      "address": "31 Broad St, Boston, MA",
      "rentMonthly": 4100,
      "currency": "USD",
      "bedrooms": 2,
      "bathrooms": 1,
      "propertyType": "apartment",
      "observedAt": "2026-08-27T00:00:00.000Z",
      "sourceUrl": "https://example.com/listings/comp-3"
    }
  ],
  "currency": "USD",
  "analysisMethod": "weightedMedian",
  "maxComparableAgeDays": 365,
  "maxComparableDistanceMiles": 5,
  "minimumComparableScore": 0.5,
  "outlierStrategy": "iqr",
  "maxComparablesInReport": 25
}' |
apify call khadinakbar/rentometer-alternative --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,khadinakbar/rentometer-alternative"
        }
    }
}
```

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/IGRDsJpsPuAUDjY7C/builds/pKthdqf9WLUDcICKl/openapi.json
