# Student Com Housing Scraper (`normdata/student-com-housing-scraper`) Actor

Get every Student.com housing listing: price, floorplans, room types, real reviews, contact email and phone, office hours, and distance to university. Filter by state, city, university, price and rating, or look up a property by URL. No API key.

- **URL**: https://apify.com/normdata/student-com-housing-scraper.md
- **Developed by:** [Norm Data](https://apify.com/normdata) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $9.50 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

![Norm Data](https://i.ibb.co/rGbhM5Y8/Chat-GPT-Image-Sep-8-2026-02-20-50-PM.png)

## Student.com Housing Scraper

Get every US student housing listing on **Student.com** with no API key and no login: about 6,000
properties with price, floorplans, room options, amenities, real reviews, contact email and phone,
office hours, and distance to the nearest university. Filter into a list, or look up a specific
property by URL.

Here is one real row:

```json
{
  "id": "0941b78d-8d34-4558-8a6b-7571bfba89e8",
  "name": "The Element Studios",
  "property_type": "Apartment",
  "address": "2526 Durwood St, Austin, TX 78704, USA",
  "city": "Austin",
  "state": "TX",
  "country": "US",
  "latitude": 30.2389969,
  "longitude": -97.7595712,
  "university": "St. Edward's University",
  "min_price": 900,
  "price_currency": "USD",
  "rating": 3.5,
  "review_count": 20,
  "wheelchair_accessible": false,
  "phone_number": "(512) 745-2001",
  "contact_email": "sbush@smmtx.com",
  "website": "http://www.elementstudiosaustin.com/",
  "amenities": ["Rooftop Terrace", "Communal Laundry", "Swimming Pool", "Pet Friendly"],
  "vibes": ["coffee-food", "parks-greenery"],
  "reviews": [
    { "rating": 5, "content": "Great location and staff.", "author_name": "A Resident", "source": "Google" }
  ],
  "listing_url": "https://www.student.com/us/tx/austin/p/the-element-studios-8fkayq",
  "scraped_at": "2026-09-11T22:00:00.000Z"
}
```

### What it does

Reads Student.com's own property index directly instead of paginating its search UI, then reads
each property's page for its full detail, and normalizes every listing into a flat row.

- **Search** filters the property index into a list: by state, city, property name, property
  type, university, price range, rating, review count, wheelchair accessibility, or whether a
  contact email or phone number is on file.
- **Look up** resolves exact Student.com property URLs, one row per URL. A URL that doesn't
  resolve comes back as an `error` row.

Missing source values are returned as `null`, never invented.

### Why this scraper

- **Real reviews, not just a star rating.** Actual review text, reviewer name, date and source
  for every property, not a summary number.
- **Direct contact email and phone, when Student.com has one.** Filter to only properties with a
  contact email for outreach, not every listing regardless of whether it's reachable.
- **Floorplan-level and room-level pricing.** `floorplans` (bedrooms, bathrooms, price and square
  footage per plan) and `room_options` (ensuite/kitchen/bathroom setup per room type), not just
  one price for the whole property.
- **Office hours, decoded.** Whether a property's office is open right now and its full weekly
  schedule, not a raw encoded string.
- **Vibes and neighbourhood tags.** Qualitative descriptors (quiet, urban, coffee-food, parks and
  greenery) alongside the hard numbers.
- **Complete in one pass.** Reads Student.com's own property index, not a paginated search UI, so
  a full run doesn't depend on "Load More" behavior holding up.
- **No API key, no login, no browser.** Reads only what Student.com publishes.

### How it compares

Checked directly against both other Student.com scrapers on Apify (their own declared output
fields, not a guess):

| Capability | This actor | parseforge/student-scraper | delectable\_incubator (low-cost) |
|---|:--:|:--:|:--:|
| Price, address, coordinates | yes | yes | yes |
| **Review rating and count** | **yes** | **no** | **no** |
| **Real review text and reviewer name** | **yes** | **no** | **no** |
| **Direct contact email** | **yes** | **no** | **no** |
| **Phone number** | **yes** | **no** | **no** |
| **Office hours (decoded)** | **yes** | **no** | **no** |
| Room types / floorplan pricing | yes | some (room types only) | no |
| Amenities, vibes, neighbourhood tags | yes | amenities only | no |
| Property type filter | yes | no | no |
| University filter | yes | no | no |
| Wheelchair-accessible filter | yes | no | no |
| Declared dataset schema | yes | yes | no |

### Use cases

- **Housing market research.** Track pricing, amenities, and rating distribution by city or
  university.
- **Lead generation for student housing vendors.** A filtered list of properties with a contact
  email, by state, city, or price range.
- **University housing offices.** Compile off-campus options near a specific university, filtered
  by rating, wheelchair accessibility, or price.
- **Relocation and study-abroad services.** Build a shortlist of verified accommodation options
  for a specific city.
- **Sentiment analysis.** Real review text per property, not just an aggregate score.
- **Competitive monitoring.** Track a property manager's portfolio, pricing, and rating over time.

### Quickstart

Search: properties in Austin, TX with a contact email and a rating of at least 4.

```json
{ "mode": "search", "state": ["TX"], "city": "austin", "hasContactEmail": true, "minRating": 4, "maxItems": 100 }
```

Properties near a specific university, under a price cap:

```json
{ "mode": "search", "university": "University of Texas", "priceMax": 1200, "maxItems": 200 }
```

Look up specific properties:

```json
{ "mode": "lookup", "urls": ["https://www.student.com/us/tx/austin/p/aria-grand-knpomm"] }
```

### Input reference

| Field | Applies to | Description |
|---|---|---|
| `maxItems` | all | Ceiling on rows written. |
| `mode` | all | `search` or `lookup`. |
| `state` | search | Two-letter US state code(s), e.g. TX, FL. |
| `city` | search | City contains this text. |
| `propertyName` | search | Property name contains this text. |
| `propertyType` | search | Exact match against Student.com's own property type label(s), e.g. Apartment, PBSA. |
| `university` | search | Nearest university name or slug contains this text. |
| `priceMin` / `priceMax` | search | Monthly price range, USD. |
| `minRating` | search | Minimum average review rating (0-5). |
| `minReviewCount` | search | Minimum number of reviews on file. |
| `wheelchairAccessibleOnly` | search | Only properties flagged wheelchair accessible. |
| `hasContactEmail` | search | Only properties with a direct contact email on file. |
| `hasPhone` | search | Only properties with a phone number on file. |
| `urls` | lookup | Full Student.com property URLs. |

### Output reference (selected)

| Field | Description |
|---|---|
| `id` / `slug` / `name` / `property_type` | Identity. |
| `address` / `city` / `state` / `country` / `zip_code` / `latitude` / `longitude` | Location. |
| `university` / `university_slug` / `distance_to_university` | Nearest university. |
| `min_price` / `max_price` / `price_range` / `price_currency` | Pricing. |
| `rating` / `review_count` / `reviews` / `reviews_summary` | Reviews. |
| `wheelchair_accessible` / `accessibility` | Accessibility. |
| `pet_policy` / `parking_info` | Policies, when Student.com has them on file. |
| `office_hours` | `{ is_open_now, weekday_descriptions, next_close_time }`, decoded. |
| `phone_number` / `contact_email` / `website` / `google_maps_url` | Contact. |
| `room_types` / `room_options` / `floorplans` | Room and pricing detail. |
| `amenities` / `vibes` / `neighbourhood_tags` | Descriptive tags. |
| `images` | `{ url, image_type, caption }[]`. |
| `property_summary` | Curated description text, when Student.com has one. |
| `is_published` | Whether Student.com currently lists this property as published. |
| `listing_url` | The property's own page. |
| `query` / `error` | Set on an unresolved look-up row. |
| `scraped_at` | ISO 8601 collection timestamp. |

### Run via API and CLI

```bash
curl -X POST "https://api.apify.com/v2/acts/USERNAME~student-com-housing-scraper/run-sync-get-dataset-items?token=<TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"mode":"lookup","urls":["https://www.student.com/us/tx/austin/p/aria-grand-knpomm"]}'
```

```bash
apify call USERNAME/student-com-housing-scraper --input '{"mode":"search","state":["TX"],"hasContactEmail":true,"maxItems":500}'
```

### Fetch results

```bash
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=json"
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=csv"
```

### Billing and limits

- **Pay per result.** Billed per property row written.
- **No charge on failure.** A run that produces zero rows fails with a message and is not
  billed.
- An unresolved look-up URL still writes one `error: "not found"` row and is billed as a base
  row.
- **Free Apify plans** run the built-in 10-row sample only.
- A very selective filter combination (e.g. a high minimum rating together with a contact-email
  requirement) may take longer to find enough matches, since it has to check more property pages
  before it collects the requested number.

### FAQ and troubleshooting

**Do I need an API key?** No. Student.com's own property pages are public, with no key and no
login.

**Why did my run return zero rows?** No property matched the filters. Loosen them, or check that
the state/city spelling matches how Student.com lists it.

**Why is `contact_email`, `pet_policy`, or `parking_info` null for some properties?** Student.com
itself doesn't have that field on file for every listing. This Actor reports `null` rather than
guessing.

**Are the reviews the property's complete review history?** No. Student.com's own property page
renders a fixed sample (5 reviews at the time of writing), not the full history. `review_count`
is the total; `reviews` is that sample.

**Why doesn't `city` always match the city in `address`?** Student.com's own `city` field is what
groups properties into its own market pages, and can occasionally differ from the city named in
the street address (verified: about 1 in 4 properties in a sample pull) - this Actor reports
Student.com's own `city` value as-is, so filtering by `city` stays consistent with what
searching that same city on student.com itself returns.

**How current is the data?** Read live from Student.com's own pages on every run. It is not
cached.

**Is this an official Student.com tool?** No. Independent, not affiliated with Student.com. It
reads only data Student.com publishes.

### Local development

```bash
bun install
bun test                       # offline: extraction, normalisation, input logic (real fixtures)
bun run src/main.ts            # reads storage/key_value_stores/default/INPUT.json
```

# Actor input Schema

## `maxItems` (type: `integer`):

Caps how many properties this run writes. Starts at 10 for a quick sample; raise it for a full run.

## `mode` (type: `string`):

Search filters the full property index. Look up resolves exact Student.com property URLs.

## `state` (type: `array`):

Two-letter US state code(s), e.g. TX, FL, CA. Leave empty for all states.

## `city` (type: `string`):

Match properties whose city contains this text, e.g. austin.

## `propertyName` (type: `string`):

Match properties whose name contains this text.

## `propertyType` (type: `array`):

Match one or more property types exactly as Student.com labels them, e.g. Apartment, House, PBSA. Leave empty for all types.

## `university` (type: `string`):

Match properties whose nearest university name or slug contains this text, e.g. "University of Texas".

## `priceMin` (type: `integer`):

Only properties whose lowest listed monthly price is at least this.

## `priceMax` (type: `integer`):

Only properties whose lowest listed monthly price is at most this.

## `minRating` (type: `number`):

Only properties with an average rating at or above this (0-5).

## `minReviewCount` (type: `integer`):

Only properties with at least this many reviews on file.

## `wheelchairAccessibleOnly` (type: `boolean`):

Only properties flagged wheelchair accessible.

## `hasContactEmail` (type: `boolean`):

Only properties with a direct contact email on file, useful for outreach lists.

## `hasPhone` (type: `boolean`):

Only properties with a phone number on file.

## `urls` (type: `array`):

Full Student.com property URLs, e.g. https://www.student.com/us/tx/austin/p/aria-grand-knpomm. An unresolved URL comes back as an error row.

## Actor input object example

```json
{
  "maxItems": 10,
  "mode": "search",
  "state": [
    "TX"
  ],
  "wheelchairAccessibleOnly": false,
  "hasContactEmail": false,
  "hasPhone": false
}
```

# Actor output Schema

## `listings` (type: `string`):

Complete dataset with all scraped Student.com property listings.

## `overview` (type: `string`):

Overview view of listings with key fields displayed in a table.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "maxItems": 10,
    "mode": "search",
    "state": [
        "TX"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("normdata/student-com-housing-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "maxItems": 10,
    "mode": "search",
    "state": ["TX"],
}

# Run the Actor and wait for it to finish
run = client.actor("normdata/student-com-housing-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "maxItems": 10,
  "mode": "search",
  "state": [
    "TX"
  ]
}' |
apify call normdata/student-com-housing-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,normdata/student-com-housing-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/IEqqAWxL0vdekU7qE/builds/GdPyxmK5NftCjr0bZ/openapi.json
