# Sykes Cottages Scraper (`mrdoe/sykes-cottages-scraper`) Actor

Scrape UK self-catering holiday cottage listings from Sykes Cottages - price, sleeps, bedrooms, pets, location and photos.

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

## Pricing

from $1.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?

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

![Sykes Cottages Scraper hero](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/sykes-cottages-scraper--hero.png)

### What does Sykes Cottages Scraper do?

Sykes Cottages Scraper collects UK self-catering holiday cottage listings from Sykes Holiday Cottages and returns them as clean, structured data. Open a location or theme page on the Sykes website (for example "Lake District cottages" or "cottages with hot tubs"), paste the URL, press **Start**, and download a dataset with the cottage name, region and locality, map coordinates, guest capacity, bedrooms and bathrooms, bed configuration, pet policy, Sykes rating, weekly price from, check-in and check-out times, amenities, full description, and photos. Use it for holiday-let market analysis, competitor and pricing research, availability tracking, and building cottage comparison tools.

### Why use Sykes Cottages Scraper?

- **Whole regions in one run** – point it at a county or national-park landing page and it walks the results pages for you.
- **Detailed per-cottage data** – 20+ fields combining the results card with everything on the cottage page.
- **Location and mapping ready** – region, locality, postcode area, latitude, and longitude for every cottage.
- **Sleeping details** – guest capacity, bedroom and bathroom counts, and the bed configuration (bed types and quantities).
- **Clean, normalised output** – numbers as numbers, `null` for missing values, deduplicated by cottage.
- **Automation ready** – schedule runs and connect results to Google Sheets, Make, Zapier, or your own API.

### What makes this different?

Most holiday-cottage data floating around is scraped from rendered page text and misses the structured detail. This Actor reads the cottage's own published property model, so guest capacity, bathroom count, bed-by-bed sleeping arrangements, check-in/out times, and coordinates come through consistently. It drives a real browser through a UK residential proxy, so listing pages load exactly as they do for a visitor and region searches paginate to full depth.

### What data can you extract?

![Sykes Cottages Scraper dataset output](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/sykes-cottages-scraper--output.png)

![Sykes Cottages Scraper data fields](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/sykes-cottages-scraper--fields.png)

| Field                          | Description                                                                            |
| ------------------------------ | -------------------------------------------------------------------------------------- |
| `url`                          | Cottage page URL                                                                       |
| `id`                           | Sykes property ID                                                                      |
| `name`                         | Cottage name                                                                           |
| `propertyType`                 | Sykes property classification, when published                                          |
| `region`                       | Region or area, e.g. "Cornwall", "Cumbria & The Lake District"                         |
| `locality`                     | Town, village, or nearest settlement                                                   |
| `postcodeArea`                 | Outward postcode, e.g. "CA20" (from the results card)                                  |
| `latitude` / `longitude`       | Map coordinates                                                                        |
| `sleeps`                       | Maximum number of guests                                                               |
| `bedrooms` / `bathrooms`       | Room counts                                                                            |
| `rooms`                        | Total number of rooms, when published                                                  |
| `beds`                         | Bed configuration: list of `{ count, type }`, e.g. King Size Bed × 1                   |
| `petsAllowed`                  | Whether pets are accepted                                                              |
| `sykesRating`                  | Sykes rating, 1–5 (from the results card)                                              |
| `weeklyPriceFrom`              | Indicative "from" price for a 7-night stay (from the results card)                     |
| `priceCurrency`                | Currency code, `GBP`                                                                   |
| `checkinTime` / `checkoutTime` | Arrival and departure times                                                            |
| `amenities`                    | List of amenities, e.g. `wifi`, `fireplace`, `hotTub`, `parkingType: Off Road Parking` |
| `description`                  | Full cottage description                                                               |
| `images`                       | Photo URLs                                                                             |
| `scrapedAt`                    | ISO timestamp of collection                                                            |

`weeklyPriceFrom`, `sykesRating`, and `postcodeArea` come from the results card, so they are present when a cottage is reached through a location or theme page and `null` when a single cottage URL is scraped directly. Coordinates, bathrooms, bed configuration, check-in/out times, the full amenity list, and the full description need **Open each cottage page for full details** switched on.

