# Instagram Likes Scraper (`maximedupre/scrape-instagram-likes`) Actor

Collect accounts that liked a public Instagram post. Get each liker's handle, profile signals, and source-post context in structured dataset rows. No Instagram login or cookies are required.

- **URL**: https://apify.com/maximedupre/scrape-instagram-likes.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Social media, Marketing, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.35 / 1,000 liker accounts

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### ❤️ Find who liked a public Instagram post

For social media researchers, marketers, and developers, this Actor finds the Instagram accounts that liked a public post. It returns each liker's ID, handle, profile status, profile image URL, optional recent activity, and source-post context in structured dataset rows. Use the rows to review who engaged with a post and keep the post and liker details together for research.

- Find the accounts that liked a public post with **[Scrape Instagram Likes](https://apify.com/maximedupre/scrape-instagram-likes/examples/scrape-instagram-likes)**.
- Review the likers from a known post with **[Instagram Post Likes](https://apify.com/maximedupre/scrape-instagram-likes/examples/instagram-post-likes)**.
- Build a liker list from a post URL with **[Instagram Like Scraper](https://apify.com/maximedupre/scrape-instagram-likes/examples/instagram-like-scraper)**.
- Inspect liker profiles and source-post details with **[Instagram Likers](https://apify.com/maximedupre/scrape-instagram-likes/examples/instagram-likers)**.
- Start a structured audience review from post likes with **[Instagram Likes Scraper](https://apify.com/maximedupre/scrape-instagram-likes/examples/instagram-likes-scraper)**.

#### 👥 Liker and source-post data

**What it returns**

Each saved dataset row connects one discovered liker to the public Instagram post that produced it. A row can include the liker's stable ID, handle, display name, verification and privacy flags, profile image URL, recent activity, and source-post details such as media type, owner, caption, dates, media links, and counts. Optional values appear when Instagram exposes them.

**Dataset access**

The run output links to the default dataset overview. Open the rows in Apify or retrieve them through the Apify API.

#### ▶️ Run the Instagram likes scraper

**Run steps**

1. Add one or more public Instagram post URL objects to `postUrls`.
2. Set `maxItems` if you want a stop limit for the total liker results across the submitted posts.
3. Leave `maxItems` empty to return all available results until the public source data is exhausted.
4. Start the run and open the results link in the run output.

Only publicly accessible posts are in scope. The Actor does not need your Instagram login or cookies.

#### ⚙️ Input

**Input fields**

| Field | Type | What it does |
| --- | --- | --- |
| `postUrls` | array of objects | Required. Add one or more public Instagram post URL objects. Private posts and posts that are not publicly accessible are not supported. |
| `postUrls[].url` | string | Required inside each item. The public Instagram post URL to process. |
| `maxItems` | integer | Optional stop limit for the total number of liker results across all submitted posts. Leave it empty to return all available results until the public source data is exhausted. |

**Successful default input**

This is the public input from a successful current-beta run with the default input.

```json
{
  "postUrls": [
    {
      "url": "https://www.instagram.com/p/CmUv48DLvxd/"
    }
  ],
  "maxItems": 1
}
```

#### 🧾 Output

**Output link**

| Field | Type | What it does |
| --- | --- | --- |
| `results` | URL string | Opens the collected liker profiles and source post details in the default dataset overview. |

**Dataset rows**

All saved rows use the same shape. Required fields are marked in the descriptions. Optional fields appear when the public source provides them.

| Field | Type | What it does |
| --- | --- | --- |
| `liker` | object | Required. Details about the Instagram account that liked the source post. |
| `liker.id` | string | Required. Stable public identifier of the liker account. |
| `liker.handle` | string | Required. Public Instagram handle of the liker account. |
| `liker.displayName` | string | Public display name shown for the liker account when available. |
| `liker.isVerified` | boolean | Required. Whether Instagram marks the liker account as verified. |
| `liker.isPrivate` | boolean | Required. Whether Instagram marks the liker account as private. |
| `liker.profileImageUrl` | URL string | Direct public URL of the liker account profile image when available. |
| `liker.recentActivity` | object | Public recent activity signal when Instagram exposes one. |
| `liker.recentActivity.latestPostUrl` | URL string | Public URL of the latest post found for the liker account. |
| `liker.recentActivity.latestPostPublishedAt` | ISO date-time string | Publish time of the latest public post found for the liker account. |
| `sourcePost` | object | Required. The public Instagram post that produced this liker row. |
| `sourcePost.id` | string | Required. Stable identifier of the source post. |
| `sourcePost.url` | URL string | Required. Normalized public URL of the source post. |
| `sourcePost.mediaType` | string | Required. Media type reported for the source post. |
| `sourcePost.owner` | object | Public identity details for the account that owns the source post when available. |
| `sourcePost.owner.id` | string | Stable public identifier of the source post owner. |
| `sourcePost.owner.handle` | string | Public Instagram handle of the source post owner. |
| `sourcePost.owner.displayName` | string | Public display name of the source post owner. |
| `sourcePost.caption` | string | Caption published with the source post when available. |
| `sourcePost.publishedAt` | ISO date-time string | Publish time of the source post when available. |
| `sourcePost.mediaUrls` | array of URL strings | Direct public URLs for the media in the source post. |
| `sourcePost.likeCount` | integer | Number of likes reported for the source post when available. |
| `sourcePost.commentCount` | integer | Number of comments reported for the source post when available. |

**Genuine current-beta row**

This shortened row is a real row from a successful current-beta run. The JSON string `"..."` stands for the omitted media URL array in `sourcePost.mediaUrls`, so the example stays short while the field table remains complete.

```json
{
  "liker": {
    "id": "49513074959",
    "handle": "hiten.fillms",
    "displayName": "HITEN",
    "isVerified": false,
    "isPrivate": false,
    "profileImageUrl": "https://scontent-lga3-3.cdninstagram.com/v/t51.82787-19/784617586_18073215194650960_3403044751659969413_n.jpg?stp=dst-jpg_s150x150_tt6&efg=eyJ2ZW5jb2RlX3RhZyI6InByb2ZpbGVfcGljLmRqYW5nby4xMDgwLmMyIn0&_nc_ht=scontent-lga3-3.cdninstagram.com&_nc_cat=104&_nc_oc=Q6cZ2gFZ5gGUPOphC1SJ5d6Seuu9ICEopyov8IuwQcouUi0X-p4h9DjbdXASK7bJkYJnrFM&_nc_ohc=o8vb927qJ2cQ7kNvwEw1s6T&_nc_gid=fuAPR-U-lDtOtUA_e7JzKQ&edm=APs17CUBAAAA&ccb=7-5&oh=00_AQLDEq-t2oSuae-zuUj5OXenCgIfpi5Sl2uvdgl78T52Cw&oe=6AB65BB5&_nc_sid=10d13b",
    "recentActivity": {
      "latestPostUrl": "https://www.instagram.com/p/DdbmOLHNjmv/",
      "latestPostPublishedAt": "2026-09-18T14:00:20.000Z"
    }
  },
  "sourcePost": {
    "id": "3629852871325507475",
    "url": "https://www.instagram.com/reel/DJf0_RmSd-T/",
    "mediaType": "VIDEO",
    "owner": {
      "id": "17841403571689310",
      "handle": "insta360",
      "displayName": "Insta360"
    },
    "mediaUrls": "...",
    "caption": "Every laugh, every tear, every moment. Capture it all with Insta360 GO 3S!\n\nWho’s getting one for Mother‘s Day? 😏\n\n📸 mengmengya with Insta360 GO 3S\n\n#Insta360 #Insta360GO3S #mothersday #toddler #videography #happymothersday❤️",
    "publishedAt": "2025-05-11T03:00:03.000Z",
    "likeCount": 41848259,
    "commentCount": 181996
  }
}
```

#### 💳 Pricing

This Actor uses pay-per-event pricing. Each `Liker account` event covers one account saved to the dataset. Your total depends on the number of saved accounts and the price shown before you run.

#### 🔌 Integrations

Open the results in Apify or retrieve the saved rows through the Apify API.

https://www.youtube.com/watch?v=bNACk1\_S\_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

#### ❓ FAQ

##### What does leaving `maxItems` empty do?

It returns all available liker results until the public source data is exhausted. Set a positive value when you want to stop after a smaller total.

##### Can it read private Instagram posts?

No. The Actor works with publicly accessible posts. A liker may have a private account, and the row can show that privacy status, but private profile data is not provided.

##### What does one dataset row contain?

Each row connects a liker account to the public source post. It can include identity and profile signals for the liker plus the source post owner, media, caption, dates, and available engagement counts.

##### Why might an optional field be missing?

Instagram does not expose every field for every account or post. Optional fields are included only when the public source provides them.

##### How do I use the results in code?

Open the `results` link in the run output to view the default dataset, or retrieve the dataset rows through the Apify API.

### 📝 Changelog

**v0.0** (21-09-2026)

- Initial release.

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~scrape-instagram-likes/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- [Instagram Post & Reel Content Scraper](https://apify.com/maximedupre/instagram-post-content-scraper): Collect public posts and Reels with captions, engagement counts, and media context before comparing liker data.
- [Instagram Reels Comments Scraper](https://apify.com/maximedupre/instagram-reels-comments-scraper): Review top-level comments from a known public Reel alongside its liker rows.
- [Instagram Profile Stats Scraper](https://apify.com/maximedupre/instagram-profile-stats-scraper): Check public follower, following, and post counts for accounts found among the likers.
- [Instagram Related Users Scraper](https://apify.com/maximedupre/instagram-related-users-scraper): Explore public accounts related to a known profile after reviewing a liker.
- [Instagram Hashtag Username Scraper](https://apify.com/maximedupre/instagram-hashtag-username-scraper): Find public hashtag posts and their authors for wider context around an Instagram topic.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

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

Add one or more public Instagram post URLs. Private posts and posts that are not publicly accessible are not supported.

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

Optional stop limit for the total number of liker results across all submitted posts. Leave it empty to return all available results until the public source data is exhausted.

## Actor input object example

```json
{
  "postUrls": [
    {
      "url": "https://www.instagram.com/p/CmUv48DLvxd/"
    }
  ],
  "maxItems": 1
}
```

# Actor output Schema

## `results` (type: `string`):

Open the collected liker profiles and source post details.

# 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": [
        {
            "url": "https://www.instagram.com/p/CmUv48DLvxd/"
        }
    ],
    "maxItems": 1
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/scrape-instagram-likes").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": [{ "url": "https://www.instagram.com/p/CmUv48DLvxd/" }],
    "maxItems": 1,
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/scrape-instagram-likes").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": [
    {
      "url": "https://www.instagram.com/p/CmUv48DLvxd/"
    }
  ],
  "maxItems": 1
}' |
apify call maximedupre/scrape-instagram-likes --silent --output-dataset

```

## MCP server setup

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

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/GRJbJb22kvHcVqbl1/builds/mWE9bRrSxMJLjfwfU/openapi.json
