# Boat & Yacht Listings Scraper for Yachtall (`haketa/yachtall-scraper`) Actor

Scrape boat & yacht listings from Yachtall: title, price, currency, year, boat type & category, length, cabins, fuel, location, seller and photos. For marine market research, pricing and dealer leads. Independent tool, not affiliated with Yachtall.

- **URL**: https://apify.com/haketa/yachtall-scraper.md
- **Developed by:** [Haketa](https://apify.com/haketa) (community)
- **Categories:** E-commerce, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

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

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

## Boat & Yacht Listings Scraper for Yachtall

> **Extract boat & yacht listings from Yachtall at scale: title, price, currency, year, boat type & category, length, cabins, fuel, location, seller and photos.** Leave the input empty for all boats, or paste category/search URLs — get clean JSON/CSV/Excel in seconds. Built for marine market research, pricing analysis and dealer lead generation.

[![Boats](https://img.shields.io/badge/Yachtall-Boat%20Listings-0a6cff)]()
[![Price & Specs](https://img.shields.io/badge/Price%20%2B%20Specs%20%2B%20Location-2da44e)]()
[![Dealer Leads](https://img.shields.io/badge/Includes-Seller%20%2F%20Dealer-8250df)]()
[![Export](https://img.shields.io/badge/Export-JSON%20%2F%20CSV%20%2F%20Excel-fb8500)]()

***

### What This Actor Does

**Yachtall** is a large international boat & yacht marketplace with tens of thousands of listings. This Actor turns any listing or category into a structured dataset. For each boat it returns:

- **Boat** — title, brand, boat type (power/sail) & category, year built, condition
- **Pricing** — asking price and currency
- **Specs** — length, beam, cabins, fuel
- **Location & seller** — where the boat lies, and the selling dealer/broker (with contact person)
- **Media** — main image, photo count and the listing URL

Leave the input empty to scan all boats, or paste category URLs (`/en/sailboats`, `/en/motorboats`) or a filtered search — the Actor paginates through the whole result set.

***

### Why Use This

- **Marine market & pricing data.** Prices, specs and locations across thousands of boats — benchmark asking prices by type, length, year and region.
- **Dealer & broker leads.** Every listing names the selling dealer/broker (and contact person) — a targeted lead source for marine businesses and services.
- **Clean, structured specs.** Length, cabins, fuel, type and category come as typed fields from the listing's own structured data.
- **Fast and cheap.** Pure-HTTP with a browser-grade fingerprint — no headless browser, no residential proxy needed.

***

### Quick Start

#### Run it in the console (no code)

1. Leave **Yachtall listing URLs** empty for all boats, or paste a category URL (e.g. `https://www.yachtall.com/en/sailboats`).
2. Keep **Include full details** on for price, specs, location and seller.
3. Set **Max boats**, click **Start**, then export as **JSON, CSV, Excel or HTML**, or push to Google Sheets, a webhook or a database.

#### Run it via API (Python)

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")

run_input = {
    "startUrls": ["https://www.yachtall.com/en/motorboats"],
    "includeDetails": True,
    "maxItems": 300,
}

run = client.actor("YOUR_USERNAME/yachtall-scraper").call(run_input=run_input)

for b in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(b["title"], "·", b["price"], b["currency"], "·", b["lengthRaw"], "·", b["location"])
```

#### Benchmark prices by type (Python)

```python
run = client.actor("YOUR_USERNAME/yachtall-scraper").call(run_input={
    "startUrls": ["https://www.yachtall.com/en/boats"],
    "maxItems": 1000,
})
from statistics import median
by_type = {}
for b in client.dataset(run["defaultDatasetId"]).iterate_items():
    if b.get("price"):
        by_type.setdefault(b.get("boatType") or "?", []).append(b["price"])
for t, prices in by_type.items():
    print(t, "median price:", int(median(prices)), "n=", len(prices))
```

#### Build a dealer lead list (Node.js)

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });

const run = await client.actor('YOUR_USERNAME/yachtall-scraper').call({
    startUrls: ['https://www.yachtall.com/en/boats'],
    maxItems: 500,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
const dealers = {};
for (const b of items) if (b.seller) dealers[b.seller] = (dealers[b.seller] || 0) + 1;
console.log(Object.entries(dealers).sort((a,b)=>b[1]-a[1]).slice(0, 20));
```

***

### Input Parameters

| Field | Type | Description |
|---|---|---|
| `startUrls` | array | Yachtall listing/category/search URLs. Empty = all boats. |
| `includeDetails` | boolean | Fetch each boat's detail for price, specs, location & seller. Default `true`. |
| `maxItems` | integer | Max boats across all URLs. `0` = no limit. |
| `maxPages` | integer | Max pages per URL (15 boats per page). Default `50`. |
| `proxyConfiguration` | object | Apify Proxy. Datacenter is enough and enabled by default. |

***

### Output

Each boat is one record:

```json
{
  "boatId": "s282524",
  "title": "Alm Trawler Delfino 65",
  "brand": "ALM",
  "price": 1499000,
  "currency": "EUR",
  "condition": "used",
  "yearBuilt": 2015,
  "boatType": "powerboat",
  "boatCategory": "motor yacht, trawler",
  "lengthMeters": 21.55,
  "lengthRaw": "21.55 m (71 feet)",
  "beamRaw": "6.20 m (20.3 feet)",
  "cabins": 3,
  "fuel": "diesel",
  "location": "Croatia",
  "seller": "Dalmatia Yachting",
  "sellerContact": "Mrs. Elke Wehr",
  "photoCount": 41,
  "image": "https://image.yachtall.com/...huge.jpg",
  "listingUrl": "https://www.yachtall.com/en/boat/alm-trawler-delfino-65-s282524"
}
```

Without `includeDetails`, each record has the boat's title and listing URL only (fast).

***

### Use Cases

#### 1. Marine market & pricing research

Benchmark asking prices, lengths and specs across boat types, brands, years and regions — build a picture of the used-boat market.

#### 2. Dealer & broker lead generation

Every listing names the selling dealer/broker and contact — a targeted lead source for marine services, finance, insurance and suppliers.

#### 3. Competitive & inventory monitoring

Track which boats are listed, at what prices, by which dealers, and where — monitor competitors and market supply.

#### 4. Valuation & analytics

Aggregate price-vs-length-vs-year-vs-type to build valuation models and spot under/over-priced listings.

#### 5. Data enrichment

Enrich a marine CRM or catalog with fresh listings, prices, specs and seller details.

***

### Tips

- **All boats vs category:** leave URLs empty for everything, or use `/en/sailboats`, `/en/motorboats` (or any filtered search URL) to focus.
- **`includeDetails`** is where price, specs, location and seller come from — keep it on unless you only need a URL list.
- **`maxItems: 0`** paginates to the end (15 per page).
- **Schedule it** with Apify Schedules to track new listings and price changes.

***

### Frequently Asked Questions

**Do I need an account?**
No. The Actor reads publicly visible listings — no login required.

**Where does the price come from?**
The boat's detail page (structured data). Keep `includeDetails` on to get price, specs, location and seller.

**Which currencies appear?**
Whatever the seller lists — commonly EUR, but also USD, GBP and others; each record carries its `currency`.

**What export formats are supported?**
JSON, CSV, Excel, HTML, or via API — plus Google Sheets, webhooks, Make and Zapier.

***

### Legal & Responsible Use

This Actor is an independent tool and is **not affiliated with, endorsed by, or sponsored by Yachtall** or its operators. All trademarks are the property of their respective owners.

It collects only publicly available listing information for research and business use. You are responsible for how you use the data. Please:

- Respect Yachtall's Terms of Service and robots directives.
- Comply with applicable data-protection laws when handling seller contact details.
- Do not use the data for spam, harassment, or any unlawful purpose.
- Use reasonable request volumes and scheduling.

# Actor input Schema

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

Yachtall listing/category/search URLs (e.g. https://www.yachtall.com/en/boats, /en/sailboats, /en/motorboats, or a filtered search URL). Defaults to all boats if empty.

## `includeDetails` (type: `boolean`):

Fetch each boat's detail page for price, currency, condition, boat type/category, length, beam, cabins, fuel, location and seller. Recommended — price lives on the detail page. Turn off for a fast title+URL-only list.

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

Maximum boats to return across all URLs. 0 = no limit.

## `maxPages` (type: `integer`):

Maximum result pages to paginate per listing URL (15 boats per page).

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

Apify Proxy. Datacenter is enough for Yachtall and is enabled by default.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.yachtall.com/en/boats"
  ],
  "includeDetails": true,
  "maxItems": 60,
  "maxPages": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `boatId` (type: `string`):

Yachtall boat ID

## `title` (type: `string`):

Boat name/title

## `brand` (type: `string`):

Manufacturer/brand

## `price` (type: `string`):

Asking price

## `currency` (type: `string`):

Currency code

## `condition` (type: `string`):

new / used

## `yearBuilt` (type: `string`):

Year built

## `boatType` (type: `string`):

powerboat / sailboat

## `boatCategory` (type: `string`):

Boat category

## `lengthMeters` (type: `string`):

Length in meters

## `lengthRaw` (type: `string`):

Length (raw text)

## `beamRaw` (type: `string`):

Beam (raw text)

## `cabins` (type: `string`):

Number of cabins

## `fuel` (type: `string`):

Fuel type

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

Boat location

## `seller` (type: `string`):

Seller / dealer

## `sellerContact` (type: `string`):

Seller contact person

## `photoCount` (type: `string`):

Number of photos

## `image` (type: `string`):

Main image URL

## `description` (type: `string`):

Listing description

## `listingUrl` (type: `string`):

Listing URL

## `scrapedAt` (type: `string`):

ISO timestamp

# 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": [
        "https://www.yachtall.com/en/boats"
    ],
    "includeDetails": true,
    "maxItems": 60,
    "maxPages": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("haketa/yachtall-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": ["https://www.yachtall.com/en/boats"],
    "includeDetails": True,
    "maxItems": 60,
    "maxPages": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("haketa/yachtall-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": [
    "https://www.yachtall.com/en/boats"
  ],
  "includeDetails": true,
  "maxItems": 60,
  "maxPages": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call haketa/yachtall-scraper --silent --output-dataset

```

## MCP server setup

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