# Skiresort.com Scraper: Ski Resort Directory & Comparison Data (`getascraper/skiresort-com-scraper`) Actor

Scrape Skiresort.com's ski resort directory: elevation, slope km, lift count, ski pass price, and rating for 530 US resorts plus Europe/worldwide. Filter by country, rating, elevation, slope, or lift count. Full-detail mode adds lift/ticket breakdowns and season date. $3.50/1,000 records.

- **URL**: https://apify.com/getascraper/skiresort-com-scraper.md
- **Developed by:** [GetAScraper](https://apify.com/getascraper) (community)
- **Categories:** Travel, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.63 / 1,000 resort records

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

## ⛷️ Skiresort.com Scraper: Resort Directory & Comparison Data

<table width="100%" style="width:100%;border-collapse:collapse">
<tr style="width:100%">
<td style="background:#0b3d5c;border-radius:10px;padding:28px;text-align:center" colspan="1">
<span style="color:#ffffff;font-size:22px;font-weight:700">Ski resort data, structured and ready</span><br/>
<span style="color:#cfe6f5;font-size:15px">Slopes, lifts, ratings, and prices for 530 US resorts plus global coverage, no manual lookups.</span>
</td>
</tr>
</table>

<table width="100%" style="width:100%;border-collapse:collapse;margin-top:16px">
<tr style="width:100%">
<td width="25%" style="background:#eaf4fb;border:1px solid #cfe0eb;border-radius:8px;padding:16px;text-align:center;vertical-align:top">
<strong style="color:#0b3d5c">🗺️ Full directory coverage</strong><br/>
<span style="color:#333">530 US resorts plus global listings including Europe, pulled straight from Skiresort.com.</span>
</td>
<td width="25%" style="background:#eaf4fb;border:1px solid #cfe0eb;border-radius:8px;padding:16px;text-align:center;vertical-align:top">
<strong style="color:#0b3d5c">⛷️ Slope & lift breakdown</strong><br/>
<span style="color:#333">Optional detail mode adds slope kilometres by difficulty and lift counts by type.</span>
</td>
<td width="25%" style="background:#eaf4fb;border:1px solid #cfe0eb;border-radius:8px;padding:16px;text-align:center;vertical-align:top">
<strong style="color:#0b3d5c">🎫 Real ski pass prices</strong><br/>
<span style="color:#333">Day-ticket prices for adults, youth, and children, pulled straight from each resort's page.</span>
</td>
<td width="25%" style="background:#eaf4fb;border:1px solid #cfe0eb;border-radius:8px;padding:16px;text-align:center;vertical-align:top">
<strong style="color:#0b3d5c">🧹 Clean, honest data</strong><br/>
<span style="color:#333">Only real fields get filled in. Nothing fake ever pads out your dataset.</span>
</td>
</tr>
</table>

### 🔍 What does Skiresort.com Scraper do?

**Skiresort.com Scraper reads the resort directory on [Skiresort.com](https://www.skiresort.com/)** and turns it into structured, downloadable data: resort name, region, rating, elevation, slope kilometres, lift count, and ski pass price for every resort in a country or region listing.

Point it at a country listing (the US directory alone covers 530 resorts) or a region like Europe, or paste specific resort URLs directly. Turn on full detail mode to also pull the slope breakdown by difficulty, lift counts by type, day-ticket prices for adults, youth, and children, the season start date, and the full resort description for each resort. Optional filters narrow the output to resorts matching a country, minimum rating, minimum elevation, minimum slope length, or minimum lift count, all checked before a resort counts against Max Resorts.

### 🤔 Why use Skiresort.com Scraper?

The only other Skiresort.com scraper on the Apify Store has seen almost no use. It already covers elevation, slope kilometres by difficulty, lift count, and price, so this Actor is not reinventing that part. Where this Actor adds real coverage: lift counts broken down by lift type, ski pass prices split by adult, youth, and child, the season start date, a dedicated direct-resort-URL mode for pulling specific named resorts without a full directory crawl, and built-in filters (country, rating, elevation, slope length, lift count) so you get only the resorts you actually want instead of filtering a full export yourself.

- **"I'm building a ski trip comparison page and need real slope and lift numbers for every resort, not just a name and photo."** Travel content writers and comparison-site builders pull structured resort data instead of copying it by hand.
- **"My research team tracks winter tourism trends across US resorts and needs elevation, slope, and pricing data in one table."** Market researchers and data teams build resort comparisons across an entire country or region in one run.
- **"I want a resort database to power search and filters in my trip-planning app, without hand-entering 500 resorts."** App and tool builders seed a resort database directly from the source instead of manual data entry.

### 🚀 How to use Skiresort.com Scraper

<table width="100%" style="width:100%;border-collapse:collapse;margin:12px 0">
<tr style="width:100%">
<td width="33%" style="background:#f4f9fc;border:1px solid #cfe0eb;border-radius:8px;padding:14px;text-align:center;vertical-align:top">
<strong style="color:#0b3d5c">1. Pick a directory or resort</strong><br/>
<span style="color:#333">Choose a country or region listing, or paste specific resort URLs.</span>
</td>
<td width="33%" style="background:#f4f9fc;border:1px solid #cfe0eb;border-radius:8px;padding:14px;text-align:center;vertical-align:top">
<strong style="color:#0b3d5c">2. Run the Actor</strong><br/>
<span style="color:#333">It reads Skiresort.com's own listing and detail pages directly.</span>
</td>
<td width="33%" style="background:#f4f9fc;border:1px solid #cfe0eb;border-radius:8px;padding:14px;text-align:center;vertical-align:top">
<strong style="color:#0b3d5c">3. Export your data</strong><br/>
<span style="color:#333">Download as JSON, CSV, or Excel, or connect it to your own pipeline.</span>
</td>
</tr>
</table>

1. Click **Try for free** and open the Input tab.
2. Add one or more **Listing URLs** (a country or region directory page), or paste specific **Direct Resort URLs** if you already know which resorts you want.
3. Set **Max Resorts** to how many resorts you want back in this run.
4. Turn on **Fetch Full Resort Detail Page** if you want the slope breakdown, lift types, ticket prices, season start date, and description too.
5. Optionally set **Country Filter**, **Minimum Rating**, **Minimum Top Elevation**, **Minimum Total Slope Length**, or **Minimum Lift Count** to narrow the output before it counts against Max Resorts.
6. Click **Start**. Results land in the Output tab as they're collected.

### 📥 Input

| Field | Type | Required | Description |
|---|---|---|---|
| `listingUrls` | array of URLs | No | Skiresort.com country or region directory pages to crawl. Pagination is followed automatically up to Max Resorts. |
| `resortUrls` | array of URLs | No | Specific Skiresort.com resort pages to scrape directly, without crawling a country listing first. |
| `countryFilter` | string | No | Only keep resorts whose parsed country matches this text (case-insensitive, partial match), e.g. "France". A resort with no parsed country is left out when this is set. |
| `minRating` | number | No | Only keep resorts with a Skiresort.com test rating of at least this many stars out of 5. |
| `minTopElevationM` | integer | No | Only keep resorts whose highest point reaches at least this many metres above sea level. |
| `minSlopeTotalKm` | number | No | Only keep resorts with at least this many kilometres of total marked slopes. |
| `minLiftCount` | integer | No | Only keep resorts with at least this many lifts in total. |
| `maxItems` | integer | No | Maximum number of resorts to return in total, across both the listing crawl and any direct resort URLs. |
| `fetchFullDetail` | boolean | No | When on, also opens each resort's detail page for the slope breakdown, lift types, ticket prices, season start date, and description. Off by default since it adds one extra request per resort. |
| `proxyConfiguration` | object | No | Proxy settings. Defaults to Apify's datacenter proxy, which this target does not need residential IPs to reach. |

All five filters check fields already present on the listing-page summary card, so they apply identically whether or not **Fetch Full Resort Detail Page** is on, and they never trigger an extra request. A resort missing the data a filter checks is left out when that filter is set, since it cannot be verified either way.

### 📤 Output

Each item in the dataset looks like this:

```json
{
  "resortId": "97",
  "name": "KitzSki – Kitzbühel/Kirchberg",
  "detailUrl": "https://www.skiresort.com/en/ski-resort/kitzski-kitzbuehel-kirchberg/",
  "continent": "Europe",
  "country": "Austria",
  "regionPath": ["Europe", "Austria", "Tyrol (Tirol)", "Tiroler Unterland", "Kitzbühel (District)", "Kitzbühel"],
  "ratingValue": 4.9,
  "ratingLabel": "Test result",
  "baseElevationM": 800,
  "topElevationM": 2000,
  "verticalDropM": 1200,
  "slopeTotalKm": 188,
  "slopeEasyKm": 102,
  "slopeIntermediateKm": 66,
  "slopeDifficultKm": 20,
  "liftCount": 58,
  "ticketPriceAdult": "€ 83,-",
  "ticketPriceYouth": "€ 62.50",
  "ticketPriceChild": "€ 41.50",
  "seasonStartDateRaw": "06.11.2026",
  "sourceUrl": "https://www.skiresort.com/en/ski-resort/kitzski-kitzbuehel-kirchberg/",
  "scrapedAt": "2026-09-29T12:00:00.000Z"
}
```

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

### 📊 Data table

| Field | Type | Description |
|---|---|---|
| `name` | string | Resort name. |
| `detailUrl` | string | Link to the resort's own page on Skiresort.com. |
| `continent` / `country` | string | Continent and country, taken from the resort's own region breadcrumb. |
| `regionPath` | array | Full region breadcrumb, from continent down to the most specific listed area. |
| `ratingValue` / `ratingLabel` | number / string | Skiresort.com's own test rating out of 5, and whether it's a full test result or a basic evaluation. |
| `baseElevationM` / `topElevationM` | number | Base and summit elevation in metres. |
| `verticalDropM` | number | Vertical drop in metres. *(full detail mode only)* |
| `slopeTotalKm` / `slopeEasyKm` / `slopeIntermediateKm` / `slopeDifficultKm` | number | Slope length in kilometres, total and by difficulty. |
| `slopeBreakdown` | object | Full slope breakdown including ski routes kilometres. *(full detail mode only)* |
| `liftCount` / `liftCountTotal` | number | Total number of lifts. |
| `liftsByType` | array | Lift counts broken down by type, e.g. gondola, chairlift, t-bar. *(full detail mode only)* |
| `extras` | array | Extra features shown on the listing card, e.g. "Cat-skiing". |
| `priceText` | string | Ski pass price as shown on the listing card. |
| `ticketPriceAdult` / `ticketPriceYouth` / `ticketPriceChild` | string | Day-ticket prices by age group, main season. *(full detail mode only)* |
| `seasonStartDateRaw` | string | Season start date exactly as shown on the page at scrape time. Not a live snow or lift-status feed, see the note below. |
| `description` | string | Resort description text. *(full detail mode only)* |
| `sourceUrl` / `scrapedAt` | string | The exact page scraped and when, so you can judge freshness for yourself. |

### 💰 Pricing

Skiresort.com Scraper uses Apify's pay-per-event pricing: $3.50 per 1,000 resort records returned. You only pay for the resorts actually returned, an empty run costs nothing, and there's no subscription to manage.

Free plan runs are limited to 25 resorts per run, 3 runs per day, and a short wait between runs. Upgrade to a paid Apify plan to remove these limits.

### ⭐ Enjoying Skiresort.com Scraper?

<table width="100%" style="display:table;width:100%;border-collapse:collapse">
<tr>
<td style="background:#eaf4fb;border:1px solid #cfe0eb;border-radius:8px;padding:16px;text-align:center">
<span style="color:#0b3d5c;font-size:15px">If this Actor saved you from copying resort data by hand, a quick rating helps other travel builders find it too. ⭐⭐⭐⭐⭐</span>
</td>
</tr>
</table>

### 🛠️ Tips or advanced options

- Leave **Fetch Full Resort Detail Page** off for a fast overview sweep across a whole country; turn it on only when you need the slope, lift-type, or pricing breakdown, since it adds one request per resort.
- Combine a **Listing URL** with a low **Max Resorts** for a quick preview before committing to a full country run.
- Use **Direct Resort URLs** when you already know which specific resorts you want, instead of crawling a whole directory to find them.
- Stack the **Resort & Search Filters** (country, rating, elevation, slope length, lift count) to narrow a broad directory like Europe down to exactly the resorts you care about, at no extra request cost either way.
- Season start date and any lift status reflect the page at the time it was scraped. Re-run this Actor closer to your travel dates for the freshest seasonal fields, and don't treat older runs as a live snow report.

### ❓ FAQ

**Does this need a Skiresort.com account or login?**
No. It reads Skiresort.com's own public directory and resort pages. No account, login, or API key needed.

**Is the season start date and lift status always current?**
No. These fields reflect whatever Skiresort.com's page showed at the moment of the scrape, which is why every item carries a `scrapedAt` timestamp. This Actor is a directory and comparison tool, not a live snow or safety feed.

**Why is full detail mode off by default?**
It visits each resort's own page for fields the listing page doesn't show, like lift types and ticket prices by age group. That's one extra request per resort, so it's an opt-in.

**Is this legal?**
This Actor reads publicly available directory and resort pages that require no login. It does not access any private, paywalled, or authenticated data. Always review the target site's terms before large-scale or commercial use, and reach out via the Issues tab with any questions.

### 🔗 Other actors

- [Choice Hotels Scraper: Room Rates, Reviews & Rate-Drop Alerts](https://apify.com/getascraper/choice-hotels-scraper) ↗ - tracks Choice Hotels room rates and reviews.
- [Ostrovok Hotels Scraper: Отели Островок](https://apify.com/getascraper/ostrovok-hotels-scraper) ↗ - pulls hotel listings and rates from Ostrovok.
- [PlugShare Scraper: EV Charging Station Data](https://apify.com/getascraper/plugshare-scraper) ↗ - extracts EV charging station locations and details.
- [AirDNA Scraper: STR Market Revenue, Occupancy, ADR & YoY Trends](https://apify.com/getascraper/airdna-market-data-scraper) ↗ - pulls short-term rental market data by location.
- [Award Flights Scraper: Miles, Seats & Taxes](https://apify.com/getascraper/award-flights-scraper) ↗ - tracks award flight availability and pricing.

# Changelog

This Actor's version history is a separate document: https://apify.com/getascraper/skiresort-com-scraper/changelog.md

# Actor input Schema

## `listingUrls` (type: `array`):

Skiresort.com country or region directory pages to crawl, such as the USA or Europe listing. The scraper follows the site's own pagination (/page/2/, /page/3/, ...) automatically until it reaches Max Resorts, so you do not need to add each page yourself.

## `resortUrls` (type: `array`):

Specific Skiresort.com resort pages to scrape directly, without crawling a country listing first, such as https://www.skiresort.com/en/ski-resort/kitzski-kitzbuehel-kirchberg/. Use this when you already know which resorts you want instead of paging through a directory.

## `countryFilter` (type: `string`):

Only keep resorts whose parsed country matches this text, such as France or Switzerland (case-insensitive, partial match). Handy when crawling a broad directory like Europe but you only want one country's resorts, without needing that country's own listing URL. A resort with no parsed country is left out when this is set, since it cannot be checked either way.

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

Only keep resorts with a Skiresort.com test rating of at least this many stars out of 5, for example 4 keeps only 4- and 5-star resorts.

## `minTopElevationM` (type: `integer`):

Only keep resorts whose highest point reaches at least this many meters above sea level. Useful for filtering out lower-elevation resorts that are more exposed to unreliable snow.

## `minSlopeTotalKm` (type: `number`):

Only keep resorts with at least this many kilometers of total marked slopes, the site's own combined total across all difficulty levels.

## `minLiftCount` (type: `integer`):

Only keep resorts with at least this many lifts in total, combining gondolas, chairlifts, t-bars, and every other lift type the resort has.

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

Maximum number of resorts to return in total, counting both the listing crawl and any Direct Resort URLs. Keep this low for a quick test run; raise it once you know the output looks right.

## `fetchFullDetail` (type: `boolean`):

When enabled, also opens each resort's own detail page to add the slope breakdown by difficulty (easy, intermediate, difficult, ski routes, with percent of total), lift counts by type (gondola, chairlift, t-bar, people mover, cat-skiing, etc), day-ticket ski pass prices for adults, youth, and children, the season start date, and the full resort description. When disabled, only the summary fields already shown on the listing page are returned (name, region, rating, elevation range, total and by-color slope km, lift count, and skipass price). The season start date and any lift/slope status reflect the page's content at scrape time, not a live feed, since these can go stale outside the winter season.

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

Skiresort.com is fully server-rendered and returns HTTP 200 under both a normal browser user agent and the Googlebot user agent, with no anti-bot challenge observed, so Apify's cheaper datacenter proxy group is used by default. Residential proxy is not required for this target.

## Actor input object example

```json
{
  "listingUrls": [
    {
      "url": "https://www.skiresort.com/en/ski-resorts/usa/"
    }
  ],
  "resortUrls": [],
  "maxItems": 20,
  "fetchFullDetail": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "listingUrls": [
        {
            "url": "https://www.skiresort.com/en/ski-resorts/usa/"
        }
    ],
    "resortUrls": [],
    "maxItems": 20,
    "fetchFullDetail": false,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("getascraper/skiresort-com-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 = {
    "listingUrls": [{ "url": "https://www.skiresort.com/en/ski-resorts/usa/" }],
    "resortUrls": [],
    "maxItems": 20,
    "fetchFullDetail": False,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("getascraper/skiresort-com-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 '{
  "listingUrls": [
    {
      "url": "https://www.skiresort.com/en/ski-resorts/usa/"
    }
  ],
  "resortUrls": [],
  "maxItems": 20,
  "fetchFullDetail": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call getascraper/skiresort-com-scraper --silent --output-dataset

```

## MCP server setup

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