# Zalo Page Extractor (`maximedupre/zalo`) Actor

Extract public Zalo pages and posts from a list of URLs. Get source links, titles, available descriptions, image references, and video references in an Apify Dataset. Follow reachable Zalo pages linked from your starting pages.

- **URL**: https://apify.com/maximedupre/zalo.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Social media, Developer tools, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$8.10 / 1,000 pages

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/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

### 🔎 Extract public Zalo page data

Researchers, developers, and content teams can give this Actor public Zalo page or post URLs. It saves the first eligible match for each page or post with its source URL, available title, description, image references, and video references in an Apify Dataset. It also follows reachable Zalo pages linked from the submitted pages.

**Common tasks**

- Use **[What Is Zalo](https://apify.com/maximedupre/zalo/examples/what-is-zalo)** to collect public Zalo pages for a quick product or service overview.
- Use **[Zalo Me](https://apify.com/maximedupre/zalo/examples/zalo-me)** to collect a public Zalo page or post from a known URL.
- Use **[Zalo Download](https://apify.com/maximedupre/zalo/examples/zalo-download)** to save public Zalo page data to an Apify Dataset.
- Use **[Zalo OA](https://apify.com/maximedupre/zalo/examples/zalo-oa)** to review public Zalo Official Account pages and posts.
- Use **[Zalo PC](https://apify.com/maximedupre/zalo/examples/zalo-pc)** to collect public Zalo page details for a desktop or web research workflow.

#### 📄 Zalo pages and posts

Each saved Dataset row represents the first eligible match for one public Zalo page or post. The row keeps the source URL and includes the title, description, image references, and video references when those values are available. You can use the rows for content review, page research, or a machine-readable data workflow.

#### 🚀 Run a Zalo page crawl

1. Add one or more public Zalo page URLs in **Zalo page URLs**.
2. Leave **Maximum results** empty to collect all available results until the source is exhausted, or set a limit for a smaller run.
3. Start the run and open the Dataset link in the run output.

The Actor starts with the URLs you submit and follows reachable Zalo pages linked from those pages. It only works with public pages and posts. It does not access private or account-scoped Zalo data, send messages, edit account data, or download media files.

#### ⚙️ Input

**Input fields**

| Field | Type | What it does |
|---|---|---|
| `startUrls` | array of URL objects | Required. Add one or more public Zalo page URLs. The Actor starts there and follows reachable Zalo pages linked from them. |
| `maxItems` | integer | Optional cap on saved pages or posts. Leave it empty to collect all available results until the source is exhausted. |

**Example input**

This example is copied from the successful Hosted QA default-input run:

```json
{
  "startUrls": [
    {
      "url": "https://zalo.me/vi/product/zalo"
    }
  ],
  "maxItems": 100
}
```

#### 🧾 Output

**Run output link**

The Actor output contains a link to the extracted data.

| Field | Type | What it does |
|---|---|---|
| `dataset` | string | Links to the extracted Zalo pages and posts in the Dataset overview. |

**Dataset row fields**

Each Dataset row has this shape. Optional values are present only when the source page exposes them.

| Field | Type | What it does |
|---|---|---|
| `url` | string | Source URL of the public Zalo page or post. |
| `title` | string | Title shown on the page or post, when available. |
| `description` | string | Description shown on the page or post, when available. |
| `imageUrls` | array of strings | Image reference URLs found on the page or post. |
| `videos` | array of objects | Video references found on the page or post. |
| `videos[].url` | string | URL of a referenced video. |
| `videos[].posterUrl` | string | URL of the video poster image, when available. |

**Example dataset row**

This is a shortened genuine row from the newest successful current-beta run. The `...` strings mark omitted live description text or image entries.

```json
{
  "url": "https://zalo.me/vi/product/zalo",
  "title": "Zalo",
  "description": "...",
  "imageUrls": [
    "https://zalo-site.zadn.vn/_next/static/media/logo.a68785cd.svg",
    "https://zalo-site.zadn.vn/_next/static/media/product-zalo.d1c9d1f6.png",
    "..."
  ],
  "videos": [
    {
      "url": "https://zalo-site.zadn.vn/videos/product-zalo-thumb.mp4"
    }
  ]
}
```

#### 💳 Pricing

This Actor uses pay-per-event pricing. The buyer-facing event is one successfully extracted public Zalo page or post saved to the Dataset. Check the Apify pricing panel for the current price before you start.

#### 🔌 Integrations

Use the Apify API to start runs and read the Dataset link.

https://www.youtube.com/watch?v=bNACk1\_S\_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

#### ❓ FAQ

##### Can I scrape private Zalo pages or chats?

No. The Actor extracts public Zalo pages and posts from the URLs you submit or from reachable linked pages. It does not access private or account-scoped data.

##### Does the Actor download images or videos?

No. It returns image and video references or metadata when they are available. It does not download media files.

##### What happens when a public page links to another Zalo page?

The Actor can follow reachable Zalo pages linked from the submitted pages and save their available page data.

##### What happens when the same page is found more than once?

The Actor keeps the first eligible saved match for that source page or post. It ignores later matches from another submitted URL or linked page.

##### What if a source page has no title or description?

The matching field can be absent when the source does not expose it. The Actor does not fill missing values with guesses.

##### How can I keep a run small?

Set **Maximum results** to the number of pages or posts you want to save. Leave it empty to collect all available results until the source is exhausted.

### 📝 Changelog

**0.0: Initial release**

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~zalo/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- [Facebook User Posts Scraper](https://apify.com/maximedupre/facebook-user-posts-scraper): collect public Facebook posts from profile, Page, or post URLs with text and source links.
- [VK Posts Scraper](https://apify.com/maximedupre/vk-posts-scraper): collect public VK wall and direct posts with text, media, and engagement.
- [Telegram Channel Messages Scraper](https://apify.com/maximedupre/telegram-channel-messages-scraper): collect public Telegram channel messages with source URLs and media metadata.
- [Website URL Crawler & Link Extractor](https://apify.com/maximedupre/website-url-crawler): build a public website URL inventory from links and sitemaps.
- [RedNote User Posts Scraper](https://apify.com/maximedupre/rednote-user-posts-scraper): export public RedNote profile post cards with titles, cover images, and likes.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

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

Enter one or more public Zalo page URLs to use as the starting pages. The Actor follows reachable Zalo pages linked from them.

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

Stop after this many pages or posts are saved. Leave this empty to collect all available results until the source is exhausted.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://zalo.me/vi/product/zalo"
    }
  ],
  "maxItems": 100
}
```

# Actor output Schema

## `dataset` (type: `string`):

Dataset URL for the extracted Zalo pages and posts.

# 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://zalo.me/vi/product/zalo"
        }
    ],
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/zalo").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://zalo.me/vi/product/zalo" }],
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/zalo").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://zalo.me/vi/product/zalo"
    }
  ],
  "maxItems": 100
}' |
apify call maximedupre/zalo --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,maximedupre/zalo"
        }
    }
}

```

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/h6vjav0mhXRIWFsRq/builds/nuHNzNuw5GKANmKCD/openapi.json
