DEV Community

KazKN
KazKN

Posted on

How to Export Zalo Group Members to CSV or Excel

Copying a Zalo group roster by hand looks manageable until you have more than
one group. Then the workflow becomes scrolling, opening profiles, copying names,
removing duplicates, and trying to remember which row came from which group.

This guide shows a reproducible way to export the members your own Zalo account
can see in joined groups. The result is a structured Dataset you can download as
CSV, Excel, or JSON.

Disclosure: I built the Zalo Data Exporter used below. If you sign up or
run the Actor through links in this article, I may earn revenue from Apify at
no additional cost to you.

What the export does — and does not do

The Actor authenticates your own account with a temporary Zalo QR. It is a
read-only exporter, not an anonymous people finder.

It can return:

  • groups the connected account has joined;
  • members visible inside those groups;
  • linked profile fields Zalo exposes to that account;
  • separate Dataset views for groups, members, and profiles.

It does not discover hidden groups, invisible members, deleted messages, or a
public phone-number database.

The data model

Record type Useful fields
group groupId, name, visible member count
groupMember groupId, userId, display name, stable record key
profile Zalo user ID, display name, Zalo name, avatar URL, relationship

Keeping membership and profile rows separate matters. A person can belong to
multiple groups without requiring duplicate profile objects.

Step-by-step: export one group first

1. Open the Actor

Open Zalo Data Exporter on Apify
and keep the 👥 Group roster preset.

The public input uses outcome presets instead of low-level scopes. You do not
need to provide Zalo cookies, an IMEI, a proxy, or a session passphrase.

2. Use conservative starter limits

Start with one group and 100 members:

{
  "exportMode": "groupRoster",
  "accountAlias": "main",
  "maxGroups": 1,
  "maxMembersPerGroup": 100
}
Enter fullscreen mode Exit fullscreen mode

This is large enough to verify the output while keeping runtime and maximum
charge easy to understand. Increase only the limit that your use case needs.

3. Scan the temporary QR

On the first connection:

  1. Click Start.
  2. Open the run's Output tab.
  3. Open ① First run: scan this Zalo QR.
  4. Scan and approve it in the Zalo mobile app.
  5. Keep the run open until the Dataset appears.

The QR expires quickly. If the run reports QR_EXPIRED, start a new run and
scan the newly generated code. Later runs can reuse the encrypted session saved
under the same accountAlias.

4. Inspect focused views

Check Groups first to confirm the source. Then open Group members and,
when needed, Contacts and profiles. Focused views make the spreadsheet easier
to validate before download.

5. Export the result

  • CSV is convenient for database and CRM imports.
  • Excel is useful for filtering and manual review.
  • JSON preserves the record structure for code and APIs.

Run the same export with Python

Complete the interactive QR connection once in the Apify Console. Then reuse
the saved session programmatically:

import os
from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_API_TOKEN"])

run = client.actor("kazkn/zalo-member-profile-exporter").call(run_input={
    "exportMode": "groupRoster",
    "accountAlias": "main",
    "maxGroups": 1,
    "maxMembersPerGroup": 100,
})

items = client.dataset(run["defaultDatasetId"]).list_items().items
members = [item for item in items if item.get("recordType") == "groupMember"]

print(f"Exported {len(members)} visible group-member rows")
Enter fullscreen mode Exit fullscreen mode

Load the token from APIFY_API_TOKEN; never paste it into source code or an AI
prompt.

Export a specific joined group

If you need one group, make a small discovery run first and copy its ID from the
Groups view. Then provide it in the advanced groupIds field:

{
  "exportMode": "groupRoster",
  "groupIds": ["joined-group-id-from-your-dataset"],
  "maxMembersPerGroup": 500
}
Enter fullscreen mode Exit fullscreen mode

Only use IDs returned for the connected account. An inaccessible or incorrect
ID cannot produce a roster.

Pricing and limits

Zalo Data Exporter uses pay-per-event pricing. The start event and each saved
profile, group, group-member, conversation, or message record have separate
prices. Apify displays the maximum possible charge before the run.

The exact cost depends on your Apify subscription and the visible records
delivered. Small starter limits are useful for both validation and cost control.

Common failures

The QR expired

Start a new run and scan the new QR immediately. An expired image cannot be
reused.

The saved login no longer works

Enable Refresh this saved login for that same account and scan a new QR. Use
a new accountAlias for a different Zalo account.

The Dataset is smaller than the group UI

The exporter can only save members Zalo exposes to the connected account and
within your run limits. Treat the Dataset as visible-account data, not a claim
of universal group completeness.

FAQ

Can I export Zalo group members without coding?

Yes. Choose Group roster, scan the first-run QR, and download the focused
Dataset view as CSV or Excel.

Do I need to scan a QR every time?

Not normally. The first connection is interactive; later runs can reuse the
encrypted saved session until Zalo invalidates or challenges it.

Does the export include phone numbers?

Only fields Zalo makes visible to the connected account can be returned. The
Actor does not provide or infer a phone-number database.

Try the bounded workflow

Watch the six-minute video above, then repeat it with one group and 100 members.
Validate the three focused views before increasing the limits.

👉 Export visible Zalo group members on Apify


Apify links in this article support the Actor's developer. Results depend on
the connected account's visibility and configured limits.

Top comments (0)