{
  "openapi": "3.0.1",
  "info": {
    "title": "RentCafe Rental Listings Scraper (USA)",
    "description": "Scrapes US rental listings from RentCafe — apartments, houses, townhomes and condos. Returns name, full address, GPS coordinates, photos, rent range, resident rating, up to 10 reviews, leasing phone and office hours for any US city.",
    "version": "0.1",
    "x-build-id": "kgpX5eqmcytdb8upZ"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapyx~rentcafe-rentals-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapyx-rentcafe-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/scrapyx~rentcafe-rentals-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapyx-rentcafe-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/scrapyx~rentcafe-rentals-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapyx-rentcafe-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": {
          "locations": {
            "title": "Cities",
            "type": "array",
            "description": "US cities to crawl, as 'city-state' slugs or plain 'City, ST' text — 'austin-tx', 'Chicago, IL', 'seattle wa' all work. One crawl per entry, each with its own SEARCH_SUMMARY row. A slug RentCafe does not recognise returns a clean HTTP 404 (verified — it never silently falls back to statewide or nationwide listings), so a wrong guess costs you one honest ERROR row, never wrong data. Watch out for New York: its slug is 'new-york-city-ny', not 'new-york-ny'.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "propertyType": {
            "title": "Property type",
            "enum": [
              "apartments",
              "houses",
              "townhomes",
              "condos"
            ],
            "type": "string",
            "description": "Which of RentCafe's four rental inventories to crawl. These are genuinely separate listing sets, not one list re-sliced — Austin apartments and Austin houses share zero property ids. Applies to every entry in 'Cities'.",
            "default": "apartments"
          },
          "filters": {
            "title": "Filter (choose at most one)",
            "type": "array",
            "description": "An optional refinement applied to every city. RentCafe accepts only ONE filter per search — asking for two (e.g. 1-bedroom AND pet-friendly) produces a URL it answers with a 404, so this actor refuses the combination up front instead of silently dropping one. Every value here was verified to genuinely move the result count. Note 'pet-friendly' barely narrows most markets (14,105 of 14,299 in Austin) because most US stock allows pets.",
            "items": {
              "type": "string",
              "enum": [
                "studio",
                "1-bedroom",
                "2-bedroom",
                "3-bedroom",
                "4-bedroom",
                "cheap",
                "luxury",
                "pet-friendly",
                "furnished",
                "short-term",
                "utilities-included",
                "under-500",
                "under-600",
                "under-700",
                "under-800",
                "under-900",
                "under-1000",
                "under-1100",
                "under-1200",
                "under-1300",
                "under-1400",
                "under-1500",
                "under-2000"
              ],
              "enumTitles": [
                "Studio",
                "1 bedroom",
                "2 bedrooms",
                "3 bedrooms",
                "4 bedrooms",
                "Cheap",
                "Luxury",
                "Pet friendly",
                "Furnished",
                "Short term",
                "Utilities included",
                "Under $500",
                "Under $600",
                "Under $700",
                "Under $800",
                "Under $900",
                "Under $1,000",
                "Under $1,100",
                "Under $1,200",
                "Under $1,300",
                "Under $1,400",
                "Under $1,500",
                "Under $2,000"
              ]
            },
            "default": []
          },
          "searchUrls": {
            "title": "Search URLs (optional)",
            "type": "array",
            "description": "Escape hatch: paste RentCafe search URLs copied from the site, e.g. https://www.rentcafe.com/apartments-for-rent/austin-tx/1-bedroom/. Each is parsed into the same city/type/filter triple as the fields above, so unverified filter segments are rejected rather than sent blind. RentCafe's own filter UI produces query-string URLs (?Bedroom=…&PriceMax=…) which its robots.txt disallows — those are refused; use the fields above instead.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "maxItems": {
            "title": "Max properties per city",
            "minimum": 0,
            "type": "integer",
            "description": "Stop after this many properties per city. Set to 0 for unlimited — the crawl then walks every page the site's own pagination offers (Austin apartments: 14 pages, 332 properties). Note RentCafe's headline count ('14,299 Rentals') counts individual rentable UNITS, not properties; one dataset row is one property, so expect far fewer rows than that number.",
            "default": 100
          },
          "includePropertyDetails": {
            "title": "Fetch full property details",
            "type": "boolean",
            "description": "Fetch each property's page via one extra request: the rent range (low/high), resident rating, up to 10 full resident reviews with text and dates, leasing phone number, office hours and the neighborhood breadcrumb. Worth keeping on — the search card carries NO structured price at all (rent appears only as free text). Turn it off for a fast address/geo-only crawl.",
            "default": true
          },
          "maxConcurrency": {
            "title": "Max concurrent requests",
            "minimum": 1,
            "maximum": 16,
            "type": "integer",
            "description": "How many requests may be in flight at once. This absorbs latency variance; it is NOT the throttle — the crawl rate is set by 'Minimum interval between requests' below.",
            "default": 5
          },
          "minRequestInterval": {
            "title": "Minimum interval between requests (seconds)",
            "minimum": 0.05,
            "maximum": 10,
            "type": "number",
            "description": "The actual speed control: the shortest gap between two requests to RentCafe, across all workers. RentCafe serves no bot challenge at all, which is worth preserving — an unthrottled crawl is how a WAF-free site stops being WAF-free. Values below 0.05s are clamped.",
            "default": 0.4
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "RentCafe runs no bot challenge at all (8/8 TLS profiles clean on search and detail), but Residential pinned to the US is the cloud default — container egress is a different posture than a home connection, and this is a US-only rental network.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}