### How to use Sykes Cottages Scraper

![How Sykes Cottages Scraper works](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/sykes-cottages-scraper--how-it-works.png)

1. Open the Actor.
2. On [sykescottages.co.uk](https://www.sykescottages.co.uk), open a location page (for example "Lake District cottages") or a theme page (for example "cottages with hot tubs"). Copy the URL from your browser.
3. Paste it into **Start URLs**. Add more URLs to combine several areas or themes.
4. Set **Max cottages per start URL** and choose whether to open each cottage page.
5. Press **Start**.
6. Download the dataset as JSON, CSV, Excel, or XML, or use the API.

### Input Parameters

| Parameter            | Type    | Required | Default                | Description                                                                                       |
| -------------------- | ------- | -------- | ---------------------- | ------------------------------------------------------------------------------------------------- |
| `startUrls`          | Array   | Yes      | Lake District cottages | Sykes location or theme landing pages, or individual cottage page URLs.                           |
| `maxItems`           | Integer | No       | 20                     | Maximum cottages to collect per start URL. Ignored for single cottage URLs (always one row each). |
| `scrapeDetails`      | Boolean | No       | `true`                 | Open each cottage page for coordinates, bathrooms, bed configuration, amenities, and description. |
| `useCache`           | Boolean | No       | `false`                | Reuse cottage details collected in an earlier run to speed up recurring runs.                     |
| `proxyConfiguration` | Object  | No       | UK residential proxy   | Proxy settings. Sykes blocks datacenter traffic, so a UK residential proxy is used by default.    |

### Output Data

Each dataset item is one holiday cottage. Example (trimmed):

```json
{
    "url": "https://www.sykescottages.co.uk/cottage/Lake-District-Cumbria-The-Lake-District-Nether-Wasdale/Stable-End-Cottage-931410.html",
    "id": "931410",
    "name": "Stable End Cottage",
    "propertyType": "HolidayVillageRental",
    "region": "Cumbria & The Lake District",
    "locality": "Nether Wasdale near Gosforth",
    "postcodeArea": "CA20",
    "latitude": 54.425629,
    "longitude": -3.32707,
    "sleeps": 6,
    "bedrooms": 3,
    "bathrooms": 2,
    "rooms": 8,
    "petsAllowed": false,
    "sykesRating": 4,
    "weeklyPriceFrom": 515,
    "priceCurrency": "GBP",
    "checkinTime": "17:30",
    "checkoutTime": "10:00",
    "amenities": ["fireplace", "patio", "wifi", "heating", "parkingType: Off Road Parking", "internetType: WiFi"],
    "beds": [
        { "count": 1, "type": "4' Double Bed" },
        { "count": 1, "type": "King Size Bed" },
        { "count": 2, "type": "Single Bed" }
    ],
    "description": "A charming, semi-detached cottage next to the owner's Grade II listed farm in the village of Nether Wasdale in the Lake District National Park...",
    "images": [
        "https://images-cdn.sykesassets.co.uk/images/property_images/750x562/931410/sc_1609942914_931410_40.jpeg"
    ],
    "scrapedAt": "2026-09-01T08:51:51.568Z"
}
```

### Usage Examples

**All cottages in a national park**

- Start URL: a Sykes "Lake District cottages" (or other region) landing page
- `maxItems`: 500, `scrapeDetails`: true

**Quick price and rating snapshot**

- Start URL: a county landing page
- `maxItems`: 200, `scrapeDetails`: false

**Refresh a shortlist**

- Start URLs: several `https://www.sykescottages.co.uk/cottage/.../<name>-<id>.html` URLs
- `scrapeDetails`: true

### Tips for Best Results

- Use the narrowest landing page that covers what you need – a county or town page is faster and cheaper than a whole-country page.
- Add several start URLs to cover multiple regions or themes in one run; `maxItems` applies to each separately.
- Keep the default UK residential proxy on – Sykes blocks datacenter IPs.
- For monitoring, schedule the Actor and enable **Use cache**.

### Known Limitations

- A UK residential proxy is required in practice; datacenter IPs are challenged by the site.
- `weeklyPriceFrom` is the indicative "from" price shown on the results card for a standard 7-night stay, not a live quote for specific dates. It is `null` when a cottage is scraped from a direct URL.
- `sykesRating` and `postcodeArea` are read from the results card and are `null` for direct cottage URLs.
- Sykes paginates location results to a limited depth. Split large areas into smaller regions or use theme pages for fuller coverage.
- Bed configuration reflects what Sykes publishes and may not list every individual bed.
- Live nightly availability calendars are not collected.

### Integrations

Connect results to Google Sheets, Make, Zapier, Slack, or your own systems via the Apify API and webhooks. Schedule runs to keep a dataset current.

### Export Formats

JSON, CSV, Excel, and XML from the Dataset tab or the Apify API.

### Frequently Asked Questions

**How many cottages can I get per run?**
Up to `maxItems` per start URL, within Sykes's own pagination depth. Use multiple start URLs for wider coverage.

**Can I scrape a themed collection like "cottages with hot tubs"?**
Yes. Any Sykes location or theme landing page works, as do individual cottage URLs.

**How are duplicates handled?**
Cottages are deduplicated by Sykes property ID within a run.

**Why are some fields `null`?**
Either the field is not published for that cottage, or it is a results-card-only field (`weeklyPriceFrom`, `sykesRating`, `postcodeArea`) and the cottage was scraped from a direct URL.

**Do I need a proxy?**
Yes, in practice. Sykes challenges datacenter traffic, so the Actor defaults to a UK residential proxy.

**Can I schedule it?**
Yes, with Apify Schedules. Combine with **Use cache** to refresh only what changed.

**How fresh is the data?**
Every run loads live pages from Sykes at run time, unless a cottage is served from your cache.

### Support

Found a problem or need an extra field? Open an issue on the Actor's **Issues** tab in the Apify Console.

### Legal / Responsible Use

You are responsible for how you use this Actor and the data it collects, including compliance with Sykes Holiday Cottages' Terms of Use and applicable laws. Collect only what you need and respect the website's terms. If you collect any personal data you are responsible for complying with applicable data-protection law (for example the UK GDPR).

### Preview

![Sykes Cottages Scraper input options](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/sykes-cottages-scraper--input.png)

# Actor input Schema

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

One or more Sykes Holiday Cottages pages to scrape. On sykescottages.co.uk, open a location or theme page (for example https://www.sykescottages.co.uk/lake-district-cottages.html or https://www.sykescottages.co.uk/cottages-with-hot-tubs.html) and paste its URL here. Individual cottage page URLs such as https://www.sykescottages.co.uk/cottage/Cornwall-Lelant/The-Old-Barn-1205742.html also work.

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

Maximum number of cottages to collect for each start URL. Keep this low for quick test runs and raise it for full exports. Ignored for individual cottage URLs, which always return one row each.

## `scrapeDetails` (type: `boolean`):

When on, the Actor opens every cottage page to collect the coordinates, bathrooms, bed configuration, check-in/out times, full amenity list, and the full description. Turn it off for a faster run using only the data on the results page (name, location, guests, bedrooms, pet policy, Sykes rating, weekly price from, photos).

## `useCache` (type: `boolean`):

Reuse details collected for a cottage in an earlier run to speed up recurring runs. Disabled by default so every run returns fresh data.

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

Proxy settings. Sykes Holiday Cottages blocks datacenter traffic, so a UK residential proxy is used by default and strongly recommended.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.sykescottages.co.uk/lake-district-cottages.html"
    }
  ],
  "maxItems": 20,
  "scrapeDetails": true,
  "useCache": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "GB"
  }
}
```

# Actor output Schema

## `listings` (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.sykescottages.co.uk/lake-district-cottages.html"
        }
    ],
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "GB"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("mrdoe/sykes-cottages-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.sykescottages.co.uk/lake-district-cottages.html" }],
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "GB",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("mrdoe/sykes-cottages-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.sykescottages.co.uk/lake-district-cottages.html"
    }
  ],
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "GB"
  }
}' |
apify call mrdoe/sykes-cottages-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,mrdoe/sykes-cottages-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/QpIu1CZPlMQ6iWqnF/builds/7DWuHIEg5CmcNlAS0/openapi.json
