# Top 30 Zimbabwean Influencers Scraper (`outspoken_strategy/top-zim-influencers-scraper`) Actor

Builds a combined top-30 list of Zimbabwean social media influencers, with name, profile picture and follower counts for YouTube, Facebook, Twitter/X and TikTok.

- **URL**: https://apify.com/outspoken\_strategy/top-zim-influencers-scraper.md
- **Developed by:** [code craker](https://apify.com/outspoken_strategy) (community)
- **Categories:** E-commerce, News, Social media
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $15.00 / 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.

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

## Top 30 Zimbabwean Influencers Scraper

An [Apify](https://apify.com) actor that produces **one combined top-30 ranking of Zimbabwean social media influencers**, sorted by their total followers across **YouTube, Facebook, Twitter/X and TikTok**. Each dataset row contains the influencer's name, profile picture, per-platform follower counts, and profile URLs.

### How it works

No site ranks Zimbabweans across all four platforms, so the actor works in three stages:

1. **Candidate pool** — starts from a curated seed list of ~40 well-known Zimbabwean public figures (`src/seeds.js`), merges in any `extraCandidates` from the actor input, and (optionally) auto-discovers more from public country rankings (StarNgage TikTok Zimbabwe, Social Blade YouTube Zimbabwe).
2. **Live enrichment** — for every candidate:
   - **YouTube**: scraped from the channel page, or fetched from the official (free) YouTube Data API if you provide `youtubeApiKey`.
   - **TikTok**: scraped from the profile page (use Apify **residential** proxies — TikTok blocks datacenter IPs).
   - **Twitter/X** and **Facebook**: these platforms block anonymous scraping, so counts come from one **batched call each** to an Apify Store actor (`apidojo/twitter-user-scraper`, `apify/facebook-pages-scraper`). This consumes Apify credits; disable via `useStoreActorsForTwitter` / `useStoreActorsForFacebook` if you'd rather have nulls.
3. **Ranking** — sums available follower counts per person, sorts descending, keeps the top `maxItems` (default 30), and pushes them to the default dataset.

### Output format

```json
{
  "rank": 1,
  "name": "Mufti Menk",
  "country": "Zimbabwe",
  "profilePicture": "https://yt3.googleusercontent.com/...",
  "totalFollowers": 6310000,
  "youtubeFollowers": 6310000,
  "facebookFollowers": 5400000,
  "twitterFollowers": 7800000,
  "tiktokFollowers": 2100000,
  "youtubeUrl": "https://www.youtube.com/@muftimenkofficial",
  "facebookUrl": "https://www.facebook.com/muftimenk",
  "twitterUrl": "https://x.com/muftimenk",
  "tiktokUrl": "https://www.tiktok.com/@muftimenkofficial",
  "platforms": { "youtube": { "...": "full per-platform detail incl. per-platform avatar" } },
  "scrapedAt": "2026-08-24T11:36:36.530Z"
}
```

The flat `*Followers` / `*Url` columns make CSV/Excel export clean; the nested `platforms` object carries full detail (per-platform avatars, matched display names).

### Running locally

```bash
npm install
npm start
```

Local input goes in `storage/key_value_stores/default/INPUT.json`. A cheap test run:

```json
{
  "maxCandidates": 6,
  "discoverFromRankings": false,
  "useStoreActorsForTwitter": false,
  "useStoreActorsForFacebook": false,
  "proxyConfiguration": { "useApifyProxy": false }
}
```

Note: locally without an Apify account/token, proxies and Store-actor calls are unavailable, so TikTok will often be blocked and Twitter/Facebook counts will be null. Full data requires running on the Apify platform (or locally with `APIFY_TOKEN` set).

### Deploying to Apify

```bash
npm install -g apify-cli
apify login
apify push
```

Then run it from the Apify Console. For fresh data on a schedule, add a Schedule in the Console (e.g. weekly) — the dataset from the latest run is always available via the Apify API as JSON, CSV, or Excel.

### Important caveats

- **The ranking is only as complete as the candidate pool.** Someone missing from the seed list and the discovery sources cannot appear. Verify and extend `src/seeds.js` (or pass `extraCandidates` in the input) — several seeded handles are best-effort guesses and unresolved ones are logged as warnings and skipped.
- **Nationality is curated, not detected.** Scrapers can't verify who is Zimbabwean; the seed list is the source of truth. Diaspora celebrities (Tinashe, Danai Gurira) are excluded unless `includeDiaspora` is true.
- **Twitter/Facebook data costs credits** via the Store actors; a run over ~40 candidates costs a small amount. With both disabled the actor is free to run but ranks on YouTube + TikTok only.
- **TikTok needs residential proxies** (`proxyConfiguration` with the RESIDENTIAL group) for reliable results.

# Actor input Schema

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

How many influencers to keep in the final combined ranking.

## `includeDiaspora` (type: `boolean`):

Include Zimbabwean-born celebrities based abroad (e.g. Tinashe, Danai Gurira). They usually dominate the ranking, so this is off by default.

## `discoverFromRankings` (type: `boolean`):

Scrape public country rankings (StarNgage TikTok Zimbabwe, Social Blade YouTube Zimbabwe) to add candidates beyond the built-in seed list. Best-effort: failures are logged and skipped.

## `extraCandidates` (type: `array`):

Additional influencers to consider. Each object: {"name": "...", "youtube": "handleOrChannelId", "tiktok": "handle", "twitter": "handle", "facebook": "pageSlug"}. Handles are without the @. Entries here override seed entries with the same name.

## `youtubeApiKey` (type: `string`):

If set, exact subscriber counts and avatars are fetched from the official (free) YouTube Data API instead of scraping channel pages.

## `useStoreActorsForTwitter` (type: `boolean`):

Twitter/X cannot be scraped anonymously, so follower counts are fetched by calling a Store actor (consumes Apify credits). If disabled, Twitter followers will be null and only the avatar (via unavatar.io) is included.

## `useStoreActorsForFacebook` (type: `boolean`):

Facebook pages cannot be scraped anonymously, so follower counts are fetched by calling apify/facebook-pages-scraper (consumes Apify credits). If disabled, Facebook followers will be null.

## `twitterScraperActorId` (type: `string`):

Store actor used to fetch Twitter/X profiles.

## `facebookScraperActorId` (type: `string`):

Store actor used to fetch Facebook pages.

## `maxCandidates` (type: `integer`):

Cap the candidate pool before enrichment. 0 = no cap. Useful for cheap test runs.

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

Proxies used for scraping YouTube/TikTok pages and ranking sites. Apify residential proxies strongly recommended for TikTok.

## Actor input object example

```json
{
  "maxItems": 30,
  "includeDiaspora": false,
  "discoverFromRankings": true,
  "extraCandidates": [],
  "useStoreActorsForTwitter": true,
  "useStoreActorsForFacebook": true,
  "twitterScraperActorId": "apidojo/twitter-user-scraper",
  "facebookScraperActorId": "apify/facebook-pages-scraper",
  "maxCandidates": 0,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `influencers` (type: `string`):

The combined top list — one item per influencer with name, profile picture and per-platform follower counts.

## `summary` (type: `string`):

Summary record with counts and the top 3 influencers.

# 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("outspoken_strategy/top-zim-influencers-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("outspoken_strategy/top-zim-influencers-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 outspoken_strategy/top-zim-influencers-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,outspoken_strategy/top-zim-influencers-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/s7cxJJzpnc5jIrqK3/builds/YyMeBq0Cpf7jfJ3O9/openapi.json
