{
  "openapi": "3.0.1",
  "info": {
    "title": "Real Estate Investment API - Airbnb ROI, Rents, Comps",
    "description": "Analyse any US rental property: Airbnb and long term rental income, occupancy, cap rate, cash on cash return and cash flow side by side, plus rental comps, rent estimates by bedroom count, property records, sale and tax history, market revenue statistics and short term rental regulations by city.",
    "version": "0.1",
    "x-build-id": "aaPNzZBwwEmIbn8a1"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/nabeelbaghoor~real-estate-investment-api/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-nabeelbaghoor-real-estate-investment-api",
        "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/nabeelbaghoor~real-estate-investment-api/runs": {
      "post": {
        "operationId": "runs-sync-nabeelbaghoor-real-estate-investment-api",
        "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/nabeelbaghoor~real-estate-investment-api/run-sync": {
      "post": {
        "operationId": "run-sync-nabeelbaghoor-real-estate-investment-api",
        "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": {
          "mode": {
            "title": "What to do",
            "enum": [
              "listingSearch",
              "property",
              "propertyTaxes",
              "propertyTransactions",
              "propertyEstimates",
              "nearbyProperties",
              "propertySchools",
              "investmentPerformance",
              "investmentBreakdown",
              "airbnbComps",
              "longTermComps",
              "marketComps",
              "rentEstimate",
              "marketLookup",
              "marketRevenueStats",
              "marketPropertyTypes",
              "marketHistory",
              "shortTermListing",
              "vrboListing",
              "listingHistory",
              "listingProjections",
              "activeListings",
              "marketSummary",
              "occupancyRates",
              "amenityPerformance",
              "shortTermRegulations",
              "topMarkets",
              "topAirbnbCities",
              "cityNeighborhoods",
              "topNeighborhoods",
              "neighborhoodOverview",
              "cityInvestment",
              "listingPrices",
              "heatmap",
              "validateCity"
            ],
            "type": "string",
            "description": "Listing search finds properties for sale in a market. The property modes read one property's record, taxes, sales history and valuations. Investment performance runs the deal on both strategies. The comps modes find what similar properties actually earn. Rent estimate prices an area by bedroom count. The market modes read revenue statistics, property mix and history. The short term modes read one listing or a whole market, and regulations reads whether letting is even permitted.",
            "default": "listingSearch"
          },
          "state": {
            "title": "State",
            "type": "string",
            "description": "Two letter state code, for example CA or TX. Every endpoint on this API requires it, and a request without one is rejected before the key is even checked."
          },
          "city": {
            "title": "City",
            "type": "string",
            "description": "City name, for example Austin. A trailing \"City\" or \"Town\" is dropped automatically, because the provider's own naming rules reject those suffixes and answer with an empty result rather than an error. Validate city mode checks a name before you spend anything on it."
          },
          "zipCode": {
            "title": "ZIP code",
            "type": "string",
            "description": "Five digit ZIP code, as an alternative to a city for most market modes."
          },
          "neighborhoodId": {
            "title": "Neighborhood ID",
            "type": "string",
            "description": "The provider's own neighborhood identifier, for a market read at neighborhood level. City neighborhoods mode lists them for a city."
          },
          "address": {
            "title": "Address",
            "type": "string",
            "description": "Street address for a property lookup or an address level market read. An address level market read also needs the latitude and longitude, and the provider quietly falls back to the city without them."
          },
          "latitude": {
            "title": "Latitude",
            "type": "string",
            "description": "Decimal latitude, required alongside an address for an address level market read."
          },
          "longitude": {
            "title": "Longitude",
            "type": "string",
            "description": "Decimal longitude, required alongside an address for an address level market read."
          },
          "propertyId": {
            "title": "Property ID",
            "type": "string",
            "description": "A single property identifier, for the property lookup, nearby properties and comps modes."
          },
          "parcelNumber": {
            "title": "Parcel number",
            "type": "string",
            "description": "Assessor parcel number, as another way to identify a property."
          },
          "mlsId": {
            "title": "MLS ID",
            "type": "string",
            "description": "MLS listing identifier. Note that MLS data shared through this API is limited to inactive listings, because of MLS redistribution rules."
          },
          "propertyIds": {
            "title": "Property IDs",
            "type": "array",
            "description": "One property ID per line for the taxes, transactions, estimates, schools and investment modes.",
            "items": {
              "type": "string"
            }
          },
          "neighborhoodIds": {
            "title": "Neighborhood IDs",
            "type": "array",
            "description": "One neighborhood ID per line for the comps and neighborhood overview modes.",
            "items": {
              "type": "string"
            }
          },
          "listingIds": {
            "title": "Short term listing IDs",
            "type": "array",
            "description": "One Airbnb or VRBO listing ID per line for the listing, history and projection modes. Active listings mode lists them for a market.",
            "items": {
              "type": "string"
            }
          },
          "strategy": {
            "title": "Rental strategy",
            "enum": [
              "airbnb",
              "traditional"
            ],
            "type": "string",
            "description": "Which letting strategy to read. Short term and long term are modelled separately throughout and are never blended into one figure, because an Airbnb cap rate and a long lease cap rate answer different questions.",
            "default": "airbnb"
          },
          "bedrooms": {
            "title": "Bedrooms",
            "minimum": 0,
            "maximum": 10,
            "type": "integer",
            "description": "Bedroom count. On listing search this is a minimum; on the comps and market modes it selects a bedroom tier."
          },
          "bathrooms": {
            "title": "Bathrooms",
            "minimum": 0,
            "maximum": 10,
            "type": "integer",
            "description": "Bathroom count. On listing search this is a minimum."
          },
          "homeType": {
            "title": "Home type",
            "enum": [
              "",
              "single family residential",
              "condo/coop",
              "townhouse",
              "multi family",
              "other"
            ],
            "type": "string",
            "description": "Property type for the market calculator modes.",
            "default": ""
          },
          "propertyType": {
            "title": "Property type",
            "type": "string",
            "description": "Property type for listing search and the listing price trend, for example Single Family Residential or Condo/Coop."
          },
          "minPrice": {
            "title": "Minimum price",
            "minimum": 0,
            "type": "integer",
            "description": "Lowest listing price to include. A range typed backwards is corrected rather than sent, because the provider answers it with an empty market rather than an error."
          },
          "maxPrice": {
            "title": "Maximum price",
            "minimum": 0,
            "type": "integer",
            "description": "Highest listing price to include."
          },
          "minSqft": {
            "title": "Minimum square footage",
            "minimum": 0,
            "type": "integer",
            "description": "Smallest floor area to include in a listing search."
          },
          "includeForeclosures": {
            "title": "Include foreclosures",
            "type": "boolean",
            "description": "Include foreclosed properties in a listing search. Off by default, as on the provider.",
            "default": false
          },
          "excludeRented": {
            "title": "Exclude already rented",
            "type": "boolean",
            "description": "Long term comps: leave out properties already marked rented, so the comp set reflects what is currently available.",
            "default": false
          },
          "occupancyUnit": {
            "title": "Occupancy unit",
            "enum": [
              "percent",
              "nights"
            ],
            "type": "string",
            "description": "Whether the occupancy figures you supply are a percentage or nights per year. This matters: the provider reads the same field both ways depending on a flag that defaults to percentage, so 65 meaning 65 percent sent as nights is a silent five-fold error in every return it produces. The unit is also written onto every investment row.",
            "default": "percent"
          },
          "airbnbOccupancy": {
            "title": "Short term occupancy",
            "minimum": 0,
            "maximum": 365,
            "type": "integer",
            "description": "Override the provider's short term occupancy assumption, expressed in the unit chosen above."
          },
          "traditionalOccupancy": {
            "title": "Long term occupancy",
            "minimum": 0,
            "maximum": 365,
            "type": "integer",
            "description": "Override the provider's long term occupancy assumption, expressed in the unit chosen above."
          },
          "airbnbMonthlyRent": {
            "title": "Short term monthly income",
            "minimum": 0,
            "type": "integer",
            "description": "Override the modelled monthly short term rental income, in dollars."
          },
          "traditionalMonthlyRent": {
            "title": "Long term monthly rent",
            "minimum": 0,
            "type": "integer",
            "description": "Override the modelled monthly long term rent, in dollars."
          },
          "purchasePrice": {
            "title": "Purchase price",
            "minimum": 0,
            "type": "integer",
            "description": "Price to run the deal at, instead of the listing price. This is the number to change when you are testing an offer."
          },
          "paymentType": {
            "title": "Payment type",
            "enum": [
              "",
              "loan",
              "cash"
            ],
            "type": "string",
            "description": "Whether the deal is financed or bought outright. A cash purchase makes cash on cash and cap rate converge.",
            "default": ""
          },
          "downPayment": {
            "title": "Down payment",
            "minimum": 0,
            "type": "integer",
            "description": "Down payment in dollars, for a financed deal."
          },
          "loanTermYears": {
            "title": "Loan term in years",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "Mortgage term, for example 30."
          },
          "interestRate": {
            "title": "Interest rate",
            "type": "string",
            "description": "Mortgage interest rate as a percentage, for example 6.5."
          },
          "startupCost": {
            "title": "Startup cost",
            "minimum": 0,
            "type": "integer",
            "description": "One-off setup cost in dollars. The provider assumes 8000 when this is blank, which is furnishing a short term rental."
          },
          "airbnbMaintenanceCost": {
            "title": "Short term maintenance cost",
            "minimum": 0,
            "type": "integer",
            "description": "Monthly maintenance cost for the short term strategy, in dollars."
          },
          "traditionalMaintenanceCost": {
            "title": "Long term maintenance cost",
            "minimum": 0,
            "type": "integer",
            "description": "Monthly maintenance cost for the long term strategy, in dollars."
          },
          "airbnbManagementCost": {
            "title": "Short term management cost",
            "minimum": 0,
            "type": "integer",
            "description": "Monthly management cost for the short term strategy, in dollars."
          },
          "traditionalManagementCost": {
            "title": "Long term management cost",
            "minimum": 0,
            "type": "integer",
            "description": "Monthly management cost for the long term strategy, in dollars."
          },
          "airbnbPropertyTax": {
            "title": "Short term property tax",
            "minimum": 0,
            "type": "integer",
            "description": "Annual property tax to assume for the short term strategy, in dollars."
          },
          "traditionalPropertyTax": {
            "title": "Long term property tax",
            "minimum": 0,
            "type": "integer",
            "description": "Annual property tax to assume for the long term strategy, in dollars."
          },
          "airbnbInsurance": {
            "title": "Short term insurance",
            "minimum": 0,
            "type": "integer",
            "description": "Monthly homeowner insurance for the short term strategy, in dollars."
          },
          "traditionalInsurance": {
            "title": "Long term insurance",
            "minimum": 0,
            "type": "integer",
            "description": "Monthly homeowner insurance for the long term strategy, in dollars."
          },
          "includeValuationScore": {
            "title": "Include valuation score",
            "type": "boolean",
            "description": "Ask the provider for its property valuation score alongside the investment figures.",
            "default": false
          },
          "compsSortBy": {
            "title": "Sort comps by",
            "enum": [
              "",
              "similarity",
              "distance",
              "occupancy",
              "night_price",
              "rental_income",
              "reviews_count",
              "price",
              "beds",
              "baths",
              "address"
            ],
            "type": "string",
            "description": "Which field to order a comp set by. The two comp endpoints accept different vocabularies, so a value the endpoint does not know is ignored rather than rejected.",
            "default": ""
          },
          "compsOrder": {
            "title": "Comp sort direction",
            "enum": [
              "",
              "desc",
              "asc"
            ],
            "type": "string",
            "description": "Ascending or descending. The provider defaults to descending.",
            "default": ""
          },
          "compsPerPage": {
            "title": "Comps to return",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "How many comparables to fetch. The provider's own default is three, which is too few to be a comp set, so this actor asks for twenty when you leave it blank."
          },
          "fullHistory": {
            "title": "Full market history",
            "type": "boolean",
            "description": "Market history mode: return more than the most recent twelve months.",
            "default": false
          },
          "regulationRating": {
            "title": "Regulation rating",
            "enum": [
              "",
              "Positive",
              "Neutral",
              "Negative",
              "Restricted"
            ],
            "type": "string",
            "description": "Short term regulations: only return cities whose rules carry this rating.",
            "default": ""
          },
          "countryCode": {
            "title": "Country code",
            "type": "string",
            "description": "Two letter country code for the short term rental modes. The provider defaults to US."
          },
          "heatmapMetric": {
            "title": "Heatmap metric",
            "enum": [
              "AirbnbCoc",
              "TraditionalCoc",
              "listingPrice",
              "OccupancyRate",
              "AirbnbRental",
              "TraditionalRental"
            ],
            "type": "string",
            "description": "Which measure to map across the box.",
            "default": "AirbnbCoc"
          },
          "southWestLatitude": {
            "title": "South west latitude",
            "type": "string",
            "description": "Heatmap: latitude of the box's south west corner. A box given corner-swapped is put back in order, because the provider answers an inverted box with an empty map rather than an error."
          },
          "southWestLongitude": {
            "title": "South west longitude",
            "type": "string",
            "description": "Heatmap: longitude of the box's south west corner."
          },
          "northEastLatitude": {
            "title": "North east latitude",
            "type": "string",
            "description": "Heatmap: latitude of the box's north east corner."
          },
          "northEastLongitude": {
            "title": "North east longitude",
            "type": "string",
            "description": "Heatmap: longitude of the box's north east corner."
          },
          "maxResults": {
            "title": "Maximum rows",
            "minimum": 1,
            "type": "integer",
            "description": "Stop after this many rows. Each row is one charged result, so this is the ceiling on what a run can cost.",
            "default": 100
          },
          "requestsPerMinute": {
            "title": "Requests per minute",
            "minimum": 1,
            "maximum": 600,
            "type": "integer",
            "description": "How fast to call the provider. Rate limits depend on your plan, and a rate limit response is honoured with the wait the provider publishes.",
            "default": 60
          },
          "baseUrl": {
            "title": "API base URL",
            "type": "string",
            "description": "Only set this if the provider has given you a different host. Leave blank for the standard one."
          },
          "apiKey": {
            "title": "API key",
            "type": "string",
            "description": "Your own real estate investment data API key, from your developer account. Leave blank to use the DATA_API_KEY environment secret instead."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}