# University Living Housing Scraper \[💰$1/1000 results] (`confidential_gnat/universityliving-housing-scraper`) Actor

Scrapes public student-housing listings and property detail pages (address, prices, amenities, ratings, images) from universityliving.com, covering any searched city with an additional ability to be able to skip previously scraped property urls across multiple runs.

- **URL**: https://apify.com/confidential\_gnat/universityliving-housing-scraper.md
- **Developed by:** [ActorFlow](https://apify.com/confidential_gnat) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 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

## University Living housing scraper

Scrapes public student-housing listings and property detail pages (address, prices, amenities, ratings, images) from **universityliving.com**, covering any searched city. Results are returned as a structured JSON dataset and can be exported to CSV or Excel.

**Target website:** [universityliving.com](https://www.universityliving.com)

### ⚖️ Legality of this actor

This actor only collects data that is already publicly visible on universityliving.com — no login, paywall, or private content is accessed. Scraping publicly available data is generally considered legal (see *hiQ Labs v. LinkedIn* as precedent); the user remains responsible for complying with the target site's Terms of Service and applicable laws (e.g. GDPR/CCPA) where personal data is involved.

### 💡 Use Case

Landlords, housing agents, university accommodation departments, and market researchers who need an up-to-date, machine-readable view of the student-housing supply, prices, and ratings across University Living cities.

### 🏭 Industry

Real Estate, Proptech, Higher Education, Market Research

### 📤 Output

Structured JSON dataset (exportable to CSV/Excel) with one record per property, including property and room details (name, description, address, geo, telephone, prices, rating), a combined property + room image gallery, and a per-room breakdown.

### 🌐 Domain

Student accommodation / housing property data extraction (University Living).

### 🏷️ Label

`student-housing`, `property-scraper`, `rental-price-tracker`, `real-estate`, `university-living`

### ✨ Features

- **Property listing + detail extraction** — collects every property found for a searched city, plus full detail-page data
- **Full room + gallery data** — merges every room's detail (title, category, rates, bed/bathroom types) and all room images into a single gallery per property
- **Pagination support** — keeps fetching further results once the first page cannot fill the max-results budget
- **Proxy support** — runs through the Apify proxy (datacenter by default); the group and enabled state are user-configurable
- **Cross-run caching** — give a caching-dataset name so property URLs scraped in an earlier run are skipped (unique items only)

### 🔧 Input Configuration

| Field                | Type                 | Required | Default             | Description                                                                                        |
| -------------------- | -------------------- | -------- | ------------------- | -------------------------------------------------------------------------------------------------- |
| startUrls            | Array (request list) | ✅       | —                   | City/search pages and property detail pages on universityliving.com                                |
| maxResults           | Integer              | —        | 3                   | Maximum number of properties to scrape **per** start URL                                           |
| scrapeAllFromSitemap | Boolean              | —        | false               | When enabled, ignores `startUrls` and scrapes all properties                                       |
| caching              | String               | —        | —                   | Name of a dataset used to persist scraped property URLs so the same URLs are skipped on later runs |
| proxyConfiguration   | Object (proxy)       | —        | datacenter, enabled | Proxy rotation configuration; proxy groups are selectable                                          |

**Supported URL types:**

- City/search page, e.g. `https://www.universityliving.com/united-kingdom/city/nottingham`
- Property detail page, e.g. `https://www.universityliving.com/united-kingdom/nottingham/property/nottingham-square`

### 📦 Output

The dataset exposes a single view (Overview) that shows the core fields of the scraped properties in a compact table.

**Sample output:**

```json
{
    "url": "https://www.universityliving.com/united-kingdom/nottingham/property/talbot-street",
    "name": "Study Inn Talbot Street",
    "description": "Study Inn Talbot Street offers student accommodation in Nottingham.",
    "streetAddress": "Goldsmith Street, Nottingham",
    "locality": "Nottingham",
    "countryCode": "GB",
    "postalCode": "NG1",
    "latitude": 52.9549,
    "longitude": -1.1472,
    "priceCurrency": "GBP",
    "lowPrice": 160,
    "highPrice": 316,
    "lowestWeeklyPrice": 160,
    "featuredImage": "https://cdn.universityliving.com/cms/…/property.jpg",
    "imageCount": 34,
    "images": [
        "https://cdn.universityliving.com/cms/…/property.jpg",
        "https://cdn.universityliving.com/cms/…/room-1a.jpg",
        "https://cdn.universityliving.com/cms/…/room-1b.jpg"
    ],
    "rooms": [
        {
            "roomId": "315012",
            "title": "Gold Studio",
            "category": "Studio",
            "minRate": 209,
            "maxRate": 250,
            "area": "17-18",
            "areaUnit": "sqm",
            "bedType": "3/4th Bed",
            "bathroomType": "Private",
            "kitchenType": "Private",
            "images": [
                "https://cdn.universityliving.com/cms/…/room-1a.jpg",
                "https://cdn.universityliving.com/cms/…/room-1b.jpg"
            ],
            "rates": [
                { "tenancy": "51 weeks", "price": 209, "priceUnit": "£/week", "currency": "£", "total": "£10659" }
            ]
        }
    ]
}
```

### 💡 Uses of This Data

- **Supply & vacancy monitoring** — track how many student-accommodation properties a city lists over time.
- **Price benchmarking** — analyse weekly rent levels by city, room type, and provider.
- **Competitor / partner research** — compare an accommodation portfolio against the University Living catalogue.
- **International-arrival planning** — housing teams compile verified off-campus options for incoming students.
- **Lead enrichment** — housing marketers enrich CRM records with locations, prices, and images.

### 🚀 How to Use

1. [Sign up](https://apify.com/sign-up) for a free Apify account — includes **$5 monthly credit**.
2. Open the actor page and click **Try for free**.
3. Fill in the **Input** fields (at least one `startUrls` entry is required).
4. Click **Start** and wait for the run to complete.
5. Download results from the **Output** tab in JSON, CSV, or Excel format.

You can also run this actor via the [Apify API](https://docs.apify.com/api/v2) or integrate it directly into your workflows using [Zapier](https://zapier.com/apps/apify), [Make](https://www.make.com/), or [n8n](https://n8n.io/).

### 📝 Notes

- **Proxy recommended for large-scale scraping** — For high-volume runs or full-scrape mode, keep the Apify datacenter proxy enabled (or switch to residential) to avoid blocks.
- **Data consistency with proxies** — Because the actor outputs live, location-sensitive data (prices, availability, ratings), values can vary slightly by region and between runs depending on the viewing proxy IP.
- **API integration** — This actor can be called as an API from any automation platform (Zapier, Make, n8n, custom scripts).
- **Cross-run deduplication** — Set the caching-dataset input to scrape only properties not already collected in an earlier run.

### 💬 Support & Contact

If you encounter any issues or have questions, please [open an issue](https://apify.com/confidential_gnat/universityliving-housing-scraper/issues/open)

You can also find more of our actors on the [Actor Flow ](https://apify.com/confidential_gnat).

# Actor input Schema

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

List of University Living pages. Each entry may be either a search/city page (e.g. https://www.universityliving.com/united-kingdom/city/nottingham) or a property detail page (e.g. https://www.universityliving.com/united-kingdom/nottingham/property/nottingham-square).

## `caching` (type: `string`):

Optional. The name of a dataset used for caching scraped property URLs across multiple runs so they are not scraped again. When provided, the Actor only scrapes unique property URLs and skips the ones already present in the given dataset. Leave empty to disable caching and always scrape every URL.

## `scrapeAllFromSitemap` (type: `boolean`):

If enabled, the Actor ignores the startUrls and scrapes all property URLs listed in the sitemap https://www.universityliving.com/sitemap-property.xml

## `proxyConfiguration` (type: `object`):

Proxy servers used to rotate IP addresses and prevent blocking. Datacenter proxy is enabled by default.

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

Maximum number of properties to scrape per start URL.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.universityliving.com/united-kingdom/city/nottingham"
    }
  ],
  "caching": "august-monthly-run",
  "scrapeAllFromSitemap": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": []
  },
  "maxResults": 3
}
```

# Actor output Schema

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

No description

# 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.universityliving.com/united-kingdom/city/nottingham"
        }
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": []
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("confidential_gnat/universityliving-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.universityliving.com/united-kingdom/city/nottingham" }],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": [],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("confidential_gnat/universityliving-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.universityliving.com/united-kingdom/city/nottingham"
    }
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": []
  }
}' |
apify call confidential_gnat/universityliving-housing-scraper --silent --output-dataset

```

## MCP server setup

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