{
  "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": "tSTdxqQLoAmyN1fIQ"
  },
  "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": "Apify Proxy on the shared datacenter pool. This is the default because it is included in your plan at no extra cost and this target works through it. If you start seeing blocks, challenges or empty results, switch the group here to Residential -- it uses real consumer IPs and gets through more, but Apify bills residential traffic per gigabyte, so leave it off unless you need it.",
            "default": {
              "useApifyProxy": true
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}