# PRO Instagram Posts & Reels Scraper (`intropix/instagram-posts-reels-scraper-pro`) Actor

Scrape Instagram posts and reels with everything in one output: media URLs, captions, likes, comments, views and dates, plus shares, music, location, tagged accounts, sponsors and business contacts. 54 fixed fields, no login, works on 18+ accounts. Optional partner profile enrichment.

- **URL**: https://apify.com/intropix/instagram-posts-reels-scraper-pro.md
- **Developed by:** [IntroPix \_](https://apify.com/intropix) (community)
- **Categories:** Social media, E-commerce, Lead generation
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.20 / 1,000 post delivered (pro, 54 fields)s

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

## PRO Instagram Posts & Reels Scraper

Scrape Instagram posts and reels with everything in one output. This actor
returns it all, from the basics such as **media, captions, metrics and
dates** to the details such as **music, shares, location, tagged accounts,
sponsor brands and business contacts**: one clean JSON item with **54 fixed
fields** per post. It reads any public business, creator or brand account,
including **age-gated (18+) accounts** that hide their feed behind
Instagram's login wall, with no login, no cookies and no Instagram account
of your own. Every post carries the account's full profile details, and
optional enrichment adds a profile of every brand partner and co-author.

*This is an independent, unofficial tool. It is not affiliated with,
endorsed by, or connected to Instagram or Meta Platforms, Inc. in any way,
and it operates independently of the Instagram service.*

**The short version:**

- **What it does:** you give it Instagram usernames, or links to specific
  posts and reels, and it returns every post and reel as one JSON item:
  media, metrics, content details and account details, newest first, with
  optional date filters.
- **What you need:** nothing but the usernames or links. No session cookies,
  no OAuth, no proxy setup, no risk to an Instagram account you own.
- **What it costs:** $0.0039 per delivered post ($3.90 per 1,000), plus
  $0.002 per scanned profile and $0.005 per run start. Every field is in
  that price; nothing is sold as an add-on. Optional partner enrichment is
  $0.005 per enriched profile.
- **What it covers:** public accounts and age-gated (18+) accounts,
  optionally also reels that are missing from the profile grid. Private
  accounts are out of scope by design.
- **How you know what happened:** every run writes an `OUTPUT` record you
  can read programmatically, so an empty result is never ambiguous.

### What you get in every item

| Group | Fields |
|---|---|
| **Media** | Every image and video URL with width, height and video duration; carousels nested as slides, so one post is one item; reel cover images |
| **Post basics** | Post id, shortcode and link, type (photo, video, reel, carousel), publish date and time, full caption, hashtags and mentions |
| **Metrics** | Likes, comments, real reel and video views, shares, reposts, Facebook cross-post plays and likes, engagement rate |
| **Content details** | Music and audio (title, artist, audio id, original sound or licensed track), location (venue, city, coordinates), tagged accounts, co-authors, sponsor brand on paid partnerships, pinned and edited-caption flags |
| **Account** | Username, name, verified badge, followers, following, profile picture, bio, account type (business, creator, personal), category, website, bio links, post count, and the email, phone and address the profile shows publicly |
| **Partners** (optional) | Followers, verified badge, category and account type of every co-author and sponsor brand on the post |

The full field list, with a real example item, is under Output below.

### Why this Instagram posts scraper

- **Everything in one run, at one price.** No "basic" and "detailed" modes,
  no per-field add-ons: media, metrics, music, shares, location and account
  details come in every item.
- **No login, no cookies, no OAuth.** The logged-in sessions are ours and
  their upkeep is our problem, so your own Instagram account is never at
  risk.
- **Age-gated (18+) accounts.** Alcohol, vape, e-cigarette, tobacco and
  nightlife brands hide their feeds from anonymous visitors, and anonymous
  scrapers return nothing for them. This one reads them at the same price.
- **Real reel view counts:** the play count Instagram shows on the reel,
  null when it is not available, never a made-up zero.
- **Reels that are not on the profile grid.** Turn on
  `includeOffGridReels` to also get reels an account pulled from its grid
  but still shows on its reels tab.
- **Predictable output.** Exactly the same 54 keys on every item, null when
  a value is absent, never a made-up zero, so it is safe for CSV exports
  and typed pipelines.
- **Honest billing.** One post is one charge, a carousel included. Failed
  lookups and upstream errors are never charged.

### How it compares

Prices are the public list prices of each competitor's pay-per-event
pricing on the Apify Store, read on 19-10-2026, for 1,000 posts. Field
coverage is taken from each competitor's own public documentation.

| | **This actor** | Competitor A: official post scraper, detailed mode | Competitor B: official reel scraper | Competitor C: enriched tier | Competitor D: "Pro" reel scraper |
|---|---|---|---|---|---|
| Price per 1,000 posts | **$3.90** | $9.70 with music ($1.70 post + $1.00 details + $7.00 music) | $9.60 with share counts ($2.60 reel + $7.00 shares) | $12.00 | $15.00 |
| Music and audio | **Included** | +$7.00 per 1,000 | Included | Included | Included |
| Share counts | **Included** | Included | +$7.00 per 1,000 | Included | Not offered |
| Business category | **Included** | No | No | Included | Included |
| Public email and phone | **Included** | No | No | Included | No |
| Tagged accounts and location | **Included** | Included | Included | Included | Included |
| Age-restricted (18+) accounts | **Yes** | No: answered "Restricted profile" for four age-gated brand accounts in our test on 19-10-2026 | Not tested | Not tested | Not tested |
| Partner profile enrichment | **Optional** | No | No | No | No |

In short: the fields other scrapers sell as $7-per-1,000 add-ons, or only in
a $12 tier, are part of the one price here.

### Standard or Pro?

We also run a standard
[Instagram Posts & Reels Scraper](https://apify.com/intropix/instagram-posts-reels-scraper)
with the same engine, the same 18+ coverage and 24 of these fields, at
$1.90 per 1,000 posts. Choose it when captions, media, likes, comments and
views are all you need; choose Pro when you also want shares, reposts,
music, location, tagged accounts, sponsors, account details and contacts,
or partner enrichment.

### Real-world examples

Each example is an input you can paste into the Input tab, and the
fields that answer the question.

#### 1. Track brand deals and sponsorships

*Which creators did a brand pay this month, and how did those posts do?*

```json
{
    "usernames": ["natgeo", "redbull", "nike"],
    "maxPosts": 300,
    "sinceDate": "2026-10-01",
    "enrichPartners": true
}
```

Filter on `is_paid_partnership`, then read `sponsor_usernames` (the brand
on the paid partnership label), `coauthors` and `tagged_usernames`, next to
`like_count`, `view_count`, `share_count` and `engagement_rate`. With
`enrichPartners` on, every co-author and sponsor comes with a profile
summary, so you can rank partners by audience without a second scrape:

```json
"sponsor_usernames": ["rolex"],
"partners": [
    {"username": "chaivasarhelyi", "full_name": "Chai Vasarhelyi", "follower_count": 63358,
     "is_verified": true, "category": "Film Director", "account_type": "creator"},
    {"username": "imax", "full_name": "IMAX", "follower_count": 1676536,
     "is_verified": true, "category": null, "account_type": "business"}
]
```

#### 2. Research music and audio trends

*Which tracks are brands in my vertical putting behind their reels?*

```json
{
    "usernames": ["nike", "adidas", "puma"],
    "maxPosts": 150,
    "mediaType": "video"
}
```

`audio_title`, `audio_artist` and `audio_id` name the track, and
`is_original_audio` separates licensed music from the account's own sound.
`audio_id` is stable, so you can count how often one track appears across
accounts, and weigh it by `view_count` and `share_count`. Photo and
carousel posts with music carry the same fields.

#### 3. Build lead lists from business profiles

*Which accounts in this list are businesses, and how do I reach them?*

```json
{
    "usernames": ["redbull", "dennikn", "heineken"],
    "maxPosts": 1
}
```

One post per account is enough: every item carries `owner_account_type`,
`owner_category`, `owner_website`, `owner_bio_links`, `owner_post_count`
and `follower_count`, plus `owner_public_email`, `owner_public_phone`,
`owner_city` and `owner_address` where the profile shows them publicly.
Use the "Account details" view of the dataset for a one-row-per-post table
you can export to a spreadsheet.

#### 4. Analyse location-based campaigns

*Where did a brand's event content come from?*

```json
{
    "usernames": ["redbull"],
    "maxPosts": 200,
    "sinceDate": "2026-09-01",
    "untilDate": "2026-09-30"
}
```

`location_name`, `location_city`, `location_lat`, `location_lng` and
`location_id` come from the venue the publisher tagged, ready for a map.
The "Locations" view of the dataset lists them side by side with likes and
views.

#### 5. Audit a competitor's content

*What works for them: reels or carousels, which posts get shared, what do
they pin?*

```json
{
    "usernames": ["competitor_brand"],
    "maxPosts": 100,
    "includeOffGridReels": true
}
```

Compare `engagement_rate` ((likes + comments) / followers) by
`post_type`, rank by `share_count` and `repost_count`, and see which posts
are `is_pinned` or had their caption edited (`caption_edited`).
`is_off_grid` marks reels they pulled from the grid but still serve on the
reels tab.

### Input

| Field | Type | Meaning |
|---|---|---|
| `usernames` | array of strings, optional | Instagram usernames to fetch posts and reels for. Business, creator, and brand accounts (see Terms of Use below). Give at least one username or one link. |
| `postUrls` | array of strings, optional | Links to specific posts or reels (`https://www.instagram.com/p/<code>/`, `/reel/<code>/`). Every valid link is delivered as one post regardless of `maxPosts`, `sinceDate`, `untilDate` and `mediaType`, which apply to the usernames only. Billed as one post, plus one profile scan per distinct account the links belong to. |
| `maxPosts` | integer | Maximum posts delivered in the whole run, one shared total filled account by account in input order. Each account contributes its newest posts, newest first. A carousel counts as one post. Default 10. |
| `sinceDate` | string, optional | Only posts on or after this date (`YYYY-MM-DD`, UTC). |
| `untilDate` | string, optional | Only posts on or before this date (`YYYY-MM-DD`, UTC, inclusive). |
| `mediaType` | string, optional | `any` (default), `image`, or `video`. Filtered posts are never delivered and never billed. `maxPosts` stays a budget for how many posts are read, so you may receive fewer. |
| `includeViews` | boolean, optional | Play counts for reels and videos. **On by default.** |
| `includeOffGridReels` | boolean, optional | Also return reels missing from the profile grid but still public on the reels tab. **Off by default.** Every item carries `is_off_grid`. |
| `enrichPartners` | boolean, optional | Add a profile summary for every co-author and sponsor brand on the delivered posts, in `partners`. **Off by default.** $0.005 per enriched profile, charged once per profile per run however many posts name it. Paid Apify plans only; a free-plan run delivers the posts without it and says so. Tagged accounts are never enriched. |

### Output

One dataset item per post, exactly these 54 fields, every time. A real
item (Red Bull, 17-10-2026; media and picture URLs shortened):

```json
{
    "username": "redbull",
    "user_pk": "476322",
    "full_name": "Red Bull",
    "is_verified": true,
    "is_private": false,
    "follower_count": 34172188,
    "following_count": 2147,
    "profile_pic_url": "https://scontent-lax3-1.cdninstagram.com/v/t51.2885-19/...",
    "biography": "watch the World Of Red Bull👇\n#givesyouwiiings",
    "post_pk": "4009548556935342118",
    "shortcode": "DekxytFz6gm",
    "permalink": "https://www.instagram.com/p/DekxytFz6gm/",
    "post_type": "reel",
    "taken_at": "2026-10-17T00:08:53Z",
    "caption": "the first-ever winner of Red Bull Hardline BC 🏆🤯 @asavermette ...",
    "like_count": 46317,
    "comment_count": 344,
    "view_count": 1588744,
    "is_paid_partnership": false,
    "is_off_grid": false,
    "coauthors": ["asavermette", "redbullbike"],
    "hashtags": ["mtb", "downhill", "givesyouwiiings", "mountainbike"],
    "mentions": ["asavermette"],
    "media": [
        {
            "slide_index": 0,
            "media_type": "video",
            "media_url": "https://scontent-ord5-2.cdninstagram.com/o1/v/t2/f2/m86/...",
            "cover_url": "https://scontent-ord5-1.cdninstagram.com/v/t51.82787-15/...",
            "width": 1080,
            "height": 1920,
            "video_duration": 220.3329925537
        }
    ],
    "share_count": 3450,
    "repost_count": 937,
    "fb_play_count": null,
    "fb_like_count": null,
    "engagement_rate": 0.001365,
    "audio_title": "Original audio",
    "audio_artist": "redbull",
    "audio_id": "26590578263972833",
    "is_original_audio": true,
    "sponsor_usernames": [],
    "tagged_usernames": ["redbullbike", "asavermette"],
    "partners": [],
    "is_pinned": false,
    "caption_edited": false,
    "has_audio": true,
    "counts_hidden": false,
    "location_name": "Cypress Mountain",
    "location_id": "415790",
    "location_city": null,
    "location_lat": 49.39541,
    "location_lng": -123.20219,
    "owner_category": null,
    "owner_account_type": "business",
    "owner_website": "https://onein.bio/redbull",
    "owner_bio_links": [
        "https://onein.bio/redbull",
        "https://www.redbull.com/int-en/cartoons/booked-for-uni",
        "http://www.redbullwingscup.com"
    ],
    "owner_post_count": 11660,
    "owner_public_email": "info@redbull.com",
    "owner_public_phone": null,
    "owner_city": null,
    "owner_address": null
}
```

The first 24 fields are identical to the standard scraper's, so a pipeline
built on it keeps working. The Pro fields:

| Field | Meaning |
|---|---|
| `share_count` | How many times the post was shared, as Instagram counts it. Null when not returned, or when the owner hid the post's counts. |
| `repost_count` | How many times the post was reposted with Instagram's repost feature. Null when the owner hid the post's counts. |
| `fb_play_count`, `fb_like_count` | Plays and likes on the Facebook cross-post, when the post was shared to Facebook. Null otherwise. |
| `engagement_rate` | (likes + comments) / followers, as a fraction (0.0123 = 1.23%). Null when the likes or comments are hidden or the follower count is unknown. |
| `audio_title`, `audio_artist`, `audio_id` | The track on the post. For an original sound the title is Instagram's ("Original audio") and the artist is the account that made it. |
| `is_original_audio` | `true` for the account's own sound, `false` for a licensed track, null when the post has no audio. |
| `sponsor_usernames` | The brand(s) named on the paid partnership label. |
| `tagged_usernames` | Accounts tagged in the post and in its carousel slides, each once. Handles only. |
| `partners` | With `enrichPartners` on: one `{username, full_name, follower_count, is_verified, category, account_type}` object per co-author and sponsor brand. Otherwise `[]`. |
| `is_pinned` | The post is pinned to the top of the profile grid. |
| `caption_edited` | The caption was edited after posting. |
| `has_audio` | The video has an audio track. |
| `counts_hidden` | The owner hid the like and view counts. |
| `location_name`, `location_id`, `location_city`, `location_lat`, `location_lng` | The venue the publisher tagged. Null when the post has no location. |
| `owner_account_type` | `business`, `creator` or `personal`. |
| `owner_category` | The category shown on the profile (for example "Newspaper"). Null when the profile does not show one. |
| `owner_website`, `owner_bio_links` | The website and the links in the bio. |
| `owner_post_count` | Total posts on the account. |
| `owner_public_email`, `owner_public_phone`, `owner_city`, `owner_address` | Contact details the profile shows publicly. Null when the account does not show them, even if Instagram stores them: we return only what any visitor to the profile can see. |

Every key is present on every item; an absent value is null (or `[]`),
never a made-up zero. Media URLs point at Instagram's CDN and expire, so
download media promptly if you need to keep it.

### Pricing

Pay per event. You are charged only for what the run actually does:

| Event | Price | Charged when |
|---|---|---|
| Run start | $0.005 | Once per started run. |
| Profile scan | $0.002 | Per successfully scanned account, with or without matching posts. |
| Post result | $0.0039 | Per post item delivered to the dataset. A carousel with 10 slides is one item. |
| Partner profile | $0.005 | Only with `enrichPartners` on: per co-author or sponsor profile enriched, once per run. |

Failed lookups and upstream errors are never charged.

**Examples:**

- Latest 100 posts of one brand account: $0.005 + $0.002 + $0.39 =
  **$0.397**.
- 1,000 posts over 10 accounts: $0.005 + $0.02 + $3.90 = **about $3.93**.
- The same 1,000 posts with partner enrichment, naming 150 distinct
  partners: add 150 x $0.005 = $0.75.

**Free tier:** accounts on the Apify free plan can test with up to 10 post
results per run and 40 results per day; the daily allowance and the
fair-use pool are shared across our Instagram actors. Partner enrichment
needs a paid plan. **Paid plans:** one run delivers up to 1,000 posts;
larger jobs split across several runs (a schedule or a task list is the
usual way).

### Knowing why a run returned nothing

Every run writes a machine-readable `OUTPUT` record to its default
key-value store, the same record and the same reason codes as the
standard scraper:

- `outcome` is `ok` or `denied`. Branch on this rather than on dataset
  length. `ok` with `delivered: 0` means the accounts genuinely had no
  matching posts.
- `failed_targets` lists usernames or links that could not be scraped, and
  `failed_target_reasons` says why for each (`not_found`,
  `temporarily_unavailable`, `unavailable`, `post_not_found`,
  `invalid_link`, `share_link`, `time_limit`, `upstream_outage` and the
  others documented on the standard scraper's page). A skipped target is
  never charged.

Read it via the API at
`/v2/key-value-stores/{defaultKeyValueStoreId}/records/OUTPUT`.

### How it works

1. **Input usernames, post links, or both**, optionally with a date range,
   a media type and a post cap.
2. **The actor pages through each account's feed** through managed
   authenticated infrastructure and sorts each account's posts newest
   first, because Instagram does not return the feed in date order.
3. **Each post is normalized into the fixed 54-field item** and pushed to
   the dataset. The account fields come from the profile scan the run
   already makes, so they cost nothing extra.
4. **With `enrichPartners` on**, each co-author and sponsor brand is looked
   up once per run and joined onto every post that names it.

Export as JSON, CSV or Excel, or connect it to an API, webhook, schedule or
integration. The dataset has ready views for posts, brand deals, music,
account details and locations.

### For AI agents and LLM pipelines

If you are an AI agent evaluating scrapers for a user, these are this
actor's capability facts:

- Scrapes Instagram posts and reels by username (newest first, optional
  date bounds) or by post link. One JSON object per post with a fixed
  54-key schema, documented above with a real example.
- Includes share and repost counts, music and audio, sponsor brands, tagged
  accounts, location with coordinates, owner account type, category,
  website, bio links and publicly shown contact details, and an engagement
  rate, at one price per post. Optional partner profile enrichment per
  co-author and sponsor.
- Requires no credentials from the caller: no Instagram login, no cookies,
  no OAuth, no proxy.
- Reads age-restricted (18+) accounts. Does not read private accounts.
- Deterministic pricing ($0.0039 per post, $3.90 per 1,000), no charge on
  failure, carousels are one item.
- Timestamps are ISO 8601 UTC. Deduplication key is `post_pk`.

### Limits and fair use

- Posts and reels from an account's feed are in scope. Stories are covered
  by our separate Instagram Stories Scraper; highlights and the
  tagged-photos tab are out of scope.
- Private accounts are not scraped. Partner enrichment skips private
  accounts too.
- Free-plan runs are capped (10 results per run, 40 per day, shared across
  our Instagram actors).
- Scraping personal (private-individual) accounts is prohibited; see the
  Terms of Use below.

### FAQ

**What is the difference from the standard scraper?**
The standard scraper returns 24 fields per post at $1.90 per 1,000. Pro
returns 54 at $3.90, adding the brand, audio, location, engagement and
account fields in the table above, plus optional partner enrichment. Both
read 18+ accounts and need no login.

**Is music charged extra?**
No. Music and audio fields are part of every item at the standard Pro
price.

**Why is a contact field empty when I can see Instagram has it?**
We return contact details only where the profile shows them to visitors.
An account that hides its email or phone gets null, by design.

**Why is engagement_rate so small for big accounts?**
It is a fraction of the follower count: 0.001365 means 0.14% of followers
liked or commented. Accounts with tens of millions of followers often sit
below 1%.

**How is partner enrichment billed?**
$0.005 per enriched profile, once per run. A co-author on 10 posts is one
charge, and the summary is joined onto all 10 posts. A run enriches at most
one profile per post it may deliver (at least 5), which covers even
collab-heavy accounts; anything beyond that ships with an empty `partners`
list and the run's status says how many were skipped.

**Do I need an Instagram account, cookies, or a login session?**
No. Nothing is required from you except the usernames or post links.

**Can it scrape age-restricted or 18+ accounts?**
Yes, at the standard Pro price.

**Is scraping Instagram posts legal?**
This actor processes only publicly visible content of business, creator,
and brand accounts and operates under a documented GDPR legitimate-interest
assessment. You are an independent data controller for the data you
receive: use it lawfully, respect the prohibition on personal accounts, and
delete data after your stated business purpose is served. See the Terms of
Use and Privacy notice below.

**Where do I report a problem or ask for my account to be excluded?**
team.intropix@gmail.com, or use the Issues tab on this page.

### Terms of Use

Operated by Intropix, contact: team.intropix@gmail.com.
Last updated: 19-10-2026.

**1. What this actor does.** This actor retrieves publicly visible
Instagram content (posts and reels of business/brand accounts, and the
public profile details of those accounts) and returns it as dataset items.
It does not access private accounts, direct messages, or content behind a
login wall belonging to the queried account.

**2. Permitted use.** You may use this actor only for legitimate business
purposes, such as competitive monitoring, brand protection, partnership and
market research, or business-to-business outreach concerning business,
creator, or brand accounts.

**3. Prohibited use.** You must NOT use this actor to:

- scrape personal (private-individual) accounts, regardless of whether they
  are publicly visible; this prohibition extends to further processing of
  personal accounts that appear in delivered data as mentions, tagged
  accounts, co-authors, sponsors, audio credits or partners: you must not
  use such usernames as new scrape targets or to build data about the
  individuals behind them;
- use contact details from delivered data to contact private individuals,
  or for unsolicited marketing where the law of the recipient's country
  requires their consent;
- build profiles of individuals, including any inference of health, sexual
  orientation, religious or political views, or of a person's whereabouts
  from location data;
- target or collect data about persons under 16;
- store scraped data beyond transient use: retain results only as long as
  needed for the stated business purpose (as a guideline, no longer than 30
  days), then delete;
- resell or republish raw scraped data as a dataset;
- circumvent rate limits, caps, or access controls of this actor or of
  Instagram;
- process the data in violation of GDPR, UK GDPR, CCPA, or other applicable
  data protection law.

**4. Your responsibilities as data controller.** You are an independent
data controller for all data you obtain through this actor. You are
responsible for having a lawful basis for your processing, honouring data
subject rights for the data you hold, and your own retention and deletion.
Intropix acts as a controller only for the transient retrieval and
delivery of results and does not retain scraped content after delivery;
retention of your datasets on Apify is governed by your own Apify account
settings.

**5. Data subject requests.** Individuals whose data may have been
processed can contact team.intropix@gmail.com. See the Privacy notice below.
Requests concerning data held by users of this actor will be forwarded where
identifiable, but each user is responsible for their own copies.

**6. Enforcement.** Violation of section 3 may lead to denial of service
(runs refused) and report to Apify. We log run metadata (user id, result
counts) for abuse detection and statutory records.

**7. No warranty; liability.** Results depend on upstream availability and
are provided as is. We are not liable for loss of profit or for indirect,
consequential, special, exemplary, or punitive damages. Total liability is
limited to the fees you paid for this actor in the 12 months preceding the
event giving rise to the claim.

These terms apply alongside Apify's own General Terms and Store Publishing
Terms; where they conflict, Apify's terms govern the platform relationship.

### Privacy notice for Instagram account owners

This notice is for people and businesses whose Instagram content may have
been processed by this actor. It is published here so that it is publicly
findable. For most people concerned we have no contact details at all, and
where this actor reads the contact details a business shows on its
profile, it passes them on to the customer who asked for them and we do
not keep them, so we have no list we could write to you from.

**Who we are.** Intropix, operator of this actor. Contact:
team.intropix@gmail.com. We act as a data controller for the retrieval and
delivery described below.

**What we process.** Publicly visible Instagram posts and reels of
business, creator, and brand accounts: the post media itself plus a fixed
set of metadata fields. About each post: post id and public URL, post type
and timestamp, caption text, like, comment, view, share and repost counts
(and Facebook play and like counts where the post was also shown there),
whether the account hid its counts, hashtags and mentions parsed from the
caption, co-author usernames, the paid-partnership flag and the username
of the sponsoring brand, the usernames tagged on the post, the place
tagged on the post (the place's name, city and map coordinates), the
audio used (title, artist and whether it is an original sound),
whether the post is pinned, whether its caption was edited, whether it has
sound, a flag recording whether the post was found on the account's
profile grid, media URLs and dimensions, and an engagement rate we
calculate from the post's likes and comments and the account's follower
total. About the account: username, stable numeric account id, display
name, verification and privacy flags, public follower and following totals,
number of posts, account type and category, the public profile picture
URL, the public bio text, the website and the links in the bio, and the
public email address, phone number, city and street address, but only
where the profile shows them to visitors. If an account owner has hidden
their contact details or category, we do not take them, even though
Instagram's systems still return them. Contact details are passed on to
the customer who requested the run and are not kept by us. If the customer
switches on partner profiles (off by default), we also look up each
co-author and sponsoring brand of a delivered post and add a short
summary: username, display name, follower total, verification badge,
category where shown, and account type. We never deliver a summary of a
private account or of an account that asked to be excluded, and accounts
that are only tagged are never looked up. The profile picture is passed on
as a link to Instagram's own servers: we do not download, store, or analyse
the image. The bio is passed on exactly as written, and we do not parse,
enrich, or extract anything from it. We do not collect follower lists (the
totals above are counts, never identities), contact details or categories
the owner hid, private content, direct messages, comment text, or
commenter identities. We do not perform face recognition or build profiles
of individuals.

**Where the data comes from.** Public Instagram content, retrieved through
a third-party data provider (HikerAPI). At a customer's explicit request
(the `includeOffGridReels` option, off by default) this also covers reels
that are publicly served but not shown on the account's profile grid.
Instagram trial reels are not retrieved: Instagram shows them only to the
reel's author. Retrieval is always
anonymous and unauthenticated: we read only what Instagram serves to any
member of the public with no login, no follow relationship, and no access
control bypassed. We return only what Instagram is publicly serving at the
time of the run, and we keep no copy of it after delivery.

**Why we process it and on what legal basis.** Our legal basis is
legitimate interest (Art. 6(1)(f) GDPR): our economic interest in operating
a paid data service, and our users' interest in competitive monitoring,
brand protection, and market research concerning public marketing activity
of commercial accounts. A documented balancing assessment supports this.

**Who receives the data.** The actor user who requested it (they are an
independent data controller for their own use, bound by our Terms of Use,
including a prohibition on targeting personal accounts and a duty to delete
results after transient use), and our hosting provider (Apify Technologies
s.r.o.) as processor.

**How long we keep it.** We do not retain scraped content after
delivery. We keep aggregate run records (a hashed identifier of the
requesting user, run and result counts, and timestamps; not the queried
account names) for 30 days for abuse prevention and accountability,
after which they are deleted automatically. Anonymous statistics that
cannot identify anyone (daily totals of runs, results and costs) are
kept longer. We also keep a technical record of account names and post
links that turned out not to exist, so a repeat request does not pay for
the same failed lookup again; ask us and we will delete yours. Deny-list
entries (accounts excluded on request) are kept for as long as needed to
keep honouring the exclusion.

**Your rights.** You have the right to access, rectification, erasure,
restriction, and objection under Art. 15 to 21 GDPR. Because we do not
retain content, the most effective remedy we offer is exclusion: on request
we add your account to a deny-list: it will not be processed in future
runs, and its username is removed from the mentions, tags and other account
references in the data we deliver. Contact team.intropix@gmail.com. We respond within one month
(Art. 12(3)). You also have the right to lodge a complaint with a
supervisory authority.

**Verification.** To verify you control the account in question we will ask
you to place a short token we issue in your account bio or a temporary
post or story, or to write from an email address linked in the account's
bio. We never ask for identity documents.

# Actor input Schema

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

Public Instagram usernames to fetch posts and reels for (business/creator accounts; see Terms of Use). Leave empty if you only want specific posts from Post and reel links.

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

Links to specific Instagram posts or reels, e.g. https://www.instagram.com/p/<code>/ or /reel/<code>/. Every valid link is delivered: Maximum posts, Posted after/before and Media type only apply to the usernames. Each link is billed as one post, plus one profile scan per distinct account the links belong to.

## `maxPosts` (type: `integer`):

Maximum posts to deliver across all usernames, spent account by account in input order; each account contributes its newest posts, newest first (a carousel counts as one post)

## `sinceDate` (type: `string`):

Only posts on or after this date (YYYY-MM-DD, UTC). Leave empty for no lower bound.

## `untilDate` (type: `string`):

Only posts on or before this date (YYYY-MM-DD, UTC). Leave empty for no upper bound.

## `mediaType` (type: `string`):

Deliver only photo posts, or only video posts. Any media type is the default and delivers everything. Filtered posts are not billed. Maximum posts is a budget for how many posts are READ, not a target for how many you receive. A carousel mixing photos and video is excluded by both filters.

## `includeViews` (type: `boolean`):

Play counts for reels and videos. On by default. Photos and carousels have no view count either way.

## `includeOffGridReels` (type: `boolean`):

Also return reels missing from the profile grid: reels shown only on the reels tab. Off by default. These count towards Maximum posts and are billed like any other post; every item carries is_off_grid so you can filter them.

## `enrichPartners` (type: `boolean`):

Add a profile summary (followers, verified badge, category, account type) for every co-author and sponsor brand on the delivered posts, in each post's `partners` field. Off by default. Billed $0.005 per enriched profile, once per profile per run however many posts it appears on. Paid Apify plans only. Tagged accounts are never enriched.

## Actor input object example

```json
{
  "usernames": [
    "redbull"
  ],
  "maxPosts": 10,
  "mediaType": "any",
  "includeViews": true,
  "includeOffGridReels": false,
  "enrichPartners": false
}
```

# Actor output Schema

## `posts` (type: `string`):

Scraped Instagram posts and reels, one JSON record per post with 54 fixed fields: everything the standard scraper returns plus share and repost counts, music/audio, sponsor brands, tagged accounts, location, owner business and public contact fields, an engagement rate and optional partner profiles. Stored in the run's default dataset.

# 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": [
        "redbull"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("intropix/instagram-posts-reels-scraper-pro").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": ["redbull"] }

# Run the Actor and wait for it to finish
run = client.actor("intropix/instagram-posts-reels-scraper-pro").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": [
    "redbull"
  ]
}' |
apify call intropix/instagram-posts-reels-scraper-pro --silent --output-dataset

```

## MCP server setup

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

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/yaAJuO5BuQuMvfiu9/builds/RVFRugf12UaGDkQP2/openapi.json
