{
  "openapi": "3.0.1",
  "info": {
    "title": "Apartments.com Scraper - Rentals, Prices & Property Details",
    "description": "From $1.50/1K. Scrape Apartments.com rentals by city, ZIP, neighborhood, address or URL. Extract rent, floorplans, available units, amenities, fees, schools, transit, ratings, reviews, photos, phone numbers and GPS coordinates.",
    "version": "2.0",
    "x-build-id": "1eMBfMmzwC3hnuGkZ"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~apartments-com-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-apartments-com-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/abotapi~apartments-com-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-apartments-com-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/abotapi~apartments-com-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-apartments-com-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",
        "required": [
          "mode"
        ],
        "properties": {
          "mode": {
            "title": "Mode",
            "enum": [
              "search",
              "url",
              "autocomplete"
            ],
            "type": "string",
            "description": "How to start. 'search' builds result pages from city / ZIP / address terms. 'url' scrapes Apartments.com result or property URLs you paste. 'autocomplete' returns location suggestions (region IDs, coordinates, bounding boxes) for each term, with no listing scrape.",
            "default": "search"
          },
          "locations": {
            "title": "Locations",
            "type": "array",
            "description": "City, ZIP, neighborhood, or street address terms, one per line (e.g. 'Austin, TX', '78701', 'Brooklyn, NY'). Each is resolved through Apartments.com's location service. Used by 'search' and 'autocomplete' modes; ignored in 'url' mode.",
            "items": {
              "type": "string"
            }
          },
          "propertyType": {
            "title": "Property type",
            "enum": [
              "any",
              "apartments",
              "houses",
              "condos",
              "townhomes"
            ],
            "type": "string",
            "description": "Limit to a rental type. 'Any' returns all types.",
            "default": "any"
          },
          "bedrooms": {
            "title": "Bedrooms",
            "enum": [
              "any",
              "studio",
              "1",
              "2",
              "3",
              "4"
            ],
            "type": "string",
            "description": "Minimum bedroom count. 'Any' applies no bedroom filter.",
            "default": "any"
          },
          "minRent": {
            "title": "Min rent (USD/month)",
            "minimum": 0,
            "type": "integer",
            "description": "Lowest monthly rent. Leave empty for no minimum."
          },
          "maxRent": {
            "title": "Max rent (USD/month)",
            "minimum": 0,
            "type": "integer",
            "description": "Highest monthly rent. Leave empty for no maximum."
          },
          "lifestyle": {
            "title": "Lifestyle / amenity",
            "enum": [
              "none",
              "pet-friendly",
              "luxury",
              "cheap",
              "furnished",
              "short-term",
              "utilities-included",
              "gated",
              "senior-housing",
              "student-housing",
              "income-restricted"
            ],
            "type": "string",
            "description": "Optional single lifestyle filter. Applied only when property type is 'Any' (Apartments.com does not combine a type prefix with these). 'None' applies no lifestyle filter.",
            "default": "none"
          },
          "urls": {
            "title": "URLs",
            "type": "array",
            "description": "Apartments.com result URLs (e.g. https://www.apartments.com/austin-tx/2-bedrooms/) or property URLs (e.g. https://www.apartments.com/the-grove-houston-tx/9cwjc35/), one per line. Supported: city, paginated (/2/), bedroom/price-filtered, property-type (houses/condos/townhomes), amenity (pet-friendly-dog), city-ZIP (austin-tx-78701), share links (?sk=...) and property pages. Bare /78701/ and m.apartments.com links are skipped with a warning. Multi-URL supported. Search-mode filters are ignored. Pagination starts at the page in the URL and walks forward.",
            "default": [
              "https://www.apartments.com/austin-tx/",
              "https://www.apartments.com/austin-tx/2/",
              "https://www.apartments.com/austin-tx/2-bedrooms/",
              "https://www.apartments.com/austin-tx/min-1-bedrooms-under-2000/",
              "https://www.apartments.com/austin-tx/1-bedrooms-under-1500/",
              "https://www.apartments.com/houses/austin-tx/",
              "https://www.apartments.com/condos/austin-tx/",
              "https://www.apartments.com/townhomes/austin-tx/",
              "https://www.apartments.com/austin-tx/pet-friendly-dog/",
              "https://www.apartments.com/austin-tx-78701/",
              "https://www.apartments.com/the-grove-houston-tx/9cwjc35/",
              "https://www.apartments.com/apartments/austin-tx/"
            ],
            "items": {
              "type": "string"
            }
          },
          "fetchDetails": {
            "title": "Fetch full property details",
            "type": "boolean",
            "description": "When on, each property is enriched with its detail page: floorplan units, full amenities, pet & parking policy, fees, schools, transit, walk score, office hours, ratings, reviews, and description. When off, only the fast result-card fields are returned (name, address, rent range, beds, phone, rating, photo).",
            "default": true
          },
          "includeVirtualTours": {
            "title": "Include virtual tour links",
            "type": "boolean",
            "description": "When on (and Fetch full property details is on), each property also lists its virtual tour, 3D tour and video tour links in virtualTours. Off by default. Only some properties publish a tour (for example a Matterport 3D tour); the list is empty for the rest. No extra requests are made: the links come from the same detail page.",
            "default": false
          },
          "sortBy": {
            "title": "Sort results by",
            "enum": [
              "default",
              "rent_asc",
              "rent_desc",
              "recently_updated"
            ],
            "type": "string",
            "description": "Order of the search results (Apartments.com's own sort, live-checked: it also holds on later result pages). 'Default' keeps the site's best-match order. Applies to search pages and pasted search links. A pasted link's own query string (for example ?so= or ?bb=) is removed with a warning, so this setting always decides the order. With a Max properties cap the sort decides which properties are kept.",
            "default": "default"
          },
          "maxPages": {
            "title": "Max result pages per location/URL",
            "minimum": 0,
            "type": "integer",
            "description": "Safety bound on how many result pages to walk per location or start URL (about 40 properties per page). 0 (default) means unlimited — the walk stops naturally once a page comes back empty or repeats listings already collected, or sooner once Max properties is reached. Set a number only for an explicit page cap below that natural stop.",
            "default": 0
          },
          "maxListings": {
            "title": "Max properties (default 20, 0 = unlimited)",
            "minimum": 0,
            "maximum": 1000000,
            "type": "integer",
            "description": "The sole soft cap on the run, applied across all locations/URLs. Defaults to 20 so a run stays small unless you raise it. 0 means unlimited (bounded only by the natural stop on maxPages).",
            "default": 20
          },
          "maxReviews": {
            "title": "Max reviews per property",
            "minimum": 0,
            "maximum": 1000,
            "type": "integer",
            "description": "How many reviews to keep on each property row. The default (1000, the maximum) keeps every review the property page shows; lower it to keep fewer, 0 skips reviews. Every full or partial block of 10 reviews delivered adds one detail-enrichment unit to that property's detail charge. Applies when the property detail page is fetched.",
            "default": 1000
          },
          "proxy": {
            "title": "Proxy",
            "type": "object",
            "description": "Residential (the default) is the most reliable: Apartments.com is served from United States and Canada residential connections, and the actor retries on a fresh connection when one is refused. Residential needs a paid Apify plan; on the free plan the actor continues on a backup connection and some pages may be unavailable. Residential is recommended; datacenter connections are often refused, so they are less reliable. Apartments.com shows the same United States listings regardless of the connecting region.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ]
            }
          },
          "resumeFromRunId": {
            "title": "Resume from a prior run",
            "type": "string",
            "description": "Optional. Paste a previous run ID or dataset ID to continue a large walk-all pull: properties already saved by that run are loaded before scraping starts and skipped, so this run only appends new properties. For recurring daily monitoring of the same search, use Incremental mode below instead. Leave empty for a normal fresh run."
          },
          "incrementalMode": {
            "title": "Incremental changes for scheduled runs",
            "type": "boolean",
            "description": "Turn this on for daily or recurring monitoring. The first run returns all matching properties as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED properties. A property is UPDATED when any extracted field changes (rent, availability, floorplans, units, fees, amenities, photos, reviews, ratings and so on); scrapedAt, rawJsonLd, breadcrumbs, neighborhoodDescription, virtualTours and managementLogo are never compared (nor are the derived copy fields propertyName, location, coordinates, isVerified, rent, beds, baths, sqft, transitAndPOI, scores, models and contact), and you can exclude more with Ignore fields when detecting changes below. Turn on \"Emit unchanged\" or \"Emit expired\" only when you also want those properties returned (and billed). State is kept separately for each location/URL, property type, bedroom, rent range, and lifestyle/detail-mode setup; use State key when you want to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a prior run above.",
            "default": false
          },
          "stateKey": {
            "title": "State key (optional, incremental mode only)",
            "type": "string",
            "description": "Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the location/URL and filter settings — different searches then never mix state with each other."
          },
          "emitUnchanged": {
            "title": "Emit unchanged properties (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to also return properties that have not changed since the last run, marked UNCHANGED. This returns — and bills — extra rows you already have, so leave it off unless you specifically want the full snapshot every run.",
            "default": false
          },
          "emitExpired": {
            "title": "Emit expired properties (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to also return properties that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search — not when Max properties capped it or when Resume was used. This returns — and bills — extra synthetic rows, so leave it off unless you need expiry tracking.",
            "default": false
          },
          "ignoreFieldsForChanges": {
            "title": "Ignore fields when detecting changes (incremental mode only)",
            "type": "array",
            "description": "Optional. Extra fields that must NOT make a property count as UPDATED, e.g. photos, availability or reviews. A plain name matches that field anywhere, including inside floorplans and units; a dotted path such as units.availability matches only that one. The fields stay in the output, they are just not compared. scrapedAt, rawJsonLd, breadcrumbs, neighborhoodDescription, virtualTours and managementLogo are always ignored (so are the derived copy fields propertyName, location, coordinates, isVerified, rent, beds, baths, sqft, transitAndPOI, scores, models and contact).",
            "items": {
              "type": "string"
            }
          },
          "mcpConnectors": {
            "title": "Pipe results into your apps (optional)",
            "type": "array",
            "description": "Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON — the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com)."
          },
          "notionParentPageUrl": {
            "title": "Notion parent page (Notion connector only)",
            "type": "string",
            "description": "URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors."
          },
          "maxNotifyListings": {
            "title": "Max items to export per connector",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Cap on items written to each connector per run. Does not affect the dataset.",
            "default": 50
          }
        }
      },
      "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}