# Vue.js Documentation Scraper (`parseforge/vuejs-docs-scraper`) Actor

Scrape the official Vue.js docs into rows: title, URL, section, headings, full text and raw Markdown. Export to CSV, JSON, Excel, or XML.

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

## Pricing

from $4.53 / 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?

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

![ParseForge Banner](https://github.com/ParseForge/apify-assets/blob/ad35ccc13ddd068b9d6cba33f323962e39aed5b2/banner.jpg?raw=true)

## 📗 Vue.js Documentation Scraper

> 🚀 **Export the entire Vue.js documentation in seconds.** All 110 pages of vuejs.org, 15 fields each, with the raw Markdown source next to the rendered text.

This Actor turns the official Vue.js documentation into a clean dataset. It reads the site's own `sitemap.xml`, fetches every page, and returns one row per page: title, canonical URL, section, headings, word count, code block count, the GitHub source link, the full readable text, and the original Markdown that VitePress rendered the page from. No API key, no login, no browser automation.

Coverage is the whole public documentation: 110 pages on vuejs.org across 12 top-level sections (52 guide pages, 29 API reference pages, 9 partner pages, 6 about pages, 5 style guide pages, plus tutorial, examples, glossary, error reference, ecosystem, sponsor and translations). The nine community translation sites are separate hosts and work the same way, from 108 pages on pt.vuejs.org up to 122 on de.vuejs.org. A five page sample finishes in about three seconds.

| 🎯 Target Audience | 💡 Primary Use Cases |
| --- | --- |
| AI and RAG engineers | Build a grounded Vue knowledge base from the official reference, in Markdown that chunks cleanly. |
| Developer tooling teams | Ship offline docs search, IDE hover help, or a docs powered chatbot. |
| Technical writers and translators | Compare an English page against its translated twin, page by page and heading by heading. |
| Educators and content teams | Pull structured examples, code block counts and section maps for courses and tutorials. |
| Framework maintainers | Track what the docs say about an API before and after a release. |

### 📋 What the Vue.js Documentation Scraper does

> 💡 **Why it matters:** documentation is the single best grounding source for a coding assistant, and Vue publishes both a rendered page and its Markdown source. This Actor collects both in one pass, so your index keeps the headings, code fences and links that the rendered text throws away.

- 🗺️ **Sitemap first.** Give it `https://vuejs.org` and it reads the official sitemap, so you get the complete page list instead of whatever a link crawler happens to reach.
- 📝 **Raw Markdown included.** Every page is also published at its `.md` address. The Actor fetches it and stores it beside the rendered text, so headings, code fences and links survive.
- 🔖 **Heading outline per page.** Each row carries an array of H2 and H3 headings with their anchor ids, which is exactly what a chunker needs to split a long page.
- 🧭 **Section and subsection.** Rows are labelled from the URL path, so you can filter to `guide`, `api`, or a single subsection like `guide/essentials`.
- 🌍 **Every translation.** Point it at `cn.vuejs.org`, `ja.vuejs.org`, `fr.vuejs.org` or any other translation host and the same 15 fields come back, with the detected language code.
- 🎯 **Targeted crawls.** Start from one page instead of the root, and turn link following on or off to control exactly how far the crawl goes.

Results export to CSV, JSON, Excel or XML, or straight from the Apify API.

### 🎬 Full Demo (🚧 Coming soon)

A short walkthrough video is in production. Until then, the sample records below are exactly what a run returns.

### 📊 Output

Every row is one documentation page. Fifteen fields, no nulls except the error column.

| Field | Type | Description |
| --- | --- | --- |
| 📌 `title` | string | Page title, with the site suffix removed. |
| 🔗 `url` | string | Canonical page URL, normalised without the `.html` extension. |
| 🧭 `path` | string | Path on the host, for example `/guide/essentials/list`. |
| 📁 `section` | string | First path segment: `guide`, `api`, `about`, `style-guide` and so on. |
| 🗂 `subsection` | string | Second segment on nested pages, `N/A` on two level pages. |
| 🗣 `language` | string | Language code from the page itself, for example `en-US` or `zh-CN`. |
| 🔢 `wordCount` | integer | Words in the readable body text. |
| 💻 `codeBlockCount` | integer | Number of code blocks on the page. |
| 🐙 `githubEditUrl` | string | Link to the Markdown source in the docs repository, `N/A` when the host does not publish one. |
| 📝 `markdownUrl` | string | Address of the raw Markdown file, `N/A` when the host does not serve it. |
| 📄 `content` | string | Full readable text of the page, boilerplate stripped. |
| 🧾 `markdown` | string | Original Markdown source, front matter removed. |
| 🔖 `headings` | array | H2 and H3 headings as `{ level, text, anchor }` objects. |
| 🕒 `scrapedAt` | string | ISO 8601 timestamp of collection. |
| ❌ `error` | string or null | Populated only on an error row, `null` on real records. |

Three real records from a run (long text fields are cut with `...` for readability here, the dataset stores them in full):

```json
[
  {
    "title": "Community Guide",
    "url": "https://vuejs.org/about/community-guide",
    "path": "/about/community-guide",
    "section": "about",
    "subsection": "N/A",
    "language": "en-US",
    "wordCount": 796,
    "codeBlockCount": 0,
    "githubEditUrl": "https://github.com/vuejs/docs/edit/main/src/about/community-guide.md",
    "markdownUrl": "https://vuejs.org/about/community-guide.md",
    "content": "Community Guide Vue's community is growing incredibly fast and if you're reading this, there's a good chance you're ready to join it. So... welcome!Now we'll answer both what the community can do for you and what you can ...",
    "markdown": "# Community Guide {#community-guide}\n\nVue's community is growing incredibly fast and if you're reading this, there's a good chance you're ready to join it. So... welcome!\n\nNow we'll answer both what t ...",
    "headings": [
      { "level": 2, "text": "Resources", "anchor": "resources" },
      { "level": 3, "text": "Code of Conduct", "anchor": "code-of-conduct" },
      { "level": 3, "text": "Stay in the Know", "anchor": "stay-in-the-know" }
    ],
    "scrapedAt": "2026-09-08T05:29:16.988Z",
    "error": null
  },
  {
    "title": "Frequently Asked Questions",
    "url": "https://vuejs.org/about/faq",
    "path": "/about/faq",
    "section": "about",
    "subsection": "N/A",
    "language": "en-US",
    "wordCount": 1306,
    "codeBlockCount": 0,
    "githubEditUrl": "https://github.com/vuejs/docs/edit/main/src/about/faq.md",
    "markdownUrl": "https://vuejs.org/about/faq.md",
    "content": "Frequently Asked Questions Who maintains Vue? Vue is an independent, community-driven project. It was created by Evan You in 2014 as a personal side project. Today, Vue is actively maintained by a team of both full-time ...",
    "markdown": "# Frequently Asked Questions {#frequently-asked-questions}\n\n## Who maintains Vue? {#who-maintains-vue}\n\nVue is an independent, community-driven project. It was created by [Evan You](https://x.com/evan ...",
    "headings": [
      { "level": 2, "text": "Who maintains Vue?", "anchor": "who-maintains-vue" },
      { "level": 2, "text": "What's the difference between Vue 2 and Vue 3?", "anchor": "what-s-the-difference-between-vue-2-and-vue-3" },
      { "level": 2, "text": "Is Vue 2 Still Supported?", "anchor": "is-vue-2-still-supported" }
    ],
    "scrapedAt": "2026-09-08T05:29:17.111Z",
    "error": null
  },
  {
    "title": "Releases",
    "url": "https://vuejs.org/about/releases",
    "path": "/about/releases",
    "section": "about",
    "subsection": "N/A",
    "language": "en-US",
    "wordCount": 636,
    "codeBlockCount": 0,
    "githubEditUrl": "https://github.com/vuejs/docs/edit/main/src/about/releases.md",
    "markdownUrl": "https://vuejs.org/about/releases.md",
    "content": "Releases Checking latest version... A full changelog of past releases is available on GitHub.Release Cycle Vue does not have a fixed release cycle.Patch releases are released as needed.Minor releases always contain new f ...",
    "markdown": "# Releases {#releases}\n\nA full changelog of past releases is available on [GitHub](https://github.com/vuejs/core/blob/main/CHANGELOG.md).\n\n## Release Cycle {#release-cycle}\n\nVue does not have a fixed ...",
    "headings": [
      { "level": 2, "text": "Release Cycle", "anchor": "release-cycle" },
      { "level": 2, "text": "Semantic Versioning Edge Cases", "anchor": "semantic-versioning-edge-cases" },
      { "level": 3, "text": "TypeScript Definitions", "anchor": "typescript-definitions" }
    ],
    "scrapedAt": "2026-09-08T05:29:17.060Z",
    "error": null
  }
]
```

### ✨ Why choose this Actor

- 📝 **Markdown and rendered text in the same row.** Most documentation crawlers give you one or the other. Here you get the readable text for search and the original Markdown for chunking and diffing.
- 🗺️ **Complete by construction.** The page list comes from the official sitemap, not from following links, so nothing is missed because a page happens to be unlinked.
- 🚫 **No nulls.** Fields the source withholds come back as `N/A`, so a CSV opens cleanly in Excel and a JSON loader never trips on a missing key.
- 🧹 **Clean text.** Anchor icons, ad slots, previous and next links and hidden elements are stripped before the text is extracted.
- 🔗 **URL normalisation.** `/guide/quick-start`, `/guide/quick-start.html` and `/guide/quick-start/` are one page, not three duplicate paid rows.
- ⚡ **No browser.** Plain HTTP against a static site: fast, cheap and stable, with the proxy off by default and available if your network needs it.
- 🌍 **Translations included.** The same run shape works on every community translation host.

### 📈 How it compares to alternatives

| Approach | Complete page list | Raw Markdown | Heading outline | Setup |
| --- | --- | --- | --- | --- |
| **This Actor** | Yes, from the sitemap | Yes, per page | Yes, with anchors | Paste a URL |
| Generic website crawler | Only what is linked | No, HTML to text only | Rarely | Depth, selectors and filters to tune |
| Working from the docs repository | Yes | Yes | No, you parse it yourself | Local tooling, and the repo layout is not the site layout |
| Manual copy and paste | No | No | No | Hours per section |

Honest ceilings: vuejs.org publishes 110 pages, so a single host run cannot return more than that no matter how high you set the item limit. Only the current Vue 3 documentation is published on these hosts, so there is no versioned archive to scrape. The Markdown source is served by vuejs.org and by the cn, fr, ko, pt and ru translations, but not by ja.vuejs.org, where `markdown` and `markdownUrl` return `N/A`.

### 🚀 How to use

1. **Create a free Apify account.** New accounts get $5 in free platform credit: [sign up here](https://console.apify.com/sign-up?fpr=vmoqkp).
2. **Open the Actor** and leave the prefilled start URL `https://vuejs.org` in place, or replace it with the page or translation host you want.
3. **Set Max Items.** Free accounts preview 10 items per run. Paid accounts can go up to 1,000,000, though a single host tops out at its own page count.
4. **Narrow the scope, optionally.** Pick sections such as `guide` or `api`, and switch link following off when you want only the URLs you listed.
5. **Start the run.** A full 110 page pass takes a couple of minutes.
6. **Export.** Download the dataset as CSV, JSON, Excel or XML, or pull it from the Apify API.

### 💼 Business use cases

**🤖 Ground an internal coding assistant.**
A platform team runs the Actor over vuejs.org every week, chunks the `markdown` field on the `headings` anchors, and refreshes the vector index behind their internal assistant. Answers cite the exact documentation page rather than a model's memory of Vue 2.

**🔍 Ship documentation search in a developer product.**
An IDE extension vendor bundles the dataset so users can search the official Vue reference offline. `title`, `section` and `headings` power the result list, `content` powers full text matching, and `url` sends the user to the live page.

**🌐 Manage a translation programme.**
A localisation lead pulls vuejs.org and cn.vuejs.org in two runs, joins the rows on `path`, and compares `wordCount` and the heading arrays to find pages where the translation has drifted from the source.

**📚 Build course and tutorial material.**
A training company filters to `section = guide`, sorts by `codeBlockCount`, and pulls the most example dense pages as the backbone of a curriculum, with the Markdown ready to paste into lesson notebooks.

### 🔌 Automating Vue.js Documentation Scraper

- **Schedule it.** Apify Schedules can run the Actor nightly or weekly and keep the dataset current with no babysitting.
- **Make and Zapier.** Trigger on a finished run and push new rows into Notion, Airtable, or a Google Sheet.
- **Slack.** Post a message when a run finishes so the docs channel knows the index was refreshed.
- **Airbyte and warehouses.** Sync the dataset into BigQuery, Snowflake or Postgres for joins against your own analytics.
- **GitHub.** Fire a workflow that rebuilds your search index whenever a scheduled run reports a changed page count.
- **Google Drive.** Drop the CSV export into a shared folder for writers and translators who do not use the console.

### 🌟 Beyond business use cases

- **Research.** Study how a major open source project structures its documentation: section sizes, code density, heading depth.
- **Personal.** Keep an offline copy of the reference for a flight or a spotty connection, in Markdown your notes app understands.
- **Non-profit and education.** Build free study material for a community coding class, in any of the translated languages.
- **Experimentation.** Use a real, well written, freely available corpus to benchmark chunking strategies, embeddings, or summarisation.

### 🤖 Ask an AI assistant about this scraper

Paste this into ChatGPT, Claude or your own agent:

> I want to build a retrieval index over the official Vue.js documentation. I have an Apify Actor that returns one row per documentation page with these fields: title, url, path, section, subsection, language, wordCount, codeBlockCount, githubEditUrl, markdownUrl, content, markdown, headings, scrapedAt, error. The headings field is an array of `{ level, text, anchor }`. Suggest a chunking strategy that splits the markdown on headings, keeps code blocks intact, and stores the anchor so I can deep link back to the page.

The Actor also works through Apify's API and MCP integration, so an agent can trigger a run and read the dataset itself.

### ❓ Frequently Asked Questions

#### Do I need a Vue.js account or an API key?

No. The documentation is public and the Actor reads it exactly as a browser would.

#### How many pages can I get?

110 on vuejs.org today. Translation hosts range from 108 to 122. Set a higher item limit and you simply get everything the host publishes.

#### What is the difference between `content` and `markdown`?

`content` is the readable text of the rendered page with navigation and boilerplate stripped. `markdown` is the original source file that generated the page, with headings, code fences and links intact. Use `content` for search, `markdown` for chunking and diffing.

#### Why is `markdown` sometimes `N/A`?

A few pages are not published at a `.md` address, and ja.vuejs.org does not serve Markdown at all. The field carries the `N/A` sentinel rather than a null so exports stay clean.

#### Can I scrape the translated documentation?

Yes. Each translation is its own host. Put `https://cn.vuejs.org` or `https://ja.vuejs.org` in the start URLs and the `language` field tells you which one a row came from.

#### Can I collect only part of the docs?

Yes. Use the Sections filter to keep only `guide`, `api`, `style-guide` and so on, or list specific page URLs and switch link following off.

#### Does it need a proxy?

No. vuejs.org is a static site with no anti-bot layer, so the proxy is off by default. Turn it on only if your own network cannot reach the site.

#### How fresh is the data?

Every run fetches live pages. `scrapedAt` records the exact moment each row was collected.

#### Does it capture code examples?

Yes. Code blocks stay inside the `markdown` field as fenced blocks, and `codeBlockCount` tells you how many a page has before you download anything.

#### Will duplicate URLs be charged twice?

No. Paths are normalised, so the `.html` variant, the trailing slash variant and the bare path are treated as one page.

#### Can I get old versions of the docs?

No. These hosts publish the current Vue 3 documentation only, and the Actor reports what is live.

#### What happens if a page fails to load?

That page is skipped and logged. If nothing at all could be fetched, the dataset carries a single row with an `error` message so a failed run is never silent.

#### Which export formats are supported?

CSV, JSON, Excel and XML from the console, plus the Apify API and integrations.

### 🔌 Integrate with any app

Runs and datasets are available through the Apify API, the JavaScript and Python clients, webhooks, scheduled runs, and the Apify MCP server, so the output drops into an existing pipeline without glue code.

### 🔗 Recommended Actors

- [DevDocs Documentation Sets Scraper](https://apify.com/parseforge/devdocs-documentation-scraper) for the catalogue of documentation sets across hundreds of libraries.
- [Markdown to PDF MCP Server](https://apify.com/parseforge/markdown-to-pdf-mcp) to turn the Markdown you collect into shareable documents.
- [Reddit Scraper](https://apify.com/parseforge/reddit-posts-scraper) for what developers actually say about a framework.
- [X.com Profiles Scraper](https://apify.com/parseforge/x-com-profiles-scraper) to track the maintainers and community voices behind a project.

> 💡 **Pro Tip:** browse the complete [ParseForge collection](https://apify.com/parseforge) for more clean, well documented data Actors.

**🆘 Need Help?** [Open our contact form](https://tally.so/r/BzdKgA)

> **⚠️ Disclaimer:** This is an independent tool and is not affiliated with, endorsed by, or sponsored by Vue.js or the Vue.js core team. It collects only publicly available data from the public documentation site.

# Actor input Schema

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

Where to start. The site root (https://vuejs.org) reads the sitemap and covers all 110 pages. A single page such as https://vuejs.org/guide/introduction collects that page and, when Follow links is on, the pages it links to. Translations live on their own hosts and work the same way: https://cn.vuejs.org, https://fr.vuejs.org, https://ko.vuejs.org, https://pt.vuejs.org, https://ru.vuejs.org, https://ja.vuejs.org.

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

Free users: Limited to 10 items (preview). Paid users: Optional, max 1,000,000

## `sections` (type: `array`):

Keep only pages under these top-level sections of the docs. Leave empty for every page. The list matches the first path segment on vuejs.org, for example guide for /guide/essentials/list.

## `followLinks` (type: `boolean`):

Discover more pages by following internal links on every page collected. Turn it off to collect exactly the pages listed in Start URLs (or in the sitemap when a root URL is given).

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

Off by default. Apify Proxy is supported for users whose network cannot reach vuejs.org directly.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://vuejs.org"
    }
  ],
  "maxItems": 10,
  "followLinks": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

Key fields of every page collected.

## `fullData` (type: `string`):

Complete dataset with all 15 fields per page.

# 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://vuejs.org"
        }
    ],
    "maxItems": 10,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parseforge/vuejs-docs-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://vuejs.org" }],
    "maxItems": 10,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("parseforge/vuejs-docs-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://vuejs.org"
    }
  ],
  "maxItems": 10,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call parseforge/vuejs-docs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parseforge/vuejs-docs-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/OVfKxBJdVOOazMpXu/builds/8CYLF1YPOWVCy8eCJ/openapi.json
