# Instagram Reposts Scraper · What an Account Reshares (`memo23/instagram-reposts-scraper`) Actor

Every post an Instagram account has reshared to its profile, with the ORIGINAL author attached. Shows who an account amplifies and how far each post had already travelled. No login. Cursor-paginated, deduplicated, with a per-account cap.

- **URL**: https://apify.com/memo23/instagram-reposts-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Social media, AI, Automation
- **Stats:** 16 total users, 15 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.10 / 1,000 reshared posts

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

<img src="https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/instagram-reposts-logo.png" alt="Instagram Reposts Scraper logo" width="96" align="right">

Every post an Instagram account has reshared to its profile, with the **original author attached**. It answers a question a normal post scraper cannot: not what an account publishes, but what it amplifies, and whose work it picked up.

No login, no cookies, no browser.

### Why Use This Scraper?

- **The original author, not a copy.** Each row describes the post as its creator made it. `repostedBy` is the account you asked about; every other field belongs to whoever actually posted it.
- **Reach before the reshare.** `repostCount` is Instagram's own total of how many accounts have reshared that post, so you can see whether an account is spotting things early or amplifying what is already everywhere.
- **Partner and creator discovery.** The accounts a brand reshares are its ambassadors, its stockists, and the creators it already has a relationship with.
- **An account that never reshares says so.** Resharing is opt-in behaviour and plenty of accounts never do it. That returns a clean, complete run rather than a failure.

### How It Works

![How the Instagram Reposts Scraper works](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-instagram-reposts.png)

1. Each handle is normalised — bare names, `@handles` and profile URLs all work — and deduplicated.
2. One lookup resolves the handle to its numeric account id.
3. The reshare feed is walked page by page with a cursor, deduplicated by post id, until the cap or the end of the feed.

Private accounts are reported as such rather than attempted: Instagram does not serve their reshares publicly.

### Input

| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| `usernames` | array | Yes | — | Accounts whose reshares you want. Handles, @handles or profile URLs. |
| `maxRepostsPerUser` | integer | No | unlimited | Cap on reshared posts per account. |

#### Example input

```json
{
    "usernames": ["9gag", "@natgeo", "https://www.instagram.com/instagram/"],
    "maxRepostsPerUser": 50
}
```

### Output

One row per reshared post:

```json
{
    "repostedBy": "natgeo",
    "repostedByUserId": "787132",
    "postUrl": "https://www.instagram.com/reel/DcuGp5OClAQ/",
    "shortCode": "DcuGp5OClAQ",
    "postId": "3976187338433532695",
    "postType": "reel",
    "takenAt": "2026-08-26T14:02:11.000Z",
    "caption": "…",
    "likeCount": 226691,
    "commentCount": 903,
    "playCount": 4120553,
    "repostCount": 4116,
    "imageUrl": "https://scontent.cdninstagram.com/...",
    "videoUrl": "https://scontent.cdninstagram.com/...",
    "originalAuthor": "lorisamuelsmom",
    "originalAuthorId": "1674267312",
    "originalAuthorFullName": "Lori Samuels",
    "originalAuthorIsVerified": false,
    "originalAuthorUrl": "https://www.instagram.com/lorisamuelsmom/",
    "scrapedAt": "2026-09-03T21:10:00.000Z"
}
```

#### Key fields

| Field | What it is |
|---|---|
| `repostedBy` | The account you asked about — the one doing the resharing. |
| `originalAuthor` | The account that made the post. Often a much smaller creator than the one resharing. |
| `repostCount` | Instagram's own count of how many accounts have reshared this post in total. |
| `postType` | `photo`, `video`, `carousel` or `reel`. |

#### Error rows

An account the run could not answer for comes back as `{ repostedBy, error, message }` and is never charged:

| `error` | Meaning |
|---|---|
| `invalid_username` | The input is not a handle or a profile URL. |
| `user_not_found` | Instagram has no public account with that handle. |
| `private_account` | The account is private; Instagram does not serve its reshares publicly. |

### Pricing

Pay per event. Accounts that do not exist, are private, or have never reshared anything are never charged.

