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
}
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:
- Click Start.
- Open the run's Output tab.
- Open ① First run: scan this Zalo QR.
- Scan and approve it in the Zalo mobile app.
- 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")
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
}
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)