# Instagram Following Scraper | $0.5/1K on Starter (`publicsignallabs/instagram-following`) Actor

Extract accounts followed by public Instagram profiles across resumable paid runs for $0.50 per 1,000 rows on Starter, with lower Scale and Business rates. No login, cookies, browser, or proxy setup. Export to JSON, CSV, or Excel.

- **URL**: https://apify.com/publicsignallabs/instagram-following.md
- **Developed by:** [Public Signal Labs](https://apify.com/publicsignallabs) (community)
- **Categories:** Social media, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.45 / 1,000 following accounts

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## Instagram Following Scraper | $0.5/1K on Starter

Extract accounts followed by public Instagram profiles across resumable paid runs for $0.50 per 1,000 rows on Starter, with lower Scale and Business rates. No login, cookies, browser, or proxy setup. Export to JSON, CSV, or Excel.

### What this Actor does

- Accepts one or more public Instagram account handles
- Extracts followed-account records across resumable paid runs, with up to 20,000 per account in each run
- Returns structured rows ready for JSON, CSV, Excel, XML, or API workflows
- Works without Instagram login credentials, cookies, session IDs, browsers, or proxy configuration
- Returns a continuation token after each unfinished paid extraction so you can resume from the latest checkpoint

Use it for public account research, creator discovery, competitor following analysis, and repeatable data pipelines.

### Quick start

1. Enter one or more plain Instagram handles without `@` or profile URLs.
2. Choose the maximum number of followed accounts to return per source account.
3. Run the Actor, then open or export the default dataset.

```json
{
  "Account": ["mrbeast"],
  "resultsLimit": 200
}
```

### Input

| Field | Rules |
| --- | --- |
| `Account` | Required list of plain Instagram handles. Do not include `@`, profile URLs, or numeric IDs. Paying users may submit multiple unique accounts; FREE users may submit exactly one. |
| `resultsLimit` | Required integer per account from 25 through 20,000 for each run. The default and Store prefill are 200. Paid extractions can continue across runs; FREE runs are capped at 1,000. |
| `continuationToken` | Optional short-lived secret token returned by a previous paid run. Requires exactly one `Account` matching the account bound into the token. Use it to continue that extraction from its latest checkpoint, including large exports split across multiple runs. |

### Dataset rows

Every charged dataset item has exactly this shape:

```json
{
  "username_scrape": "mrbeast",
  "id": "123456789",
  "full_name": "Example Person",
  "is_private": false,
  "is_verified": false,
  "profile_pic_url": "https://...",
  "username": "example_person"
}
```

| Field | Meaning |
| --- | --- |
| `profile_pic_url` | External profile-picture URL; it may expire |
| `username` | Instagram handle of an account followed by the source account |
| `id` | Instagram user ID of an account followed by the source account, always represented as a string |
| `full_name` | Public display name of an account followed by the source account |
| `is_private` | Whether the followed account is private |
| `is_verified` | Whether the followed account is verified |
| `username_scrape` | Source account whose following list was requested |

The default dataset contains followed-account rows only. Following-list ordering is controlled by Instagram and may change between runs. Profile-picture URLs are external and can expire.

### Run summary

Run status, source failures, counts, and continuation tokens are stored in the default key-value store's `OUTPUT` record rather than mixed into the dataset:

```json
{
  "status": "SUCCEEDED",
  "isPaying": true,
  "requestedAccounts": 1,
  "resultsLimitPerAccount": 200,
  "deliveredCount": 200,
  "chargedCount": 200,
  "sources": [
    {
      "inputIndex": 0,
      "account": "mrbeast",
      "status": "succeeded",
      "deliveredCount": 200,
      "chargedCount": 200
    }
  ],
  "continuations": [
    {
      "inputIndex": 0,
      "account": "mrbeast",
      "hasNextPage": true,
      "nextContinuationToken": "<secret token for a paid continuation>"
    }
  ]
}
```

`status` can be `SUCCEEDED`, `PARTIAL`, `FAILED`, or `CHARGE_LIMIT_REACHED`. Inspect each source entry even when the run itself completes. A non-PII run and charging summary is stored separately as `AUDIT`.

### Resumable paid exports with continuation tokens

Paid exports can continue across resumable runs until the source list ends. Each run can request up to 20,000 followed accounts per source account. To continue the extraction, read `nextContinuationToken` from the account's entry in `OUTPUT.continuations`, then start a new run with the same single handle.

Use a continuation token whenever you want to resume after a selected batch or spending-limit stop. For large exports, use batches of about 1,000 rows and pass the newest token into each subsequent run. Smaller checkpoints reduce the amount of work that may need to be retried if a run is interrupted.

```json
{
  "Account": ["mrbeast"],
  "resultsLimit": 1000,
  "continuationToken": "<token from OUTPUT>"
}
```

A continuation may require the current page to be processed again when the prior segment stopped partway through that page. Already delivered rows are skipped and not charged twice.

### FREE boundary

FREE runs are limited to one account and an effective maximum of 1,000 results. They cannot submit or receive continuation tokens. These checks run before extraction begins. The public schema keeps the 20,000 maximum so paying users can request larger segments.

### Limitations

This Actor:

- Reads following lists from public Instagram accounts only
- Does not bypass private-account access controls
- Does not enrich followed-account records with emails, phone numbers, posts, or engagement metrics
- Cannot guarantee following-list order or stable profile-picture URLs
- May return fewer rows when Instagram reports no more followed accounts or when a run reaches its spending limit

### API and CLI use

Call the Actor through the standard Apify Actor Runs API. Read followed-account data from the run's default dataset and reconciliation metadata from the `OUTPUT` and `AUDIT` key-value-store records. Dataset rows are the billable unit.

With the current Apify CLI:

```bash
apify actors call publicsignallabs/instagram-following \
  --input '{"Account":["mrbeast"],"resultsLimit":200}' \
  --output-dataset
```

The same Actor can be called with the Apify JavaScript or Python clients, REST API, schedules, webhooks, and platform integrations.

### Responsible use

Only collect and use public data where you have a lawful purpose. Respect privacy, platform rules, and applicable data-protection law. Minimize retained personal data, secure exported datasets, and delete records when they are no longer needed.

This Actor is unofficial and is not affiliated with or endorsed by Instagram or Meta.

### FAQ

#### Does it require an Instagram account?

No. The Actor does not require Instagram login credentials, cookies, or a session ID.

#### Do I need to configure proxies or manage blocked sessions?

No. The Actor exposes no proxy, cookie, browser, or session configuration. It handles temporary failures with bounded retries and reports each source outcome in `OUTPUT`.

#### Can paid following-list exports be resumed?

Yes. Paid exports can continue across resumable runs until the source list ends. Request up to 20,000 followed accounts in each run, then pass the returned `nextContinuationToken` into a new run for the same single account. For large exports, batches of about 1,000 rows are recommended so progress is checkpointed frequently. Always use the newest token returned by the previous run.

#### Can it extract a following list from a private source account?

No. It works with following lists available from public source accounts and does not bypass access controls.

#### Can one run process multiple accounts?

Yes for paying users. FREE runs accept exactly one source account.

#### How do I export the results?

Open the run's default dataset in Apify Console and choose JSON, CSV, Excel, XML, or another supported dataset export format. Programmatic workflows can read the same dataset through the API.

### Support

Use the **Issues** tab on this Actor's Apify Store page. Include the run ID, expected result, and observed result. Never include continuation tokens, API tokens, cookies, or other credentials.

# Actor input Schema

## `Account` (type: `array`):

Plain Instagram handles only, without @, profile URLs, or numeric IDs. Paying users may enter multiple accounts; FREE users may enter exactly one.

## `resultsLimit` (type: `integer`):

Accounts followed by each source account and returned in this run. Range: 25–20,000 for paying users. Use a continuationToken to resume the extraction across runs. FREE runs are capped at 1,000 even when a larger value is submitted.

## `continuationToken` (type: `string`):

Optional short-lived token from an earlier paid run. Use it with the same single Account to continue the extraction from its latest checkpoint, including large exports split across multiple runs. Not available on FREE. For large exports, batches of about 1,000 are recommended.

## Actor input object example

```json
{
  "Account": [
    "mrbeast"
  ],
  "resultsLimit": 200
}
```

# Actor output Schema

## `following` (type: `string`):

Charged followed-account rows from the default dataset, ready for preview or export.

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

Run status, delivered and charged counts, source outcomes, and continuation tokens.

## `audit` (type: `string`):

Non-PII aggregate request, retry, row, duplicate, and charge reconciliation metrics.

# 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 = {
    "Account": [
        "mrbeast"
    ],
    "resultsLimit": 200
};

// Run the Actor and wait for it to finish
const run = await client.actor("publicsignallabs/instagram-following").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 = {
    "Account": ["mrbeast"],
    "resultsLimit": 200,
}

# Run the Actor and wait for it to finish
run = client.actor("publicsignallabs/instagram-following").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 '{
  "Account": [
    "mrbeast"
  ],
  "resultsLimit": 200
}' |
apify call publicsignallabs/instagram-following --silent --output-dataset

```

## MCP server setup

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

```

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/9YxFJAMOG2esJNWcD/builds/Kem7MPRQKJsnvZjhG/openapi.json
