# Wikivoyage Travel Guide Scraper (`ninhothedev/wikivoyage-scraper`) Actor

$0.5/1K 🔥 Wikivoyage scraper! Travel guides with summaries, coordinates & sections. No key. JSON, CSV, Excel or API in seconds. Build travel apps & destination content ⚡

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

## Pricing

from $0.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.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#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

## Wikivoyage Travel Guide Scraper

Scrape **Wikivoyage travel guides** at scale — destination summaries, GPS coordinates, full section outlines, hero images and canonical URLs — from any of the 25+ Wikivoyage language editions. **No API key, no login, no proxy required.**

Wikivoyage is the free, community-written travel guide (a sister project of Wikipedia) covering tens of thousands of cities, regions, parks and itineraries. This Actor turns those guides into clean, structured JSON/CSV/Excel rows you can drop straight into a travel app, a content pipeline or an LLM/RAG index.

***

### What it does

| Mode | Input | Output |
|------|-------|--------|
| **search** | Keywords such as `Berlin`, `Tokyo`, `hiking Norway` | Every matching destination page with intro summary, coordinates, thumbnail and word count |
| **pages** | Exact page titles such as `Paris`, `Berlin/Mitte` | The full detail record for each title (redirects followed automatically) |

Each result is one dataset item — one row per travel guide.

### Features

- **Destination search** — up to 50 Wikivoyage pages per query, deduplicated across queries.
- **Geo-ready** — latitude/longitude straight from the article's primary coordinates, perfect for maps and radius search.
- **Section outlines** — the complete table of contents (`Get in`, `See`, `Do`, `Eat`, `Drink`, `Sleep`, `Stay safe`, …) plus a `section_count`, so you can judge guide depth at a glance.
- **Plain-text summaries** — clean intro extracts (capped at 5,000 characters), no wiki markup, no HTML.
- **25+ languages** — `en`, `de`, `fr`, `es`, `it`, `nl`, `pt`, `ru`, `pl`, `sv`, `zh`, `ja` and more, via a single `language` input.
- **Hero images** — a 600px thumbnail URL for every guide that has a page image.
- **Datacenter-clean** — runs on the free/basic Apify infrastructure without residential proxies.

### Input

```json
{
  "mode": "search",
  "queries": ["Berlin", "Tokyo"],
  "language": "en",
  "includeSections": true,
  "maxItems": 100
}
```

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `mode` | select | `search` | `search` = find destinations by keyword, `pages` = fetch exact titles |
| `queries` | array | `["Berlin","Tokyo"]` | Search keywords (mode `search`) |
| `titles` | array | – | Exact page titles, e.g. `["Paris"]` (mode `pages`) |
| `language` | string | `en` | Wikivoyage language edition code |
| `includeSections` | boolean | `true` | Fetch the full table of contents per guide |
| `maxItems` | integer | `100` | Hard cap on dataset items (max 1000) |

### Output

```json
{
  "page_id": 3512,
  "title": "Berlin",
  "language": "en",
  "summary": "Berlin is Germany's capital and largest city. Within the city limits, Berlin in 2022 had a population of 3.7 million...",
  "latitude": 52.51794,
  "longitude": 13.38873,
  "thumbnail": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3b/Siegessaeule_Aussicht_10-13_img4_Tiergarten.jpg/960px-...",
  "word_count": 22432,
  "sections": ["Districts", "Understand", "History", "Get in", "Get around", "See", "Do", "Eat", "Drink", "Sleep"],
  "section_count": 88,
  "url": "https://en.wikivoyage.org/wiki/Berlin",
  "source": "wikivoyage",
  "scraped_at": "2026-07-28T12:35:00+00:00"
}
```

All fields are nullable — a page without coordinates simply returns `null` for `latitude`/`longitude`.

### Use cases

