# Email Risk Scorer (`red.cars/zalo-oa-scraper`) Actor

Score email addresses for fraud/spam risk: disposable domains, MX validation, role accounts, and an AI judgment layer for ambiguous cases. $0.004 per scored email.

- **URL**: https://apify.com/red.cars/zalo-oa-scraper.md
- **Developed by:** [AutomateLab](https://apify.com/red.cars) (community)
- **Categories:** Social media, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$8.00 / 1,000 oa scrapeds

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?

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

## Zalo OA Scraper — Public Zalo Official Account Data (OA Profiles, Verified Badge, QR)

Scrape **public Zalo Official Account (OA) pages** on zalo.me: OA ID, account
name, **verified flag**, category, description, avatar, QR deep-link image,
public address and working hours — as clean JSON, CSV or Excel.

No login. No QR session. No Zalo account. No Bright Data. **You are charged
only for public OA records actually delivered** — login-walled, not-found and
unreachable targets are always free.

### Why this Zalo scraper

- **Public data only, by design.** Reads exactly the landing payload a
  logged-out browser sees. No chats, no contacts, no group rosters — out of
  scope and out of reach (Vietnam PDPL-friendly).
- **First-party decode.** Zalo server-renders OA pages inside an obfuscated
  payload; this actor decodes it directly over plain HTTPS — fast, cheap,
  no browser, no headless Chrome, no proxy required.
- **CRM-enrichment ready.** One stable record per OA: canonical `oaId`,
  custom slug, verified checkmark, tier, category (vi/en), address, working
  hours, avatar + QR URLs.
- **Clear statuses.** Every input row produces a row: `public`,
  `login_required`, `not_found`, or `error`. A login redirect is never
  misreported as a profile.
- **AI/agent ready.** Call it from Apify MCP, n8n, Make, or any HTTP client.

### Use cases

| Use case | What you get |
| --- | --- |
| Brand / OA directory building | Canonical OA ID, name, verified flag, category |
| Vietnam market research | Public OA descriptions, categories, tiers at scale |
| Store / branch data | Public address + working hours where the OA publishes them |
| QR / deep-link ops | QR image URL + message argv for the public OA |
| CRM enrichment | Structured OA rows from a list of zalo.me links |

### Input

| Field | Type | Description |
| --- | --- | --- |
| `startUrls` | array | Public `zalo.me/...` OA URLs — numeric (`https://zalo.me/4462152339089565647`) or custom slugs (`https://zalo.me/officialaccount`) |
| `oaIds` | array | Numeric Official Account IDs (10–24 digits) |
| `slugs` | array | Custom OA slugs (the path after `zalo.me/`) |
| `maxItems` | integer | Dataset cap (default 100) |
| `proxyConfiguration` | object | Optional; public OA pages normally need no proxy |

Mix all channels freely — merged and de-duplicated by OA ID. Group invite
links (`zalo.me/g/...`) are not public on the web and are rejected.

### Output (one record per public OA)

`status` · `oaId` · `slug` · `canonicalUrl` · `name` · `description` ·
`avatarUrl` · `qrCodeUrl` · `isVerified` · `category` · `categoryEn` ·
`tier` · `type` · `address` · `workingHours` · `url`

### Cost — success-only billing

Pay-per-event: **`oa-scraped` charged once per public OA record delivered.**

| Outcome | Charged? |
| --- | --- |
| Public OA profile delivered | Yes — $0.008/record |
| `login_required` (login wall) | Free |
| `not_found` | Free |
| `error` (network/upstream) | Free |
| Run summary record | Free |

### FAQ

**Is this the official Zalo Open API?** No — it reads public OA landing pages,
the same payload a logged-out browser sees. It is not affiliated with Zalo/VNG.

**Does it read private chats or messages?** Never. Private conversations,
contacts and group rosters need a logged-in Zalo account and are hard
out of scope.

**Do I need a proxy?** Usually not. Public OA landing pages fetch fine over
plain HTTPS; enable Apify Proxy only for very large batches.

### Example

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

```python
from apify_client import ApifyClient
run = ApifyClient("TOKEN").actor("red.cars/zalo-oa-scraper").call(
    {"startUrls": [{"url": "https://zalo.me/officialaccount"}]})
```

# Actor input Schema

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

Public zalo.me Official Account pages: numeric (https://zalo.me/4462152339089565647) or custom slugs (https://zalo.me/officialaccount).

## `oaIds` (type: `array`):

Numeric Official Account IDs (10-24 digits), equivalent to https://zalo.me/{oaId}.

## `slugs` (type: `array`):

Custom OA slug (path after zalo.me/).

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

Cap on delivered records.

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

Optional. Public OA landing pages normally need no proxy.

## Actor input object example

```json
{
  "maxItems": 100
}
```

# Actor output Schema

## `results` (type: `string`):

One record per public Official Account: oaId, slug, canonicalUrl, name, description, avatarUrl, qrCodeUrl, isVerified, category, categoryEn, tier, type, address, workingHours. Login-walled, not-found and error targets deliver free status records. Downloadable as JSON, JSONL, CSV, Excel, or HTML.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("red.cars/zalo-oa-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("red.cars/zalo-oa-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 '{}' |
apify call red.cars/zalo-oa-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,red.cars/zalo-oa-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/ntHTmVtMMCf6mdA1X/builds/LL8acDplrJkaydwp1/openapi.json
