# Zumper API

> Zumper returns rental listings and average rent data as a workflow and API.

Zumper searches rentals by required city or neighborhood, with optional rent, bedroom, pet, and property filters. Get average rents returns city median rents for studios through three-bedroom homes and monthly or yearly changes; it needs a city.

- Page: https://fous.com/workflows/zumper
- Handle: `@zumper`
- Category: [Real estate](https://fous.com/workflows/category/real-estate)
- Source website: https://zumper.com
- Last verified: Sep 29, 2026
- Fous is not affiliated with Zumper.

## Methods

### Get average rents

Operation `get_average_rents`, version 1. 1 credit per call.

Get current median monthly rents for studio through three-bedroom homes in a city, with monthly and yearly percentage changes. Figures are rolling 30-day city medians; national rank is included only when the same-month U.S. national report ranks the city by one-bedroom rent.

**Input**

| Field | Type | Required | Example | Description |
|---|---|---|---|---|
| `city` | string | yes | `"Toronto, ON"` | City with state or province, for example Austin, TX. |

**Input schema**

```json
{
  "type": "object",
  "required": [
    "city"
  ],
  "properties": {
    "city": {
      "type": "string",
      "description": "City with state or province, for example Austin, TX.",
      "examples": [
        "Toronto, ON",
        "Austin, TX"
      ]
    }
  },
  "additionalProperties": false,
  "examples": [
    {
      "city": "Toronto, ON"
    },
    {
      "city": "Austin, TX"
    }
  ]
}
```

**Output**

| Field | Type | Example | Description |
|---|---|---|---|
| `city` | string | `"Toronto, ON"` | City and state or province. |
| `month` | string | `"2026-09"` | Month the city figures cover, YYYY-MM. |
| `currency` | string | `"CAD"` | Currency code for the monthly rents. |
| `report_page_link` | string | `"https://www.zumper.com/rent-research/toronto-on"` | City rent research report page. |
| `national_rent_rank` | integer or null | `55` | One-bedroom rent rank in the same-month U.S. national report, when listed. |
| `studio_median_monthly_rent` | number or null | `1729` | Median monthly rent. |
| `one_bedroom_median_monthly_rent` | number or null | `2099` | Median monthly rent. |
| `two_bedroom_median_monthly_rent` | number or null | `2730.5` | Median monthly rent. |
| `three_bedroom_median_monthly_rent` | number or null | `3595` | Median monthly rent. |
| `studio_change_vs_last_year_percent` | number or null | `-3.94` | Median rent change from last year, percent. |
| `studio_change_vs_last_month_percent` | number or null | `0.2906976744186047` | Median rent change from last month, percent. |
| `one_bedroom_change_vs_last_year_percent` | number or null | `-3.05` | Median rent change from last year, percent. |
| `two_bedroom_change_vs_last_year_percent` | number or null | `-2.31` | Median rent change from last year, percent. |
| `one_bedroom_change_vs_last_month_percent` | number or null | `-0.6746987951807228` | Median rent change from last month, percent. |
| `two_bedroom_change_vs_last_month_percent` | number or null | `1.234567901234568` | Median rent change from last month, percent. |
| `three_bedroom_change_vs_last_year_percent` | number or null | `4.2` | Median rent change from last year, percent. |
| `three_bedroom_change_vs_last_month_percent` | number or null | `-0.7170435741864313` | Median rent change from last month, percent. |

**Example input**

```json
{
  "city": "Toronto, ON"
}
```

**Example output**

```json
{
  "city": "Toronto, ON",
  "month": "2026-09",
  "currency": "CAD",
  "report_page_link": "https://www.zumper.com/rent-research/toronto-on",
  "national_rent_rank": null,
  "studio_median_monthly_rent": 1729,
  "one_bedroom_median_monthly_rent": 2099,
  "two_bedroom_median_monthly_rent": 2730.5,
  "three_bedroom_median_monthly_rent": 3595,
  "studio_change_vs_last_year_percent": -3.94,
  "studio_change_vs_last_month_percent": 0.2906976744186047,
  "one_bedroom_change_vs_last_year_percent": -3.05,
  "two_bedroom_change_vs_last_year_percent": -2.31,
  "one_bedroom_change_vs_last_month_percent": -0.6746987951807228,
  "two_bedroom_change_vs_last_month_percent": 1.234567901234568,
  "three_bedroom_change_vs_last_year_percent": 4.2,
  "three_bedroom_change_vs_last_month_percent": -0.7170435741864313
}
```

### Search rentals

Operation `search_rentals`, version 1. 1 credit per call.

Search Zumper apartments and homes for rent by city or neighborhood, with price, bedroom, pet, and property filters. Rents and availability are those shown by Zumper; some listings omit these details.

**Input**

| Field | Type | Required | Example | Description |
|---|---|---|---|---|
| `pets` | string | no | `"dogs_allowed"` | Pet policy to include. Example: dogs_allowed. |
| `location` | string | yes | `"Toronto, ON"` | City and state or province, or a neighborhood and city. Example: Chicago, IL. |
| `max_rent` | number | no | `2500` | Highest monthly rent in USD, or CAD for a Canadian location. Example: 2500. |
| `min_beds` | integer | no | `1` | Minimum bedrooms; 0 includes studios. Example: 2. |
| `max_results` | integer | no | `5` | Most listings to return. Example: 20. |
| `property_type` | string | no | `"apartment"` | Kind of rental. Example: apartment. |

**Input schema**

```json
{
  "type": "object",
  "required": [
    "location"
  ],
  "properties": {
    "pets": {
      "enum": [
        "any",
        "dogs_allowed",
        "cats_allowed"
      ],
      "type": "string",
      "default": "any",
      "description": "Pet policy to include. Example: dogs_allowed.",
      "examples": [
        "dogs_allowed"
      ]
    },
    "location": {
      "type": "string",
      "minLength": 2,
      "description": "City and state or province, or a neighborhood and city. Example: Chicago, IL.",
      "examples": [
        "Toronto, ON",
        "Chicago, IL",
        "River North, Chicago, IL"
      ]
    },
    "max_rent": {
      "type": "number",
      "minimum": 0,
      "description": "Highest monthly rent in USD, or CAD for a Canadian location. Example: 2500.",
      "examples": [
        2500,
        1
      ]
    },
    "min_beds": {
      "type": "integer",
      "default": 0,
      "minimum": 0,
      "description": "Minimum bedrooms; 0 includes studios. Example: 2.",
      "examples": [
        1,
        2
      ]
    },
    "max_results": {
      "type": "integer",
      "default": 20,
      "maximum": 50,
      "minimum": 1,
      "description": "Most listings to return. Example: 20.",
      "x-fous-developer": true,
      "examples": [
        5,
        10
      ]
    },
    "property_type": {
      "enum": [
        "any",
        "apartment",
        "house",
        "condo",
        "room"
      ],
      "type": "string",
      "default": "any",
      "description": "Kind of rental. Example: apartment.",
      "examples": [
        "apartment"
      ]
    }
  },
  "additionalProperties": false,
  "examples": [
    {
      "location": "Toronto, ON",
      "max_results": 5
    },
    {
      "pets": "dogs_allowed",
      "location": "Chicago, IL",
      "max_rent": 2500,
      "min_beds": 1,
      "max_results": 10,
      "property_type": "apartment"
    },
    {
      "location": "River North, Chicago, IL",
      "min_beds": 2,
      "max_results": 5
    }
  ]
}
```

**Output**

| Field | Type | Example | Description |
|---|---|---|---|
| `rentals` | array |  | Rentals in Zumper search order. |
| `rentals[].beds` | string or null | `"1–3"` | Bedrooms or range, including Studio |
| `rentals[].name` | string or null | `"The Diamond"` | Building or listing name |
| `rentals[].baths` | string or null | `"1–2"` | Bathrooms or range |
| `rentals[].address` | string or null | `"950 Lansdowne Ave, Toronto, ON M6H 0E6"` | Street address |
| `rentals[].currency` | string | `"CAD"` | Currency code (USD or CAD). |
| `rentals[].photo_link` | string or null | `"https://img.zumpercdn.com/882548237/1280x960"` | First listing photo |
| `rentals[].square_feet` | string or null | `"481–1,001"` | Square feet or range |
| `rentals[].listing_link` | string or null | `"https://www.zumper.com/apartment-buildings/p1624543/the-diamond-davenport-toronto-on"` | Zumper listing page |
| `rentals[].monthly_rent` | string or null | `"$2,124–$3,809"` | Monthly rent or range as listed |
| `rentals[].pets_allowed` | string or null | `"Cats and dogs allowed"` | Pet policy where stated |
| `rentals[].available_date` | string or null |  | Available date (YYYY-MM-DD or Available now) |
| `rentals[].zumper_listing_id` | string or null | `"60865974"` | Zumper listing ID |
| `rentals[].lowest_monthly_rent` | number or null | `2124` | Lowest listed monthly rent |

**Example input**

```json
{
  "location": "Toronto, ON",
  "max_results": 5
}
```

**Example output**

```json
{
  "rentals": [
    {
      "beds": "1–3",
      "name": "The Diamond",
      "baths": "1–2",
      "address": "950 Lansdowne Ave, Toronto, ON M6H 0E6",
      "currency": "CAD",
      "photo_link": "https://img.zumpercdn.com/882548237/1280x960",
      "square_feet": "481–1,001",
      "listing_link": "https://www.zumper.com/apartment-buildings/p1624543/the-diamond-davenport-toronto-on",
      "monthly_rent": "$2,124–$3,809",
      "pets_allowed": "Cats and dogs allowed",
      "available_date": null,
      "zumper_listing_id": "60865974",
      "lowest_monthly_rent": 2124
    },
    {
      "beds": "Studio–2",
      "name": "Mirvish Village",
      "baths": "1–2",
      "address": "748 Bathurst St, Toronto, ON M5S 2R6",
      "currency": "CAD",
      "photo_link": "https://img.zumpercdn.com/917895854/1280x960",
      "square_feet": "376–1,005",
      "listing_link": "https://www.zumper.com/apartment-buildings/p1113084/mirvish-village-south-annex-toronto-on",
      "monthly_rent": "$2,030–$4,285",
      "pets_allowed": "Cats and dogs allowed",
      "available_date": null,
      "zumper_listing_id": "65223969",
      "lowest_monthly_rent": 2030
    },
    {
      "beds": "1–3",
      "name": "Bela Square",
      "baths": "1–3",
      "address": "100 Eastdale Ave, Toronto, ON M4C 0B6",
      "currency": "CAD",
      "photo_link": "https://img.zumpercdn.com/922924167/1280x960",
      "square_feet": "463–1,293",
      "listing_link": "https://www.zumper.com/apartment-buildings/p1258466/bela-square-crescent-town-toronto-on",
      "monthly_rent": "$2,025–$4,050",
      "pets_allowed": "Cats and dogs allowed",
      "available_date": null,
      "zumper_listing_id": "57956212",
      "lowest_monthly_rent": 2025
    }
  ]
}
```

## Quick start

Call the API with a Fous API key (`FOUS_API_KEY`). To create one, turn on Developer mode in Fous Studio, then open Keys & connections → API keys (https://app.fous.com/keys).

```bash
# First set your key: export FOUS_API_KEY='YOUR_FOUS_API_KEY'
: "${FOUS_API_KEY:?Set FOUS_API_KEY before running this example}"

curl 'https://api.fous.com/v1/query' \
  --fail-with-body --silent --show-error --max-time 120 \
  -H "Authorization: Bearer $FOUS_API_KEY" \
  -H 'Content-Type: application/json' \
  --data-raw '{
  "api": "@zumper",
  "visibility": "public",
  "operation": "get_average_rents",
  "version": 1,
  "input": {
    "city": "Toronto, ON"
  },
  "response": {
    "format": "json"
  }
}'
```

```python
# Save as fous.py and run with python3 fous.py. No packages needed.
# First set your key: export FOUS_API_KEY='YOUR_FOUS_API_KEY'
import json
import os
import urllib.error
import urllib.request

api_key = os.environ.get("FOUS_API_KEY")
if not api_key:
    raise RuntimeError("Set FOUS_API_KEY before running this example")

body = json.loads("{\n  \"api\": \"@zumper\",\n  \"visibility\": \"public\",\n  \"operation\": \"get_average_rents\",\n  \"version\": 1,\n  \"input\": {\n    \"city\": \"Toronto, ON\"\n  },\n  \"response\": {\n    \"format\": \"json\"\n  }\n}")
request = urllib.request.Request(
    "https://api.fous.com/v1/query",
    data=json.dumps(body).encode("utf-8"),
    headers={
        "Authorization": f"Bearer {api_key}",
        "Content-Type": "application/json",
    },
    method="POST",
)
try:
    with urllib.request.urlopen(request, timeout=120) as response:
        result = json.load(response)
except urllib.error.HTTPError as error:
    raise RuntimeError(f"HTTP {error.code}: {error.read().decode('utf-8', errors='replace')}") from error
if result.get("success") is False:
    raise RuntimeError(result.get("error", {}).get("message", "Request failed"))
print(json.dumps(result["data"]["output"], indent=2))
```

```typescript
// Save as fous.mts and run with npx tsx fous.mts.
// First set your key: export FOUS_API_KEY='YOUR_FOUS_API_KEY'
const apiKey = process.env.FOUS_API_KEY;
if (!apiKey) throw new Error("Set FOUS_API_KEY before running this example");

const response = await fetch("https://api.fous.com/v1/query", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${apiKey}`,
    "Content-Type": "application/json",
  },
  signal: AbortSignal.timeout(120_000),
  body: JSON.stringify({
  "api": "@zumper",
  "visibility": "public",
  "operation": "get_average_rents",
  "version": 1,
  "input": {
    "city": "Toronto, ON"
  },
  "response": {
    "format": "json"
  }
}),
});
type ApiResult = { success: boolean; data?: { output: unknown }; error?: { message: string } };
const result: ApiResult = await response.json();
if (!response.ok || result.success === false) {
  throw new Error(result.error?.message ?? `HTTP ${response.status}`);
}
if (!result.data) throw new Error("Missing API response data");
console.log(result.data.output);
```

Or describe the data in plain language: send `{"api":"@zumper","prompt":"Describe the data you need, with every detail"}` to the same URL. Fous fills in the input, runs the method that fits and returns only the fields you asked for; `data.route.calls[].request` is the exact call it made. Routing is free; the run costs the same.

## Use cases

- Compare rental prices across neighborhoods.
- Find listings that fit a monthly rent budget.
- Filter rentals by bedrooms, pets, or property type.
- Track city median rents over time.
- Review median rents by home size.

## FAQ

### Is Fous affiliated with Zumper?

No. Fous is not affiliated with Zumper. This workflow reads the public zumper.com website and returns its data.

### How much does it cost?

Each run costs 1 credit. With pay-as-you-go, a credit costs 1¢; monthly plans cost less per credit.

### Do I need a Zumper account?

No. You only need a Fous account.

### How current is the data?

Fous gets the data from zumper.com when you run it; repeating the same request within a day may return the saved result. Fous checks this workflow automatically; it last passed a check on Sep 29, 2026.

### What rentals are available in a city or neighborhood?

Search rentals returns Zumper listings for a required location, with optional price, bedroom, pet, and property filters.

### What is the median rent in a city?

Get average rents returns median monthly rents for studios through three-bedroom homes for a specified city.

### How have city rents changed month over month or year over year?

Get average rents returns monthly and yearly percentage changes for city median rents by home size.

## Related

- [Zillow API](https://fous.com/workflows/zillow.md): Zillow provides homes for sale, rental listings, home details, estimates, and housing market figures; rental details, history, schools, estimates, and market figures may be missing or reflect different reporting dates.
- [Apartments.com API](https://fous.com/workflows/apartments-com.md): Apartments.com returns U.S. apartments and homes matching location and optional filters, plus community details; rent and availability may be missing or change.
- [Zoopla API](https://fous.com/workflows/zoopla.md): UK homes for sale and to rent.
- [HUD API](https://fous.com/workflows/hud.md): Official HUD housing research and Fair Market Rent data.
- [Homes.com API](https://fous.com/workflows/homes-com.md): Search homes for sale in the United States.
- [Realtor.com API](https://fous.com/workflows/realtor-com.md): Realtor.com returns home listings for sale, rent, or recently sold, property details and estimates, and local agent profiles; some fields or sold prices may be missing.
- [ZipRecruiter API](https://fous.com/workflows/ziprecruiter.md): ZipRecruiter returns up to 100 public job listings per search and U.S. job-title pay ranges and top-paying cities where public salary pages exist.
- [Redfin API](https://fous.com/workflows/redfin.md): Redfin provides publicly listed homes, details, estimates, and latest area market figures with up to 12 months of sale prices; some data may be unavailable.
- [All Real estate workflows](https://fous.com/workflows/category/real-estate)
