# Citylets Scotland Property Scraper (`vivid-softwares/citylets-scotland-property-scraper`) Actor

Scrape Citylets property listings across Scotland. Extract rents, addresses, descriptions, agent phone numbers, EPC data, images and rental statistics from searches or listing URLs.

- **URL**: https://apify.com/vivid-softwares/citylets-scotland-property-scraper.md
- **Developed by:** [VividSoftwares](https://apify.com/vivid-softwares) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

$12.00 / 1,000 property listings

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

Scrape Citylets rental property listings across Scotland from search pages or individual property URLs. The Actor follows Citylets pagination automatically and returns one clean dataset row per property.

Use it to collect rental listings in Edinburgh, Glasgow, Aberdeen, Dundee and other Scottish locations for property research, rental market analysis, lead generation, price monitoring, spreadsheets, databases and AI agents.

### What it extracts

- Listing ID and Citylets property URL
- Title, monthly rent and availability
- Full address, city and postcode
- Bedrooms, furnishing, deposit and property features
- Bathrooms and additional property features
- Full property description and listing summary
- Landlord registration number when published
- EPC rating and public EPC document URL
- Nearby schools and stations, area information and rental statistics
- Available or no-longer-available listing status
- Letting agent name, public phone number and address
- Property image URLs and photo count
- UTC scrape timestamp

Phone numbers are returned only when Citylets publishes them on the property page.

### Input

Enter the same search fields shown on Citylets. The Actor creates the search session and follows every results page automatically. Individual property URLs are optional.

```json
{
  "searchMode": "Residential",
  "location": "Edinburgh",
  "propertyType": "Flats",
  "minimumBedrooms": "1",
  "minimumRent": "800",
  "maximumRent": "1400",
  "startUrls": [],
  "maxItems": 100,
  "includeImages": true
}
```

`searchMode` supports Residential, Short Term, Mid Market, Students, Flatshare and Festival searches. The `location` dropdown contains the complete Citylets autocomplete list: 1,403 place names and 450 outward postcode prefixes. Property type, bedrooms and rent use the same choices as the live search form.

Citylets `results.aspx?page_number=...` links only contain a page number. Their filters are stored in a browser session, so pasted results links cannot be decoded. Use the structured search fields instead.

### Output

Each dataset item represents one Citylets rental listing.

```json
{
  "listing_id": "588976",
  "url": "https://www.citylets.co.uk/property-rent/leith-walk-leith-walk-eh6-588976/",
  "title": "1 bed flat - available now",
  "rent": "£825 pcm",
  "rent_pcm": 825,
  "availability": "available now",
  "address": "Leith Walk, Edinburgh, EH6",
  "bedrooms": 1,
  "deposit": "£825",
  "description": "Full public property description...",
  "landlord_registration": "1765717/230/21042",
  "agent_name": "Murray & Currie",
  "agent_phone": "0131 572 0163",
  "images": ["https://...jpg"],
  "detail_page_complete": true
}
```

Download results as JSON, CSV, Excel, XML or RSS, or access them through the Apify API.

### AI agents and MCP

AI agents can run this Actor through the Apify API or Apify MCP server:

`https://mcp.apify.com?tools=vivid-softwares/citylets-scotland-property-scraper`

Example prompts:

- Find 100 Citylets flats for rent in Edinburgh and return rent, bedrooms, postcode and agent phone number.
- Scrape this Citylets search URL, follow every result page and save the full property descriptions.
- Compare average advertised rents from Citylets listings in Glasgow and Aberdeen.

### Pricing

The Actor costs **$15 per 1,000 saved listings**. You pay only for dataset items produced.

### Responsible use

This Actor collects publicly available listing data. Respect Citylets terms, applicable law and personal data rules. It does not reveal private landlord contact details or submit enquiries.

# Actor input Schema

## `searchMode` (type: `string`):

Choose the Citylets search section.

## `location` (type: `string`):

Choose any place or outward postcode prefix supported by Citylets.

## `propertyType` (type: `string`):

Choose the same property type shown on Citylets.

## `minimumBedrooms` (type: `string`):

Minimum number of bedrooms.

## `minimumRent` (type: `string`):

Minimum advertised monthly rent using Citylets price choices.

## `maximumRent` (type: `string`):

Maximum advertised monthly rent using Citylets price choices.

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

Optional permanent Citylets property URLs. Temporary results.aspx URLs cannot be reused because their filters are stored in a browser session.

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

Maximum listings to save. Search pagination is followed automatically.

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

Collect full property image URLs from each listing page.

## Actor input object example

```json
{
  "searchMode": "Residential",
  "location": "Edinburgh",
  "propertyType": "Any",
  "minimumBedrooms": "-2",
  "minimumRent": "0",
  "maximumRent": "9999",
  "startUrls": [],
  "maxItems": 100,
  "includeImages": true
}
```

# Actor output Schema

## `dataset` (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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("vivid-softwares/citylets-scotland-property-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("vivid-softwares/citylets-scotland-property-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 '{}' |
apify call vivid-softwares/citylets-scotland-property-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,vivid-softwares/citylets-scotland-property-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/Suv5W9Gl1f1Kjmk1j/builds/6HvJZdsL2z4MdmQqV/openapi.json
