# Instagram Tagged Posts Scraper – UGC Export (`scrapingmonkey/instagram-tagged-posts`) Actor

Scrape public posts from Instagram profile Tagged tabs with pagination. Export captions, media, engagement, original authors, and tagged profile details.

- **URL**: https://apify.com/scrapingmonkey/instagram-tagged-posts.md
- **Developed by:** [ScrapingMonkey](https://apify.com/scrapingmonkey) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 results

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

Collect public posts from an Instagram profile's Tagged tab with pagination. **Instagram Tagged Posts Scraper** accepts plain usernames and returns one dataset row per tagged post with its caption, media, engagement, original author, and the profile that was tagged.

Use it for user-generated content discovery, brand monitoring, campaign research, creator mentions, and public tagged-post datasets without Instagram credentials or cookies.

| At a glance | Details |
|---|---|
| 📥 Input | Plain Instagram usernames and pages per profile |
| 📤 Output | Tagged post URL, media, caption, counts, author, tagged profile, and image variants |
| 📄 Pagination | Up to 12 tagged posts per requested page when available |
| 🔐 Login required | No |
| ⚡ Processing | Up to 5 requests concurrently with automatic retries |
| 💾 Delivery | Apify dataset for JSON, CSV, Excel, XML, API, and integrations |

### What the Instagram Tagged Posts Scraper collects 🏷️

The Actor targets posts in which the selected profile is tagged. This is different from the profile's own feed: the post author may be another account, while `tagged_profile` identifies the username supplied as input.

Success rows can include:

- Canonical post URL, ID, PK, shortcode, post type, product type, and media type
- Main image, dimensions, and all available image variants
- Caption and caption ID
- Like, comment, and view counts when public
- Accessibility text, commenting state, hidden-count state, and pinned state
- Carousel item count
- Original post author's ID, PK, username, and profile URL
- Full tagged-profile identity, pictures, privacy, and verification

### How to scrape tagged Instagram posts 🚀

1. Enter one or more usernames without `@`.
2. Set `pagesPerProfile` to the number of Tagged pages to request.
3. Start the Actor.
4. Review each post as an independent dataset row.
5. Export the results or connect them to your workflow.

```json
{
  "inputList": [
    "nike",
    "nasa"
  ],
  "pagesPerProfile": 2
}
```

Profile URLs are intentionally not accepted. Duplicate usernames and duplicate tagged posts are deduplicated within a run.

### Tagged-post output fields 📦

| Field | Type | Meaning |
|---|---|---|
| `input` | string | Source profile username |
| `status` | string | `success` or `failed` |
| `image_url` | string or null | Main post image or thumbnail |
| `url` | string or null | Canonical Instagram post URL |
| `id`, `pk`, `code` | string or null | Post identifiers and shortcode |
| `type`, `product_type` | string or null | Normalized and Instagram product types |
| `media_type` | integer or null | Instagram numeric media type |
| `caption`, `caption_id` | string or null | Public caption and caption identifier |
| `like_count`, `comment_count`, `view_count` | integer or null | Public engagement metrics |
| `width`, `height` | integer or null | Media dimensions |
| `accessibility_caption` | string or null | Public accessibility description |
| `comments_disabled` | boolean or null | Whether comments are disabled |
| `counts_hidden` | boolean or null | Whether counts are hidden |
| `is_pinned` | boolean or null | Source pinned state when exposed |
| `carousel_media_count` | integer or null | Number of carousel children |
| `author` | object or null | Account that published the post |
| `tagged_profile` | object or null | Profile supplied as input |
| `image_versions` | array or null | Available image or thumbnail sizes |

Complete successful dataset item:

```json
{
  "input": "nike",
  "status": "success",
  "image_url": "https://instagram.example/tagged-post.jpg",
  "url": "https://www.instagram.com/p/EXAMPLE123/",
  "id": "1234567890123456789_2002",
  "pk": "1234567890123456789",
  "code": "EXAMPLE123",
  "type": "image",
  "product_type": "feed",
  "media_type": 1,
  "caption": "A public post featuring Nike",
  "caption_id": "987654321",
  "like_count": 3400,
  "comment_count": 76,
  "view_count": null,
  "width": 1080,
  "height": 1350,
  "accessibility_caption": "Runner wearing sports shoes",
  "comments_disabled": false,
  "counts_hidden": false,
  "is_pinned": false,
  "carousel_media_count": 0,
  "author": {
    "id": "2002",
    "pk": "2002",
    "username": "examplecreator",
    "profile_url": "https://www.instagram.com/examplecreator/"
  },
  "tagged_profile": {
    "profile_picture_url": "https://instagram.example/nike.jpg",
    "profile_picture_url_hd": "https://instagram.example/nike-hd.jpg",
    "username": "nike",
    "name": "Nike",
    "id": "13460080",
    "pk": "13460080",
    "profile_url": "https://www.instagram.com/nike/",
    "is_verified": true,
    "is_private": false
  },
  "image_versions": [
    {
      "url": "https://instagram.example/tagged-post-1080.jpg",
      "width": 1080,
      "height": 1350
    }
  ]
}
```

Complete failed dataset item:

```json
{
  "input": "unavailable_profile",
  "status": "failed",
  "image_url": null,
  "url": null,
  "id": null,
  "pk": null,
  "code": null,
  "type": null,
  "product_type": null,
  "media_type": null,
  "caption": null,
  "caption_id": null,
  "like_count": null,
  "comment_count": null,
  "view_count": null,
  "width": null,
  "height": null,
  "accessibility_caption": null,
  "comments_disabled": null,
  "counts_hidden": null,
  "is_pinned": null,
  "carousel_media_count": null,
  "author": null,
  "tagged_profile": null,
  "image_versions": null
}
```

Instagram CDN image URLs are temporary. Download authorized assets promptly if permanent retention is required.

### Input and pagination settings ⚙️

| Parameter | Type | Required | Default | Rules |
|---|---|---|---|---|
| `inputList` | array of strings | Yes | None | At least one plain Instagram username |
| `pagesPerProfile` | integer | No | `1` | Minimum `1` |

Each requested page can expose up to 12 tagged posts. The actual number may be smaller because Instagram reaches the end of the feed, returns overlapping entries, or hides unavailable content. Page count controls pagination attempts, not a guaranteed row total.

Results are saved page by page, protecting earlier successful output if a later continuation request fails.

### Tagged Instagram data use cases 🎯

#### User-generated content discovery

Find public posts created by customers, fans, publishers, and creators that tag a brand or account.

#### Campaign monitoring

Review tagged content around launches, events, sponsorships, ambassador programs, and hashtag campaigns.

#### Creator research

Identify authors who tag relevant public profiles and qualify their posts by visible engagement.

#### Brand safety and moderation

Send captions, media references, author identity, and tagging context into an authorized review workflow.

#### Social proof collection

Build a structured shortlist of public tagged posts for manual permission, curation, or reporting.

### Pricing and saved results 💰

The Actor's **Pricing** tab shows the current pricing model and rate. It is the authoritative source because Store pricing can change.

Under dataset-item pricing:

- Each unique tagged post saved as `success` is one result.
- An invalid or unavailable username, or a page that repeatedly fails, can create a `failed` result.
- Request retries do not create separate rows.
- More requested pages can produce more billable post rows.

Two full pages can return up to approximately 24 unique tagged posts for one profile, but Instagram may provide fewer.

### Instagram Tagged Posts API 🔌

Replace `$ACTOR_ID` with the Actor ID from its API tab and `$APIFY_TOKEN` with your token.

```bash
curl -X POST "https://api.apify.com/v2/acts/$ACTOR_ID/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"inputList":["nike"],"pagesPerProfile":2}'
```

Automate runs with schedules and webhooks, then deliver datasets to Google Sheets, Make, Zapier, cloud storage, BI systems, or custom applications.

### Reliability, retries, and data boundaries ⚠️

The Actor handles up to five requests concurrently and retries temporary network failures, throttling, selected HTTP errors, timeouts, and blocked redirects. Invalid username syntax is not retried unnecessarily.

One bad profile does not stop the remaining batch. A complete Actor run can still fail for infrastructure-level issues such as startup failure, unavailable Apify storage, or an unrecoverable dataset save error.

Tagged feeds are controlled by Instagram. Private, deleted, renamed, restricted, empty, or login-gated profiles may not expose results. Individual posts can disappear, and ordering can change between runs. Optional counts and accessibility fields may be null.

### Frequently asked questions ❓

#### Are these posts published by the input profile?

Not necessarily. They are posts where the input profile is tagged. The publishing account is stored in `author`.

#### Can I submit profile URLs?

No. Use plain usernames without `@`.

#### Does the Actor return every historical tagged post?

It paginates the public Tagged feed up to the requested page count. Instagram decides what is publicly available and whether a next page exists.

#### Does it require an Instagram login?

No Instagram credentials or cookies are required.

#### Does `carousel_media_count` include every slide's details?

This feed Actor reports the child count when exposed. Use Post Details or Carousel Details to retrieve deeper child-media data for selected URLs.

#### Why can a valid profile have no rows?

It may have no public tagged content or Instagram may restrict that feed. The Actor records failure where the source cannot provide usable results.

### Support, responsible use, and related actors 🛟

For a reproducible problem, provide the run ID, approximate time, page count, and a safe public username through the support channel. Never publish tokens or proxy credentials.

Use collected public data responsibly. Follow applicable privacy, copyright, data-protection, contractual, and platform rules, especially before outreach or republishing user-generated content.

# Actor input Schema

## `inputList` (type: `array`):

Add one Instagram username such as nike per item. Enter only the username without @ or a profile link. Private, unavailable and invalid profiles are saved with failed status.

## `pagesPerProfile` (type: `integer`):

Every page asks Instagram for up to 12 tagged posts. Choose 1 for up to 12 posts, 5 for up to 60, or 10 for up to 120. Collection stops automatically when no more tagged posts are available.

## Actor input object example

```json
{
  "inputList": [
    "nike"
  ],
  "pagesPerProfile": 1
}
```

# Actor output Schema

## `taggedPosts` (type: `string`):

One Dataset row for every unique post returned directly by the Instagram profile Tagged feed. Failed input or page rows keep the original input and use failed status.

# 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 = {
    "inputList": [
        "nike"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapingmonkey/instagram-tagged-posts").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 = { "inputList": ["nike"] }

# Run the Actor and wait for it to finish
run = client.actor("scrapingmonkey/instagram-tagged-posts").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 '{
  "inputList": [
    "nike"
  ]
}' |
apify call scrapingmonkey/instagram-tagged-posts --silent --output-dataset

```

## MCP server setup

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

```

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/8q2B2DjnJhGgXvs7b/builds/hEurIXeACFKeZDpDU/openapi.json
