# Instagram Reposts Scraper (`maximedupre/instagram-reposts`) Actor

Collect available reposts from public Instagram profiles. Get one structured row per saved repost with its post link, reposting profile, available media, caption, and public engagement details, plus original creator data.

- **URL**: https://apify.com/maximedupre/instagram-reposts.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

from $1.35 / 1,000 reposted 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?

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

### 📌 See What Instagram Profiles Repost

For social media researchers, marketers, and developers, this Actor collects available outbound reposts from public Instagram profiles. It returns one saved row for each first eligible repost it finds, with the reposting profile, post link, original creator, repost evidence, and available media, caption, and public engagement details. Use it to see what an account shares and trace each post back to its original creator.

- Review a profile's repost history with [**Instagram Reposts**](https://apify.com/maximedupre/instagram-reposts/examples/instagram-reposts).
- Collect posts an account shared with [**Instagram Repost Scraper**](https://apify.com/maximedupre/instagram-reposts/examples/instagram-repost-scraper).
- Explore reposts from other Instagram accounts with [**How to See Reposts on Instagram of Others**](https://apify.com/maximedupre/instagram-reposts/examples/how-to-see-reposts-on-instagram-of-others).
- Learn where a shared post appears with [**How to See Repost on Instagram**](https://apify.com/maximedupre/instagram-reposts/examples/how-to-see-repost-on-instagram).
- Start a profile collection with [**Scrape Instagram Reposts**](https://apify.com/maximedupre/instagram-reposts/examples/scrape-instagram-reposts).

#### 📦 Instagram Repost Rows

Review the profile that shared a post, the reposted post itself, the original creator, public engagement when available, a continuation point, and public evidence from the Reposts tab. Source media links are returned when available. The Actor does not download or store media files.

#### ▶️ Collect Public Instagram Reposts

**Run steps**

1. Add one or more Instagram profile handles, numeric account IDs, or profile URLs.
2. Use the same identifier type for every item in one run.
3. Set **Maximum reposts per profile** if you want a cap. Leave it empty to return all available reposts until the source is exhausted.
4. Paste a continuation point from an earlier run when you want to continue that collection, then start the run.
5. Open the `reposts` link in the run output to review the dataset.

The Actor saves the first eligible occurrence of a source post immediately. If the same source post appears again through another submitted profile identifier, later matches are ignored. The saved row describes only the first match.

#### ⚙️ Input

Use one run for profile identifiers of the same kind. The required `profileIdentifiers` field accepts handles, numeric account IDs, or profile URLs.

**Input fields**

| Field | Type | What it does |
| --- | --- | --- |
| `profileIdentifiers` | Array of strings | Required. Profiles to read. Enter handles, numeric account IDs, or profile URLs, and use one identifier type for every item in the run. |
| `maxItems` | Integer | Optional cap on reposts for each profile. Leave it empty to return all available reposts until the source is exhausted. |
| `continuationPoint` | String | Optional point returned by an earlier run. Paste it into the next run and keep the same profile identifiers to continue the collection. |

Leaving `maxItems` empty returns all available reposts until the source is exhausted.

**Example input**

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

```json
{
  "profileIdentifiers": [
    "worldstar"
  ],
  "maxItems": 10
}
```

#### 🧾 Output

**Run output**

| Field | Type | What it does |
| --- | --- | --- |
| `reposts` | String link | Opens the collected Instagram reposts in the default dataset overview. |

Each dataset row uses one shape. `repostingProfile`, `post`, `originalCreator`, and `repostEvidence` are required. Other fields and nested values appear when Instagram provides them.

**Dataset row**

| Field | Type | What it does |
| --- | --- | --- |
| `repostingProfile` | Object | Public Instagram profile that shared the repost. |
| `repostingProfile.id` | String | Stable Instagram account ID for the reposting profile. |
| `repostingProfile.username` | String | Handle for the reposting profile, without `@`. |
| `repostingProfile.displayName` | String | Name shown for the reposting profile. |
| `repostingProfile.profileUrl` | URL string | Main public URL for the reposting profile. |
| `repostingProfile.isVerified` | Boolean | Whether Instagram marks the reposting profile as verified. |
| `repostingProfile.isPrivate` | Boolean | Whether Instagram marks the reposting profile as private. |
| `post` | Object | Instagram post that appears in the selected profile's repost history. |
| `post.id` | String | Stable Instagram ID for the reposted post. |
| `post.url` | URL string | Main public URL for the reposted post. |
| `post.mediaType` | String | Media kind reported by Instagram, such as `IMAGE`, `VIDEO`, or `CAROUSEL_ALBUM`. |
| `post.caption` | String | Original caption for the reposted post. |
| `post.publishedAt` | Date-time string | Publication time for the reposted post. |
| `post.hashtags` | Array of strings | Hashtags found in the caption. |
| `post.hashtags[]` | String | Hashtag from the caption. |
| `post.mentions` | Array of strings | Handles mentioned in the caption. |
| `post.mentions[]` | String | Instagram handle mentioned in the caption. |
| `post.taggedAccounts` | Array of objects | Instagram accounts tagged in the post. |
| `post.taggedAccounts[]` | Object | One tagged Instagram account. |
| `post.taggedAccounts[].id` | String | Stable Instagram ID for the tagged account. |
| `post.taggedAccounts[].username` | String | Handle for the tagged account, without `@`. |
| `post.taggedAccounts[].displayName` | String | Name shown for the tagged account. |
| `post.taggedAccounts[].profileUrl` | URL string | Main public URL for the tagged account. |
| `post.taggedAccounts[].isVerified` | Boolean | Whether Instagram marks the tagged account as verified. |
| `post.taggedAccounts[].isPrivate` | Boolean | Whether Instagram marks the tagged account as private. |
| `post.media` | Object | Source media links and carousel details for the post. |
| `post.media.imageUrl` | URL string | Direct source URL for the post image. |
| `post.media.videoUrl` | URL string | Direct source URL for the post video. |
| `post.media.previewUrl` | URL string | Direct source URL for a preview image or video frame. |
| `post.media.durationSeconds` | Number | Media duration in seconds. |
| `post.media.carouselItems` | Array of objects | Media items in a carousel, in source order. |
| `post.media.carouselItems[]` | Object | One media item from the carousel. |
| `post.media.carouselItems[].mediaType` | String | Media kind reported for the carousel item. |
| `post.media.carouselItems[].imageUrl` | URL string | Direct source URL for the carousel image. |
| `post.media.carouselItems[].videoUrl` | URL string | Direct source URL for the carousel video. |
| `post.media.carouselItems[].previewUrl` | URL string | Direct source URL for the carousel item's preview. |
| `post.media.carouselItems[].durationSeconds` | Number | Duration of the carousel video in seconds. |
| `post.audio` | Boolean | Whether the source reports that the post has audio. |
| `post.location` | Object | Public location attached to the post. |
| `post.location.name` | String | Name shown for the location. |
| `post.location.latitude` | Number | Latitude reported for the location. |
| `post.location.longitude` | Number | Longitude reported for the location. |
| `originalCreator` | Object | Original creator linked to the repost. |
| `originalCreator.id` | String | Stable Instagram account ID for the original creator. |
| `originalCreator.username` | String | Handle for the original creator, without `@`. |
| `originalCreator.displayName` | String | Name shown for the original creator. |
| `originalCreator.profileUrl` | URL string | Main public URL for the original creator. |
| `originalCreator.isVerified` | Boolean | Whether Instagram marks the original creator as verified. |
| `originalCreator.isPrivate` | Boolean | Whether Instagram marks the original creator as private. |
| `engagement` | Object | Public engagement counts for the post when Instagram provides them. |
| `engagement.likes` | Integer | Public like count for the post. |
| `engagement.comments` | Integer | Public comment count for the post. |
| `continuationPoint` | String | Point to paste into the next run to continue the profile's collection. |
| `repostEvidence` | Object | Public evidence that links the post to the selected profile's repost history. |
| `repostEvidence.sourceSurface` | String | Public Instagram surface that supplied the repost evidence. |
| `repostEvidence.sourceLabel` | String | Public label that identifies the relationship as a repost. |

**Example row from a successful current-beta run**

This genuine row is shortened to keep the example small. It keeps real values for the main fields and uses the JSON string `"..."` for large media URLs and omitted tagged-account details.

```json
{
  "repostingProfile": {
    "id": "17841400760725320",
    "username": "worldstar",
    "displayName": "WorldStar Hip Hop / WSHH",
    "profileUrl": "https://www.instagram.com/worldstar/",
    "isVerified": true,
    "isPrivate": false
  },
  "post": {
    "id": "3981705893938794159",
    "url": "https://www.instagram.com/p/DdB3GogTQ6v/",
    "mediaType": "VIDEO",
    "caption": "Step inside Polymarket HQ.\n\nLivetrade every touchdown with instant buy & sell on the @Polymarket app.\n\nUse code KING50 to get a $50 new user bonus.",
    "publishedAt": "2026-09-08T14:06:59.000Z",
    "mentions": [
      "Polymarket"
    ],
    "taggedAccounts": [
      "..."
    ],
    "media": {
      "videoUrl": "...",
      "previewUrl": "...",
      "durationSeconds": 60.060059
    },
    "audio": true
  },
  "originalCreator": {
    "id": "17841448463927417",
    "username": "polymarket",
    "displayName": "Polymarket",
    "profileUrl": "https://www.instagram.com/polymarket/",
    "isVerified": true,
    "isPrivate": false
  },
  "engagement": {
    "likes": 55770,
    "comments": 1180
  },
  "continuationPoint": "QVFENTAxNGFPVkZzczFodEo2UGpSdV9EbC1hVHNBNWNQeGVqM18zeHBXVXAzNFFneEo5c0dLbV9kcGFtcG9zM2pHRHFySmVQaUZ6dUNTN1d6WHdoNTJCNw==",
  "repostEvidence": {
    "sourceSurface": "Reposts tab",
    "sourceLabel": "Original creator"
  }
}
```

#### 💳 Pricing

**What you pay for**

This Actor uses pay-per-event pricing. One event is charged for each successfully saved reposted post. A smaller `maxItems` value can reduce the number of saved repost events. The current rate is shown in the Pricing tab.

#### 🔌 Integrations

**Video guide**

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

Open the dataset link in the run output to review or export the saved rows through Apify.

#### ❓ FAQ

##### Which profile does a saved repost belong to?

Use `repostingProfile` to see the public profile whose Reposts tab supplied the first saved occurrence. `originalCreator` identifies the account tied to the reposted post.

##### What happens when the same post appears again?

Only the first eligible occurrence is saved. Later matches from another submitted profile identifier are ignored, and the saved row describes that first match.

##### How do I continue a collection?

Paste the returned `continuationPoint` into the next run and keep the same `profileIdentifiers`. Use it when you want to continue from the returned position.

##### Can I submit more than one profile?

Yes. Submit one or more handles, numeric account IDs, or profile URLs, but use the same identifier type for every item in the run. `maxItems` applies to each profile.

##### Does the Actor download media files?

No. It returns source image, video, and preview links when available. Those links are the delivery, so download them yourself if you need files.

##### Can I read private profiles or regular posts?

No. It is for publicly accessible profile repost history. Private profiles and ordinary profile posts are outside the Actor's scope.

##### Can I filter by date, media type, creator, or engagement?

No. The Actor collects the available repost history and does not offer those filters.

##### Can I find every account that reposted one post?

No. It follows selected profiles and returns what they reposted. It does not search for every account that reposted a specified post.

### 📝 Changelog

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

- Initial release.

### 🆘 Support

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

### 🔗 Related Actors

- [TikTok Reposts Scraper](https://apify.com/maximedupre/tiktok-reposts) collects public reposts from TikTok profiles with creator and media details.
- [Instagram Post & Reel Content Scraper](https://apify.com/maximedupre/instagram-post-content-scraper) collects regular Instagram posts and Reels from public profiles.
- [Instagram Downloader API](https://apify.com/maximedupre/instagram-downloader-api) returns source media links from known public Instagram posts and Reels.
- [Instagram Reels Search Scraper](https://apify.com/maximedupre/instagram-reels-search-scraper) finds public Instagram Reels by keyword or hashtag.
- [Instagram Profile Stats Scraper](https://apify.com/maximedupre/instagram-profile-stats-scraper) checks public profile identity and audience counts for submitted accounts.

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

# Actor input Schema

## `profileIdentifiers` (type: `array`):

Add one or more Instagram profile handles, numeric account IDs, or profile URLs. Use the same identifier type for every item in this run.

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

Optional. Stop after this many reposts for each profile. Leave it empty to return all available reposts until the source is exhausted.

## `continuationPoint` (type: `string`):

Optional. Paste the continuation point returned by an earlier run to continue that collection. Keep the same profile identifiers.

## Actor input object example

```json
{
  "profileIdentifiers": [
    "worldstar"
  ],
  "maxItems": 10
}
```

# Actor output Schema

## `reposts` (type: `string`):

Open the dataset of reposts collected from public Instagram profiles.

# 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 = {
    "profileIdentifiers": [
        "worldstar"
    ],
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/instagram-reposts").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 = {
    "profileIdentifiers": ["worldstar"],
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/instagram-reposts").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 '{
  "profileIdentifiers": [
    "worldstar"
  ],
  "maxItems": 10
}' |
apify call maximedupre/instagram-reposts --silent --output-dataset

```

## MCP server setup

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

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/pXTCQfvYdnLUsXeQA/builds/MPpcddUTznw7GCYye/openapi.json
