# Instagram Likes Scraper (`fetch_cat/instagram-likes-scraper`) Actor

Export visible public Instagram post liker rows for audience research, influencer vetting, and campaign-overlap analysis.

- **URL**: https://apify.com/fetch\_cat/instagram-likes-scraper.md
- **Developed by:** [Hanna Nosova](https://apify.com/fetch_cat) (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

from $0.78 / 1,000 visible liker rows

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 Likes Scraper

Export **visible public liker rows** from public Instagram posts and Reels for audience research, influencer vetting, and campaign-overlap analysis.

### What it exports

Each saved row is bound to the post you supplied and includes the visible profile ID, handle, display name, public profile state, profile image reference, source post ID/URL, public total-like count when exposed, page number, scrape time, and a visibility diagnostic.

```json
{
  "postUrls": ["https://www.instagram.com/p/DLm63qQpxvw/"],
  "maxLikesPerPost": 10,
  "failOnPrivateOrBlocked": false
}
```

### Input recipes

**Quick anonymous check** — use one public post and a small limit first:

```json
{"postUrls":["https://www.instagram.com/p/DLm63qQpxvw/"],"maxLikesPerPost":10}
```

**Batch overlap research** — submit several public post URLs and join saved rows by `source_post_id` and `id`.

### Optional access fallback

The actor tries the public logged-out page first, then uses the managed browser route for the visible Likes modal. Cloud runs use residential Apify Proxy by default for that managed route because Instagram frequently limits datacenter traffic. An operator-managed session is used at runtime when available. If it is unavailable or challenged, you may optionally supply `sessionCookie` as a secret input; it takes precedence for that run.

- A supplied cookie is used only in memory and is never logged, persisted, included in `SUMMARY`, or emitted in dataset rows. It may expire.
- Use it only for content you are authorized to access.
- Do not provide passwords, browser storage state, private-account credentials, or cookies belonging to anyone else.
- A session cookie does not make private media supported. Private/unavailable media remains out of scope.

### Input settings

| Input | Description |
|---|---|
| `postUrls` | One or more direct public `instagram.com/p/`, `instagram.com/reel/`, or `instagram.com/tv/` URLs. |
| `maxLikesPerPost` | Maximum target-bound visible liker rows to save per URL (1–1,000). |
| `sessionCookie` | Optional secret session-cookie fallback for public-media access; used in memory only and never logged or stored. |
| `proxyConfiguration` | Optional proxy override. Residential Apify Proxy is the cloud default for the managed browser route. |
| `includeProfileDetails` | Reserved for a future verified public detail route; it does not currently add fields. |
| `failOnPrivateOrBlocked` | Stop immediately rather than record a diagnostic when a URL is private or blocked. |

### Output fields

| Field | Meaning |
|---|---|
| `id`, `username`, `full_name` | Visible liker identity fields. |
| `is_private`, `is_verified` | Visible profile state. |
| `profile_pic_url`, `profile_pic_id` | Visible profile-image reference when exposed. |
| `is_new`, `latest_reel_media`, `latest_reel_media_utc` | Source activity fields when exposed in the visible liker response. |
| `liked_post`, `post_url`, `source_post_id` | Target post provenance for overlap analysis. |
| `total_likes` | Public total count when Instagram exposes it. |
| `page`, `scraped_at`, `visibility_status` | Page provenance, UTC scrape time, and `visible` or `partial_visible` diagnostic. |

### Pricing and limits

Pricing is based on the number of target-bound visible liker rows saved. See the actor’s **Pricing** tab for current rates. No result-row charge is made when Instagram exposes no target-bound liker rows.

### Limits and tips

Instagram can hide liker lists, show only a recent slice for high-engagement media, or require a sign-in session. This actor exports only rows actually exposed by the selected route. It never fabricates unavailable likes; private, blocked, and empty cases are recorded in the `SUMMARY` key-value record rather than as fake dataset rows.

Start with a small limit, review `visibility_status`, and use `source_post_id` plus `id` to compare audiences across posts.

### API and MCP

Run with the Apify API using actor `annamiy/instagram-likes-scraper` and the JSON input above. In Apify MCP, enable `?tools=annamiy/instagram-likes-scraper` and pass the same input keys.

### FAQ

**Why did I get no rows?** Instagram did not expose a target-bound visible liker list for that public post to the selected route. Check the run `SUMMARY`; a managed runtime session or optional secret fallback can still expire or be challenged.

**Does it export followers, DMs, or private likes?** No. It is limited to visible liker rows on public media.

### Related Actors

- [Instagram Post Details Scraper](https://apify.com/annamiy/instagram-post-details-scraper)
- [Instagram Profile Posts Scraper](https://apify.com/annamiy/instagram-profile-posts-scraper)
- [Instagram Reel Scraper](https://apify.com/annamiy/instagram-reel-scraper)
- [Instagram Mentions Scraper](https://apify.com/annamiy/instagram-mentions-scraper)
- [Instagram Creator Email Finder](https://apify.com/annamiy/instagram-creator-email-finder)

### Support

For reproducible issues, include the public post URL, selected limit, and the non-sensitive `SUMMARY` result. Never include a session cookie in a support message.

# Actor input Schema

## `postUrls` (type: `array`):

Paste one or more direct public Instagram post or Reel URLs. Private or unavailable media is reported in the run summary.

## `maxLikesPerPost` (type: `integer`):

Maximum target-bound visible liker rows to export for each source post.

## `sessionCookie` (type: `string`):

Optional fallback for a public-media run when the managed session is unavailable or challenged. Used only in memory and never saved, logged, or emitted.

## `includeProfileDetails` (type: `boolean`):

Reserved for a verified anonymous public profile route. The current visible-like route exports only the fields shown in the output schema.

## `failOnPrivateOrBlocked` (type: `boolean`):

Stop the run if Instagram does not make a requested public media URL available to the visible-like route.

## Actor input object example

```json
{
  "postUrls": [
    "https://www.instagram.com/p/DLm63qQpxvw/"
  ],
  "maxLikesPerPost": 10,
  "includeProfileDetails": false,
  "failOnPrivateOrBlocked": false
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

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

No description

# 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 = {
    "postUrls": [
        "https://www.instagram.com/p/DLm63qQpxvw/"
    ],
    "maxLikesPerPost": 10,
    "includeProfileDetails": false,
    "failOnPrivateOrBlocked": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("fetch_cat/instagram-likes-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 = {
    "postUrls": ["https://www.instagram.com/p/DLm63qQpxvw/"],
    "maxLikesPerPost": 10,
    "includeProfileDetails": False,
    "failOnPrivateOrBlocked": False,
}

# Run the Actor and wait for it to finish
run = client.actor("fetch_cat/instagram-likes-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 '{
  "postUrls": [
    "https://www.instagram.com/p/DLm63qQpxvw/"
  ],
  "maxLikesPerPost": 10,
  "includeProfileDetails": false,
  "failOnPrivateOrBlocked": false
}' |
apify call fetch_cat/instagram-likes-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,fetch_cat/instagram-likes-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/qpi147laCCxiNC1hE/builds/uR9FMjSCs00WT8YpO/openapi.json
