# Apartments.com Rentals Scraper — No Login Required (`crowdpull/apartments-com-rentals-scraper`) Actor

Extract rental listings from Apartments.com by city, neighborhood, ZIP, or search URL. No login or cookies needed. Supports bedroom, rent, pet-friendly, property-type, pagination, phone, exact-city filtering, Smart Scrape, and diagnostics.

- **URL**: https://apify.com/crowdpull/apartments-com-rentals-scraper.md
- **Developed by:** [Crowd Pull](https://apify.com/crowdpull) (community)
- **Categories:** Real estate, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.25 / 1,000 rental listing extracteds

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

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## Apartments.com Rentals Scraper

Extract Apartments.com rental search results by city, neighborhood, ZIP, or direct Apartments.com search URL. The actor returns structured property rows for rent comps, market monitoring, apartment-lead research, and cross-portal rental intelligence.

This actor is read-only. It never clicks Contact, Apply, Request Tour, phone/tel links, or other conversion flows that can notify or charge a property advertiser.

### Features

- Build deterministic Apartments.com search URLs for city, ZIP, neighborhood slug, bedroom, max-rent, pet-friendly, property-type, and style filters.
- Accept direct Apartments.com search URLs for uncommon neighborhood slugs or prebuilt filters.
- Extract property name, address, rent range, bed/bath range, phone, canonical listing URL, and listing ID.
- Paginate up to Apartments.com's practical 28-page cap, with max-results limits per search.
- Filter out sponsored/out-of-state placards when the requested state is known, with optional exact-city filtering.
- Retry protected, rewritten, or empty pages with fresh browser/proxy sessions.
- Save run summaries, normalized search specs, and failed targets to key-value storage.
- Optional Smart Scrape mode emits only new or materially changed listings.

### Inputs

- `searches`: Structured search objects. Each object can set `location`, `locationSlug`, `scope`, `state`, `zipCode`, `propertyType`, `bedrooms`, `maxRent`, `petFriendly`, `modifiers`, `maxPages`, and `maxResultsPerSearch`.
- `startUrls`: Direct Apartments.com search URLs, such as `https://www.apartments.com/austin-tx/min-1-bedrooms-under-2500-pet-friendly/`.
- `locations` / `location`: City, neighborhood, or ZIP values. For uncommon neighborhoods, use `locationSlug`.
- `propertyType`: `apartments`, `houses`, `townhomes`, or `condos`.
- `bedrooms`: `studio`, `1`, `2`, `3`, `4`, `5+`, or `any`.
- `maxRent`: Maximum monthly rent. Apartments.com's URL layer supports max-only pricing filters.
- `petFriendly` and `modifiers`: Optional canonical filters.
- `browserEngine`: `playwright` by default, with `patchright` retained for hosted A/B diagnostics.
- `filterToRequestedCity`: Optional exact-city filter for city searches. Leave off for borough, neighborhood, metro, and Apartments.com nearby-result behavior.
- `maxPages`, `maxResultsPerSearch`, `maxAttemptsPerPage`, `maxConcurrency`, `delayMs`: Browser and pagination controls.
- `onlyNew`, `cacheName`: Smart Scrape controls.
- `proxyConfig`: US residential proxies are strongly recommended because Apartments.com search pages are Akamai-protected.

#### Example Input

```json
{
  "searches": [
    {
      "location": "Austin, TX",
      "bedrooms": "1",
      "maxRent": 2500,
      "petFriendly": true,
      "maxPages": 1,
      "maxResultsPerSearch": 25
    }
  ],
  "browserEngine": "playwright",
  "proxyConfig": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "US"
  }
}
````

#### Direct URL Example

```json
{
  "startUrls": [
    {
      "url": "https://www.apartments.com/manhattan-ny/studios-under-3000/"
    }
  ],
  "maxPages": 2,
  "maxResultsPerSearch": 50
}
```

### Output

Each rental listing row includes:

- Search URL, resolved URL, requested location, page, and result count metadata
- Property name, listing ID, listing URL, address, city, state, ZIP
- Rent range, parsed min/max rent, bed range, bath range
- Phone number when surfaced on the search card
- Sponsored flag and scrape timestamp

Run metadata is saved to the default key-value store under `SUMMARY`, `SEARCH_SPECS`, and `FAILED_TARGETS`.

#### Example Output

```json
{
  "type": "listing",
  "source": "apartments.com",
  "status": "ok",
  "requestedLocation": "Austin, TX",
  "canonicalUrl": "https://www.apartments.com/austin-tx/min-1-bedrooms-under-2500-pet-friendly/",
  "resolvedUrl": "https://www.apartments.com/austin-tx/min-1-bedrooms-under-2500-pet-friendly/",
  "page": 1,
  "propertyName": "The Quincy",
  "listingId": "abcde",
  "url": "https://www.apartments.com/the-quincy-austin-tx/abcde/",
  "address": "215 Brazos St, Austin, TX 78701",
  "city": "Austin",
  "state": "TX",
  "zip": "78701",
  "priceRangeUsd": "$1,750 - $5,200",
  "priceMinUsd": 1750,
  "priceMaxUsd": 5200,
  "bedRange": "Studio - 3 bd",
  "bathRange": "1 - 2 ba",
  "phone": "(512) 555-0100",
  "scrapedAt": "2026-06-02T12:00:00.000Z"
}
```

### Pricing

This actor uses pay-per-event pricing. The primary charge is a listing-row event, with a small page-load event for successful rendered search pages.

- `listing-extracted`: charged once per listing row emitted. Launch pricing starts at `$4.75 / 1,000` rows, with lower rates for higher Apify customer tiers.
- `search-page-loaded`: `$0.015` per successfully loaded rendered search page.
- `apify-actor-start`: `$0.005` one-time start event.

Platform usage is paid by the user because the actor uses browser rendering and residential proxies for Apartments.com's Akamai-protected search pages.

### Limitations

- Apartments.com may rewrite invalid geo slugs to nearby valid locations. The actor records `resolvedUrl` and logs rewrites.
- Apartments.com's current indexed combined-filter grammar uses one segment, such as `min-N-bedrooms-under-price-pet-friendly`; studio filters use `studios` / `studios-under-price`. Older `N-bedrooms-under-price`, `studio-bedrooms-under-price`, and split `/min-N-bedrooms-under-price/pet-friendly/` URLs can now return 404.
- `patchright` is available as a diagnostic browser mode, but `playwright` is the default hosted smoke path.
- Search pages are protected by Akamai and should be treated as browser-only unless live testing proves a cheaper path.
- ZIP-only input depends on public ZIP resolution. If exact geography matters, provide an Apartments.com `locationSlug`.
- Apartments.com URL filters support max rent, not min rent. Min-rent or price-band needs post-filtering or a future form-driven browser path.
- Search-card pages do not consistently expose coordinates in hosted runs. Coordinates are intentionally not part of the launch dataset contract; add a tested detail-page hydrator before promising lat/lon.

# Actor input Schema

## `searches` (type: `array`):

Run one or more structured Apartments.com searches. Each search can override location, slug, filters, pagination, and result limits.

## `startUrls` (type: `array`):

Optional direct Apartments.com search URLs. Pagination and extraction options still apply. Do not use contact, apply, request-tour, or phone/tel URLs.

## `locations` (type: `array`):

City, neighborhood, or ZIP inputs. Examples: Austin, TX; 78704; Manhattan, New York, NY. For uncommon neighborhoods, prefer searches\[].locationSlug.

## `location` (type: `string`):

Default city, neighborhood, or ZIP. City inputs should include a state, such as Austin, TX.

## `locationSlug` (type: `string`):

Optional Apartments.com geo slug, such as austin-tx, austin-tx-78704, or east-austin-austin-tx. Use this for neighborhoods that do not slugify cleanly.

## `scope` (type: `string`):

How the location should be interpreted when constructing a canonical URL.

## `state` (type: `string`):

Two-letter US state abbreviation. Used for canonical slugs and out-of-state sponsored listing filtering.

## `zipCode` (type: `string`):

Optional ZIP code. If scope is ZIP, the actor resolves the ZIP to a city/state slug when needed.

## `propertyType` (type: `string`):

Apartments.com property type filter.

## `bedrooms` (type: `string`):

Bedroom filter. Studio uses studios or studios-under-price. Numeric bedroom-plus-rent-plus-pet filters are combined into Apartments.com's current canonical segment, such as min-N-bedrooms-under-price-pet-friendly.

## `maxRent` (type: `integer`):

Maximum monthly rent in USD. Apartments.com's URL layer supports max-only rent filters.

## `petFriendly` (type: `boolean`):

Only include searches using the Apartments.com pet-friendly filter.

## `modifiers` (type: `array`):

Optional canonical modifiers that can stack: luxury, cheap, new, short-term.

## `filterOutOfStateAds` (type: `boolean`):

Drop sponsored or ad-pinned placards when their parsed state differs from the requested state.

## `filterToRequestedCity` (type: `boolean`):

Drop rows whose parsed city differs from the requested city. Leave off for borough, neighborhood, metro, and Apartments.com nearby-result behavior.

## `browserEngine` (type: `string`):

Chromium engine used for rendered search pages. Playwright is the default; Patchright is available for hosted A/B diagnostics.

## `maxPages` (type: `integer`):

Maximum result pages to open for each search. Apartments.com usually caps pagination around 28 pages.

## `maxResultsPerSearch` (type: `integer`):

Maximum listing rows emitted for each search before pagination stops.

## `maxAttemptsPerPage` (type: `integer`):

Retry blocked, rewritten, or empty pages with a fresh browser/proxy session.

## `maxConcurrency` (type: `integer`):

Number of Apartments.com pages processed in parallel. Keep low because this actor is browser-bound and proxy-sensitive.

## `delayMs` (type: `integer`):

Base delay between page loads in milliseconds.

## `navigationTimeoutSecs` (type: `integer`):

Per-page browser navigation timeout.

## `onlyNew` (type: `boolean`):

Emit only listings whose material fields are new or changed in the named Smart Scrape cache.

## `cacheName` (type: `string`):

Named key-value store used by onlyNew. Defaults to apartments-com-rentals-smart-cache.

## `saveDebugHtml` (type: `boolean`):

Save failed, blocked, rewritten, or no-result page HTML and screenshots to the default key-value store.

## `proxyConfig` (type: `object`):

US residential proxies are strongly recommended. Apartments.com search pages are Akamai-protected and direct datacenter fetches commonly fail.

## Actor input object example

```json
{
  "searches": [
    {
      "location": "Austin, TX",
      "bedrooms": "1",
      "maxRent": 2500,
      "petFriendly": true,
      "maxPages": 1,
      "maxResultsPerSearch": 25
    },
    {
      "location": "Manhattan, NY",
      "scope": "city",
      "state": "NY",
      "bedrooms": "studio",
      "maxRent": 3000,
      "propertyType": "apartments"
    }
  ],
  "startUrls": [
    {
      "url": "https://www.apartments.com/austin-tx/min-1-bedrooms-under-2500-pet-friendly/"
    }
  ],
  "location": "Austin, TX",
  "scope": "city",
  "state": "TX",
  "propertyType": "apartments",
  "bedrooms": "any",
  "maxRent": 2500,
  "petFriendly": false,
  "filterOutOfStateAds": true,
  "filterToRequestedCity": false,
  "browserEngine": "playwright",
  "maxPages": 1,
  "maxResultsPerSearch": 25,
  "maxAttemptsPerPage": 3,
  "maxConcurrency": 1,
  "delayMs": 2500,
  "navigationTimeoutSecs": 60,
  "onlyNew": false,
  "cacheName": "apartments-com-rentals-smart-cache",
  "saveDebugHtml": false,
  "proxyConfig": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `summary` (type: `string`):

No description

## `failedTargets` (type: `string`):

No description

## `searchSpecs` (type: `string`):

No description

# 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 = {
    "searches": [
        {
            "location": "Austin, TX",
            "bedrooms": "1",
            "maxRent": 2500,
            "petFriendly": true,
            "maxPages": 1,
            "maxResultsPerSearch": 25
        },
        {
            "location": "Manhattan, NY",
            "scope": "city",
            "state": "NY",
            "bedrooms": "studio",
            "maxRent": 3000,
            "propertyType": "apartments"
        }
    ],
    "startUrls": [
        {
            "url": "https://www.apartments.com/austin-tx/min-1-bedrooms-under-2500-pet-friendly/"
        }
    ],
    "location": "Austin, TX",
    "state": "TX",
    "maxRent": 2500
};

// Run the Actor and wait for it to finish
const run = await client.actor("crowdpull/apartments-com-rentals-scraper").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 = {
    "searches": [
        {
            "location": "Austin, TX",
            "bedrooms": "1",
            "maxRent": 2500,
            "petFriendly": True,
            "maxPages": 1,
            "maxResultsPerSearch": 25,
        },
        {
            "location": "Manhattan, NY",
            "scope": "city",
            "state": "NY",
            "bedrooms": "studio",
            "maxRent": 3000,
            "propertyType": "apartments",
        },
    ],
    "startUrls": [{ "url": "https://www.apartments.com/austin-tx/min-1-bedrooms-under-2500-pet-friendly/" }],
    "location": "Austin, TX",
    "state": "TX",
    "maxRent": 2500,
}

# Run the Actor and wait for it to finish
run = client.actor("crowdpull/apartments-com-rentals-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searches": [
    {
      "location": "Austin, TX",
      "bedrooms": "1",
      "maxRent": 2500,
      "petFriendly": true,
      "maxPages": 1,
      "maxResultsPerSearch": 25
    },
    {
      "location": "Manhattan, NY",
      "scope": "city",
      "state": "NY",
      "bedrooms": "studio",
      "maxRent": 3000,
      "propertyType": "apartments"
    }
  ],
  "startUrls": [
    {
      "url": "https://www.apartments.com/austin-tx/min-1-bedrooms-under-2500-pet-friendly/"
    }
  ],
  "location": "Austin, TX",
  "state": "TX",
  "maxRent": 2500
}' |
apify call crowdpull/apartments-com-rentals-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=crowdpull/apartments-com-rentals-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Apartments.com Rentals Scraper — No Login Required",
        "description": "Extract rental listings from Apartments.com by city, neighborhood, ZIP, or search URL. No login or cookies needed. Supports bedroom, rent, pet-friendly, property-type, pagination, phone, exact-city filtering, Smart Scrape, and diagnostics.",
        "version": "0.1",
        "x-build-id": "Wt6TNx8wc2ouxEyB4"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/crowdpull~apartments-com-rentals-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-crowdpull-apartments-com-rentals-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/crowdpull~apartments-com-rentals-scraper/runs": {
            "post": {
                "operationId": "runs-sync-crowdpull-apartments-com-rentals-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/crowdpull~apartments-com-rentals-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-crowdpull-apartments-com-rentals-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "searches": {
                        "title": "Searches",
                        "type": "array",
                        "description": "Run one or more structured Apartments.com searches. Each search can override location, slug, filters, pagination, and result limits.",
                        "items": {
                            "type": "object"
                        }
                    },
                    "startUrls": {
                        "title": "Apartments.com Search URLs",
                        "type": "array",
                        "description": "Optional direct Apartments.com search URLs. Pagination and extraction options still apply. Do not use contact, apply, request-tour, or phone/tel URLs.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL",
                                    "description": "Apartments.com search/filter URL."
                                }
                            }
                        }
                    },
                    "locations": {
                        "title": "Locations",
                        "type": "array",
                        "description": "City, neighborhood, or ZIP inputs. Examples: Austin, TX; 78704; Manhattan, New York, NY. For uncommon neighborhoods, prefer searches[].locationSlug.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "location": {
                        "title": "Location",
                        "type": "string",
                        "description": "Default city, neighborhood, or ZIP. City inputs should include a state, such as Austin, TX.",
                        "default": "Austin, TX"
                    },
                    "locationSlug": {
                        "title": "Location Slug",
                        "type": "string",
                        "description": "Optional Apartments.com geo slug, such as austin-tx, austin-tx-78704, or east-austin-austin-tx. Use this for neighborhoods that do not slugify cleanly."
                    },
                    "scope": {
                        "title": "Location Scope",
                        "enum": [
                            "city",
                            "neighborhood",
                            "zip",
                            "slug"
                        ],
                        "type": "string",
                        "description": "How the location should be interpreted when constructing a canonical URL.",
                        "default": "city"
                    },
                    "state": {
                        "title": "State",
                        "type": "string",
                        "description": "Two-letter US state abbreviation. Used for canonical slugs and out-of-state sponsored listing filtering."
                    },
                    "zipCode": {
                        "title": "ZIP Code",
                        "pattern": "^\\d{5}$",
                        "type": "string",
                        "description": "Optional ZIP code. If scope is ZIP, the actor resolves the ZIP to a city/state slug when needed."
                    },
                    "propertyType": {
                        "title": "Property Type",
                        "enum": [
                            "apartments",
                            "houses",
                            "townhomes",
                            "condos"
                        ],
                        "type": "string",
                        "description": "Apartments.com property type filter.",
                        "default": "apartments"
                    },
                    "bedrooms": {
                        "title": "Bedrooms",
                        "enum": [
                            "any",
                            "studio",
                            "1",
                            "2",
                            "3",
                            "4",
                            "5+"
                        ],
                        "type": "string",
                        "description": "Bedroom filter. Studio uses studios or studios-under-price. Numeric bedroom-plus-rent-plus-pet filters are combined into Apartments.com's current canonical segment, such as min-N-bedrooms-under-price-pet-friendly.",
                        "default": "any"
                    },
                    "maxRent": {
                        "title": "Maximum Rent",
                        "minimum": 1,
                        "maximum": 100000,
                        "type": "integer",
                        "description": "Maximum monthly rent in USD. Apartments.com's URL layer supports max-only rent filters."
                    },
                    "petFriendly": {
                        "title": "Pet Friendly",
                        "type": "boolean",
                        "description": "Only include searches using the Apartments.com pet-friendly filter.",
                        "default": false
                    },
                    "modifiers": {
                        "title": "Style / Quality Modifiers",
                        "type": "array",
                        "description": "Optional canonical modifiers that can stack: luxury, cheap, new, short-term.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "filterOutOfStateAds": {
                        "title": "Filter Out-of-State Placards",
                        "type": "boolean",
                        "description": "Drop sponsored or ad-pinned placards when their parsed state differs from the requested state.",
                        "default": true
                    },
                    "filterToRequestedCity": {
                        "title": "Filter To Requested City",
                        "type": "boolean",
                        "description": "Drop rows whose parsed city differs from the requested city. Leave off for borough, neighborhood, metro, and Apartments.com nearby-result behavior.",
                        "default": false
                    },
                    "browserEngine": {
                        "title": "Browser Engine",
                        "enum": [
                            "playwright",
                            "patchright"
                        ],
                        "type": "string",
                        "description": "Chromium engine used for rendered search pages. Playwright is the default; Patchright is available for hosted A/B diagnostics.",
                        "default": "playwright"
                    },
                    "maxPages": {
                        "title": "Max Pages Per Search",
                        "minimum": 1,
                        "maximum": 28,
                        "type": "integer",
                        "description": "Maximum result pages to open for each search. Apartments.com usually caps pagination around 28 pages.",
                        "default": 1
                    },
                    "maxResultsPerSearch": {
                        "title": "Max Results Per Search",
                        "minimum": 1,
                        "maximum": 700,
                        "type": "integer",
                        "description": "Maximum listing rows emitted for each search before pagination stops.",
                        "default": 25
                    },
                    "maxAttemptsPerPage": {
                        "title": "Max Attempts Per Page",
                        "minimum": 1,
                        "maximum": 5,
                        "type": "integer",
                        "description": "Retry blocked, rewritten, or empty pages with a fresh browser/proxy session.",
                        "default": 3
                    },
                    "maxConcurrency": {
                        "title": "Max Concurrency",
                        "minimum": 1,
                        "maximum": 3,
                        "type": "integer",
                        "description": "Number of Apartments.com pages processed in parallel. Keep low because this actor is browser-bound and proxy-sensitive.",
                        "default": 1
                    },
                    "delayMs": {
                        "title": "Delay Between Pages",
                        "minimum": 0,
                        "maximum": 60000,
                        "type": "integer",
                        "description": "Base delay between page loads in milliseconds.",
                        "default": 2500
                    },
                    "navigationTimeoutSecs": {
                        "title": "Navigation Timeout Seconds",
                        "minimum": 15,
                        "maximum": 180,
                        "type": "integer",
                        "description": "Per-page browser navigation timeout.",
                        "default": 60
                    },
                    "onlyNew": {
                        "title": "Smart Scrape Only New / Changed",
                        "type": "boolean",
                        "description": "Emit only listings whose material fields are new or changed in the named Smart Scrape cache.",
                        "default": false
                    },
                    "cacheName": {
                        "title": "Smart Scrape Cache Name",
                        "type": "string",
                        "description": "Named key-value store used by onlyNew. Defaults to apartments-com-rentals-smart-cache.",
                        "default": "apartments-com-rentals-smart-cache"
                    },
                    "saveDebugHtml": {
                        "title": "Save Debug HTML",
                        "type": "boolean",
                        "description": "Save failed, blocked, rewritten, or no-result page HTML and screenshots to the default key-value store.",
                        "default": false
                    },
                    "proxyConfig": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "US residential proxies are strongly recommended. Apartments.com search pages are Akamai-protected and direct datacenter fetches commonly fail.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ],
                            "apifyProxyCountry": "US"
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