| Event | When it fires | Free tier | Diamond tier |
|---|---|---|---|
| Reshared post | One reshared post delivered | $0.003 | $0.0021 |
| Actor start | Once per run, per GB of memory | $0.005 | $0.005 |

A 1,000-post run costs about $3 on the free tier and $2.10 at Diamond.

### What Makes This Richer Than the Competition

| Capability | Other repost scrapers | This actor |
|---|---|---|
| The reshared posts | Yes | Yes |
| Original author's handle and id | Partial | Always, with full name and verified flag |
| Instagram's own total reshare count | No | `repostCount` on every row |
| Post type told apart | Partial | `photo`, `video`, `carousel`, `reel` |
| Timestamps on this feed | Often null | Read from the field Instagram actually uses here |
| Private accounts | Silent empty result | Named error row |
| Price per post | $0.007 | $0.003 |

The timestamp point is not a detail. This feed leaves the ordinary `taken_at` null and puts the real value elsewhere, so a scraper reading the obvious field returns no dates at all.

### Notes & Limitations

- Resharing is opt-in. Many accounts, including large ones, have never reshared anything and legitimately return nothing.
- The feed is Instagram's, and it goes back as far as Instagram serves it. There is no way to request a date range.
- `videoUrl` and `imageUrl` are Instagram CDN links and expire. Download what you need during or shortly after the run.

### FAQ

**Does this return posts the account made itself?**

No. Only posts it reshared from other accounts. For an account's own posts, use a profile or post scraper.

**Why did a big account return nothing?**

Because it has never reshared anything. @nasa is one example: it publishes constantly and reshares nothing.

**Can I see who reshared a specific post?**

No. Instagram publishes the reshare count for a post but not the list of accounts behind it. This actor works the other direction: from an account to what it reshared.

### 🤖 For AI Agents & LLM Apps

**Input:** `{ "usernames": ["9gag"], "maxRepostsPerUser": 50 }`

**Output:** one row per reshared post — `repostedBy`, `repostedByUserId`, `postUrl`, `shortCode`, `postId`, `postType`, `takenAt`, `caption`, `likeCount`, `commentCount`, `playCount`, `repostCount`, `imageUrl`, `videoUrl`, `originalAuthor`, `originalAuthorId`, `originalAuthorFullName`, `originalAuthorIsVerified`, `originalAuthorUrl`, `scrapedAt`. Unanswerable accounts return `{ repostedBy, error, message }`.

**Notes for agents:** an empty result for a valid public account means it has never reshared, not that the scrape failed; media URLs expire; `repostCount` describes the post, not this account's activity.

### ⚠️ Disclaimer

This scraper collects only data Instagram publishes publicly, without logging in and without accessing private content. Use it in line with Instagram's terms and with the data-protection law that applies to you. You are responsible for how you use what it returns.

### SEO Keywords

instagram reposts scraper, instagram reshared posts, what does an account repost, instagram repost count, instagram amplification tracking, instagram creator discovery, instagram brand ambassadors, who does a brand reshare, instagram profile reshares, bulk instagram repost export

# Actor input Schema

## `usernames` (type: `array`):

Accounts whose reshares you want. Bare handles, @handles, or profile URLs. An account that does not exist, or that is private, comes back as its own row saying so.

## `maxRepostsPerUser` (type: `integer`):

Cap on reshared posts collected per account. The feed serves about 12 per page and is walked with a cursor. Whole number, e.g. 50. Leave empty to take everything the feed serves.

## Actor input object example

```json
{
  "usernames": [
    "9gag",
    "@natgeo",
    "https://www.instagram.com/instagram/"
  ]
}
```

# Actor output Schema

## `results` (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 = {
    "usernames": [
        "9gag",
        "@natgeo",
        "https://www.instagram.com/instagram/"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/instagram-reposts-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 = { "usernames": [
        "9gag",
        "@natgeo",
        "https://www.instagram.com/instagram/",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("memo23/instagram-reposts-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 '{
  "usernames": [
    "9gag",
    "@natgeo",
    "https://www.instagram.com/instagram/"
  ]
}' |
apify call memo23/instagram-reposts-scraper --silent --output-dataset

```

## MCP server setup

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