# Student.com Housing Scraper (`muhammadafzal/student-com-housing-scraper`) Actor

Extract Student.com housing prices, addresses, coordinates, amenities, images, ratings, floorplans, and reviews near universities.

- **URL**: https://apify.com/muhammadafzal/student-com-housing-scraper.md
- **Developed by:** [Muhammad Afzal](https://apify.com/muhammadafzal) (community)
- **Categories:** Real estate, Travel
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 housing results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## Student.com Housing Scraper

Extract public Student.com housing listings near a university or matching a property name. Each dataset item contains normalized prices, property type, distance, coordinates, address, rating, contact details, images, floorplans, amenities, neighbourhood tags, and optional public reviews.

The Actor reads Student.com's public page-backing Discovery endpoint—the same direct-source data used by its current US housing search interface. It does not require a Student.com login or a third-party data provider.

### What it extracts

| Field group | Included data |
|---|---|
| Identity | Property ID, name, slug, Student.com URL |
| Location | Address, city, state, country, latitude, longitude, Google Maps URL |
| University | University name, university slug, distance in miles |
| Pricing | Minimum and maximum monthly price, formatted price range, USD currency |
| Housing | Property type, amenities, vibes, neighbourhood tags, floorplans |
| Media and reputation | Image URLs and captions, aggregate rating, public reviews |
| Contact | Public property contact email when Student.com supplies one |

Nullable fields remain explicit `null` when Student.com does not provide them. Diagnostics are written to the `OUTPUT` key-value-store record rather than mixed into the housing dataset.

### Good uses

- Compare student housing around a university.
- Build accommodation research datasets or monitoring workflows.
- Filter housing by monthly price and property category.
- Export map coordinates, images, amenities, and public ratings for analysis.
- Feed structured housing records into an AI agent or spreadsheet.

This Actor is not a booking bot, lead-submission tool, general rental crawler, or source of private account data. Availability and prices can change; verify critical details on the linked property page.

### Input

| Field | Type | Default | Purpose |
|---|---|---:|---|
| `startUrls` | URL array | UT Austin university page | A Student.com university or property URL |
| `universitySlug` | string | — | Search housing near one Student.com university slug |
| `propertyName` | string | — | Search by a housing property name when no university is set |
| `maxResults` | integer | `5` | Requested result count (1–1000); free-plan runs are hard-limited to 5 |
| `minPrice`, `maxPrice` | number | — | Monthly USD price bounds |
| `propertyTypes` | string array | all | Apartment, PBSA, Dorm, House, or Shared Room |
| `sortBy` | enum | `none` | Student.com order, price, or rating |
| `sortOrder` | enum | `asc` | Ascending or descending |
| `includeImages` | boolean | `true` | Include image objects |
| `includeReviews` | boolean | `true` | Include public review objects |

`universitySlug` overrides `startUrls`. `propertyName` is used only when a university slug is absent. If all three search inputs are omitted, the Actor uses the working UT Austin example so the default run produces real data.

#### Example input

```json
{
  "startUrls": [
    { "url": "https://www.student.com/us/tx/austin/u/the-university-of-texas-at-austin" }
  ],
  "maxResults": 5,
  "minPrice": 500,
  "maxPrice": 2000,
  "propertyTypes": ["Apartment", "PBSA"],
  "sortBy": "price",
  "sortOrder": "asc",
  "includeImages": true,
  "includeReviews": false
}
```

### Output

Results are written to the default dataset. A compact item looks like this:

```json
{
  "id": "96adf334-5a03-48f0-8d7e-e1d6a960abee",
  "name": "Moore-Hill Hall Dormitory (MHD)",
  "slug": "moore-hill-hall-dormitory-mhd-qwmhau",
  "url": "https://www.student.com/us/tx/austin/p/moore-hill-hall-dormitory-mhd-qwmhau",
  "city": "Austin",
  "state": "TX",
  "country": "USA",
  "university": "Austin Community College",
  "universitySlug": "the-university-of-texas-at-austin",
  "address": "204 E 21st St, Austin, TX 78705, USA",
  "propertyType": "Dorm",
  "minPrice": 1560,
  "maxPrice": null,
  "currency": "USD",
  "billingPeriod": "month",
  "rating": 4.4,
  "distanceMiles": 0.1148,
  "latitude": 30.2834436,
  "longitude": -97.7355032,
  "amenities": [],
  "vibes": ["coffee-food", "artsy-cultural", "parks-greenery"],
  "neighbourhoodTags": ["quiet", "urban", "great-shopping-essentials"],
  "images": [],
  "floorplans": [],
  "reviews": [],
  "sourceUrl": "https://www.student.com/us/tx/austin/u/the-university-of-texas-at-austin",
  "scrapedAt": "2026-08-28T00:00:00.000Z"
}
```

The `OUTPUT` record classifies the run as `DATA`, `EMPTY`, `BLOCKED`, `REJECTED`, or `FAILED` and reports delivered records, available matches, pages, filters, and warnings. Valid no-match searches produce an empty dataset without fabricated fallback rows.

### Pricing and free-plan limit

This Actor uses Apify Pay per event (PPE) pricing for paid-plan runs:

| Event | Price | Charged when |
|---|---:|---|
| Actor start | `$0.00005` | A run starts |
| Housing result | `$0.002` | One schema-valid record is written to the default dataset |

Free-plan users can receive at most 5 housing records per run. A request above 5 is capped before the next source page is fetched, and the terminal status says that an upgrade is required for a higher per-run limit. Paid-plan runs can request up to 1,000 records, subject to the configured PPE total-charge limit. The `OUTPUT` summary reports `billingPlan`, `pricingModel`, `recordLimit`, and delivered `resultEvents`.

### Reliability and limits

The Actor sends browser-consistent headers to Student.com's public Discovery endpoint, paginates in batches of 20, deduplicates on stable property ID, validates every normalized record before writing, and retries HTTP 429 or transient server errors with bounded exponential backoff. A source access rejection is reported as `BLOCKED`; an unexpected response or runtime defect is reported as `FAILED`. Valid partial records are retained.

The current direct source primarily covers Student.com's US search experience. A university page can return hundreds of records; free-plan runs return the first 5 matching records, while paid-plan runs honor the requested limit up to 1,000. Use price/type filters and the PPE total-charge limit for bounded research. The Actor does not bypass login, CAPTCHAs, paywalls, or other access controls.

### Responsible use

Scrape only public data and comply with Student.com's terms, robots policies, applicable law, and privacy obligations. Contact emails and review author names may be personal data; collect, store, and use them only with a lawful purpose. Do not use this Actor for spam, discrimination, automated booking, or decisions that materially affect people without appropriate review.

### Support

For reproducible issues, include the run ID, redacted input, expected outcome, and the relevant `OUTPUT` warning. Do not include tokens, cookies, or personal booking information.

# Actor input Schema

## `startUrls` (type: `array`):

Use this for Student.com university or property pages, for example https://www.student.com/us/tx/austin/u/the-university-of-texas-at-austin. The first supported URL is used; non-Student.com and generic pages are ignored.

## `universitySlug` (type: `string`):

Use this to search housing near one university without a URL, for example the-university-of-texas-at-austin. It overrides startUrls and is not a university name.

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

Use this to search Student.com by a housing property name when no university slug is supplied, for example Villas on Rio. It is not a city-wide keyword search.

## `maxResults` (type: `integer`):

Use this to request a result count. Free-plan runs are hard-limited to 5 records and finish with an upgrade message; paid-plan PPE runs can request up to 1000. Default 5; accepted range 1–1000.

## `minPrice` (type: `number`):

Use this to keep listings at or above a USD monthly price, for example 500. Omit for no lower bound; it cannot exceed maximum price.

## `maxPrice` (type: `number`):

Use this to keep listings at or below a USD monthly price, for example 2000. Omit for no upper bound; it cannot be below minimum price.

## `propertyTypes` (type: `array`):

Use this to limit results to Student.com's current housing categories. Leave empty for every type; values are exact category labels.

## `sortBy` (type: `string`):

Use this to request Student.com's default ordering or sort by monthly price or rating. Default preserves Student.com's ranking.

## `sortOrder` (type: `string`):

Use this with price or rating sorting. Ascending is the default; choose descending for highest values first.

## `includeImages` (type: `boolean`):

Use this to include public image URLs and captions in every housing record. Enabled by default; disable it for smaller results.

## `includeReviews` (type: `boolean`):

Use this to include public review ratings, text, authors, networks, and dates. Enabled by default; disable it for smaller results.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.student.com/us/tx/austin/u/the-university-of-texas-at-austin"
    }
  ],
  "maxResults": 5,
  "propertyTypes": [],
  "sortBy": "none",
  "sortOrder": "asc",
  "includeImages": true,
  "includeReviews": true
}
```

# Actor output Schema

## `results` (type: `string`):

Student.com housing records in the default dataset.

## `summary` (type: `string`):

Outcome classification, counts, query, filters, and warnings.

# 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 = {
    "startUrls": [
        {
            "url": "https://www.student.com/us/tx/austin/u/the-university-of-texas-at-austin"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("muhammadafzal/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 = { "startUrls": [{ "url": "https://www.student.com/us/tx/austin/u/the-university-of-texas-at-austin" }] }

# Run the Actor and wait for it to finish
run = client.actor("muhammadafzal/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 '{
  "startUrls": [
    {
      "url": "https://www.student.com/us/tx/austin/u/the-university-of-texas-at-austin"
    }
  ]
}' |
apify call muhammadafzal/student-com-housing-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,muhammadafzal/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/ou6D8cPX2bEcF6fmA/builds/3GwndLQDW6bqaBfGg/openapi.json