- **Travel apps** — seed a destination database with names, coordinates and human-written summaries in minutes.
- **Destination content** — power city guides, landing pages and newsletters with editorial-quality descriptions and section structure.
- **LLM / RAG corpora** — build a clean, attributable travel knowledge base for chatbots and AI travel assistants.
- **Itinerary tools** — use coordinates plus section outlines (`See`, `Do`, `Eat`) to auto-assemble day plans and route suggestions.

### Pricing

Roughly **$0.5 per 1,000 travel guides** on typical runs, plus Apify platform usage. Turning `includeSections` off removes one request per page and makes runs noticeably cheaper and faster.

### Speed & limits

- Requests are batched (up to 20 pages per API call) and sent with a descriptive User-Agent, in line with the Wikimedia API etiquette.
- `maxItems` caps at 1,000 guides per run; chain runs or split queries for larger crawls.
- Search only covers the main namespace (actual travel articles, not talk or user pages).

### Related Actors

- [Wikipedia Scraper](https://apify.com/ninhothedev/wikipedia-scraper) — articles, summaries and metadata from Wikipedia
- [Geocoding Scraper](https://apify.com/ninhothedev/geocoding-scraper) — turn addresses into coordinates and back
- [CityBikes Scraper](https://apify.com/ninhothedev/citybikes-scraper) — live bike-sharing stations worldwide
- [OpenStreetMap Notes Scraper](https://apify.com/ninhothedev/openstreetmap-notes-scraper) — community map notes and reports

### Legal & attribution

Wikivoyage content is published under **CC BY-SA 4.0**. When you republish text from this Actor, credit Wikivoyage and its contributors and keep the share-alike licence. This Actor reads only the public MediaWiki API and collects no personal data.

# Actor input Schema

## `mode` (type: `string`):

How to select destinations. 'search' runs your keywords through Wikivoyage search and returns the matching destination pages. 'pages' takes exact page titles and returns the full detail record for each one.

## `queries` (type: `array`):

Keywords to search on Wikivoyage, e.g. city names, regions or themes ('Berlin', 'Tokyo', 'hiking Norway'). Used only when mode is 'search'. Each query returns up to 50 destination pages.

## `titles` (type: `array`):

Exact Wikivoyage page titles to scrape, e.g. 'Paris' or 'Berlin/Mitte'. Used only when mode is 'pages'. Titles are case-sensitive after the first letter; redirects are followed automatically.

## `language` (type: `string`):

Two-letter code of the Wikivoyage language edition to scrape, e.g. 'en' (English), 'de' (German), 'fr' (French), 'es' (Spanish), 'it' (Italian), 'ru' (Russian). Determines both search results and article text.

## `includeSections` (type: `boolean`):

Fetch the full table of contents of every guide (headings such as Get in, See, Do, Eat, Sleep, Stay safe). Adds one extra request per page; disable it for faster, cheaper runs.

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

Maximum number of travel guides to push to the dataset across all queries or titles. Use it to cap run time and cost.

## Actor input object example

```json
{
  "mode": "search",
  "queries": [
    "Berlin",
    "Tokyo"
  ],
  "titles": [
    "Paris"
  ],
  "language": "en",
  "includeSections": true,
  "maxItems": 100
}
```

# 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 = {
    "queries": [
        "Berlin",
        "Tokyo"
    ],
    "titles": [
        "Paris"
    ],
    "language": "en"
};

// Run the Actor and wait for it to finish
const run = await client.actor("ninhothedev/wikivoyage-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 = {
    "queries": [
        "Berlin",
        "Tokyo",
    ],
    "titles": ["Paris"],
    "language": "en",
}

# Run the Actor and wait for it to finish
run = client.actor("ninhothedev/wikivoyage-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 '{
  "queries": [
    "Berlin",
    "Tokyo"
  ],
  "titles": [
    "Paris"
  ],
  "language": "en"
}' |
apify call ninhothedev/wikivoyage-scraper --silent --output-dataset

```

## MCP server setup

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