# Instagram Competitor Content: AI Winning Posts Finder (`rich_minds/ig-competitor-winning-posts`) Actor

First 25 winning posts free. Instagram competitor content: pay per qualified post, junk never charged by us — outlier posts with why they won. MCP & AI agents. Free demo on any plan; live search runs on your Apify account, any plan that runs Store Actors.

- **URL**: https://apify.com/rich_minds/ig-competitor-winning-posts.md
- **Developed by:** [Rich Minds](https://apify.com/rich_minds) (community)
- **Categories:** Social media, Marketing, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.20 / 1,000 qualified winning post (rules only)s

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

## Instagram Competitor Content: AI Winning Posts Finder

**Instagram posts that beat their account's median, in your inbox weekly — with why they won.**

⚡ First **25 winning posts free** · 💵 **$0.0032** per winning post · 🤖 **≈ $0.012** per winning post with AI (tokens included) · ⏱️ demo in seconds

![Winning posts ranked by how far they beat their own profile's median — hook, format and the angle to copy](https://api.apify.com/v2/key-value-stores/L30kezxZxGUKX7jJm/records/shortlist.svg)

> **Try it in 30 seconds.** Click **Try it** — 18 sample posts from 3 profiles, their 6 winners in seconds, nothing
> charged. Type competitor profiles, or pick a one-click **preset** (coffee, fitness, skincare, agency), to search live.
> Your first **25 winning posts** are free; the source's scan runs on your Apify account, capped by "Max source spend".
> → [What a run costs](#-pricing--what-a-run-really-costs) · [What the AI adds](#-what-the-ai-tier-adds) · [Run it weekly](#-run-it-weekly)

### ⚡ At a glance

| | |
|---|---|
| **What you get** | Only the posts that beat their own profile's median likes + comments, ranked, with hook, format, pillar and an angle to copy |
| **You provide** | 3–10 competitor Instagram usernames (or profile URLs) |
| **Output** | A ranked sheet — Excel, CSV or Google Sheets — plus an e-mail digest of what is new each run |
| **Typical run** | 10 profiles × 30 posts = 300 scanned → ≈ 36 winning posts (≈ 12 %, estimate until a live run is measured) |
| **Cost of that run** | $0.42 rules only · $0.73 with AI analysis ($0.30 source on your account + 36 × $0.0032 / 36 × $0.009 here + ≈ $0.11 tokens) |
| **Free tier** | First 25 winning posts per account |
| **Keys / setup** | 🔑 No API key where your Apify plan includes model access — otherwise your own Gemini / Groq key (free key: 1–3 AI verdicts per run) |
| **Which plan** | Free demo and your own posts ([list mode](https://api.apify.com/v2/key-value-stores/L30kezxZxGUKX7jJm/records/list-template.json)): any plan · live search: a plan that runs Store Actors — otherwise the run shows the free sample and hands you the list-mode route |
| **Agencies** | Preset *Agency — 3 client niches*: 6 profiles in one run, ≈ $0.18 scan + winners; a `clients` mode is dated 2026-10-31 |
| **Works with** | Schedules, webhooks, Sheets, Slack, Teams, Discord, Make / n8n / Zapier, MCP and AI agents |

### 🎯 What this Actor does

You give it Instagram profiles; it keeps only the winners and charges only for those. For every winning post you get:

- **A fair winner test.** Each post is measured against *its own profile's* median likes + comments, so a small account's breakout is not buried: "6.9× this profile's median".
- **Why it won.** Rule tags on every post — format, caption length, hashtags, opening line (question, number, how-to,
  call to action), weekday and hour — and, with AI, the hook, pillar, call to action and tone, explained.
- **Content ideas from competitors.** With AI and a one-line brand description, each winner gets a remix brief: how your
  brand could adapt the idea. Without AI you still get the rule-based angle to copy.
- **Pillars across the winners.** Winners are grouped into content pillars, so you see which topics keep winning.
- **Only new winners.** Posts you already received are never delivered or charged twice; dead or private profiles are
  reported, and we charge nothing for them (the source's scan runs on your account).

#### Find top performing Instagram posts

Set the outlier multiple (default 2×), minimum likes, post types and the last N days — free filters.

#### Instagram content ideas from competitors

Describe your brand in "Your brand (for the remix brief)": each winner then carries a `remixBrief`, an adaptation of the idea.

### 🚀 How to use it

1. **Click `Try it`** — the form is pre-filled with the free demo on sample posts; it works as is.
2. **Type the competitor profiles** ("Instagram profiles to analyse") and, if you like, the topic you care about — they
   replace the sample and start the live search on your Apify account. Leave "AI assessment" on: your first 5 winning
   posts get live AI verdicts on any plan; all 25 free ones get them with Apify model access or a paid own key.
3. **Press Start and open the dataset** — winners land best-first; export to CSV or Excel, or wire a webhook.
4. **Schedule it weekly** (Actions → Schedule) with your address in "E-mail me the new winning posts" — only new winners
   are delivered and charged.

#### 📦 Already scraping Instagram? Find the winners in your Instagram scraper data

Pick your last scraper run's dataset in **Dataset** — no second scrape, you pay only for the winners
([after every scrape](#-integrations-automation-and-api)).

![Why they won — format, hook, pillar, call to action and posting time per winning post](https://api.apify.com/v2/key-value-stores/L30kezxZxGUKX7jJm/records/analysis.svg)

📚 **Learn more:** [Step-by-step tutorial — find what Instagram content works for competitors](https://api.apify.com/v2/key-value-stores/L30kezxZxGUKX7jJm/records/tutorial.html)

### 🆚 Why this instead of running the scraper yourself?

The Fast Instagram Profile Posts Scraper returns raw rows; the median per profile, the sorting and the "why" are left to you.

| | [Fast Instagram Profile Posts Scraper (`instagram-scraper/fast-instagram-post-scraper`)](https://apify.com/instagram-scraper/fast-instagram-post-scraper) | **This Actor** |
|---|---|---|
| **Price** | $0.001 per post + $0.0005 per run start · 1,289 users / 30 days | from $0.0032 per winning post, first 25 free, no start fee |
| **What you pay for** | every post scraped | only winning posts — the rest costs **$0 here** (the scan is billed on your account, capped) |
| **Same 100 winning posts, all in** | ≈ $0.83 (830 rows), still unsorted | $1.15 rules only · $2.03 with AI (the same $0.83 scan + 100 × $0.0032 / $0.009 + ≈ $0.30 tokens) — ranked, explained, junk costs $0 here |
| **Billing events** | 4: row, `filtered`, `restricted_profile`, run start | 2: basic and AI |
| **Your time per 100 winning posts** | ≈ 10 h sorting by median and reading captions (estimate, not timed) | 0 h — ranked, tagged, explained |
| **Repeat runs** | the same posts again next week | only new winners are delivered and charged |

#### vs other Instagram tools

| | Price | What it gives you | What is missing |
|---|---|---|---|
| **This Actor** | $0.0032 per winning post (AI $0.009) | winners vs each profile's median, why they won, remix brief | follower growth, ads |
| [`davidbenittah/instagram-competitor-content-report`](https://apify.com/davidbenittah/instagram-competitor-content-report) | $0.015 per handle report + $0.005 start · 2 users / 30 days | one report per handle: posts per week, format mix, top 5 posts, hooks | one row per winning post with its multiple, AI why, remix brief, cross-run memory |
| [`night111/instagram-competitor-content-monitor`](https://apify.com/night111/instagram-competitor-content-monitor) | $0.0017 per insight + $0.00004 start · 1 user / 30 days | ranked insights from profile or post records you supply | scanning the profiles for you; a per-profile median |
| [`quanmatrix/instagram-content-competitive-gap-intelligence`](https://apify.com/quanmatrix/instagram-content-competitive-gap-intelligence) | $0.0035 per result · 1 user / 30 days | content gaps and momentum from datasets or public URLs | winners ranked against each profile's own median, per post |
| [`feedminer/instagram-competitor-benchmark`](https://apify.com/feedminer/instagram-competitor-benchmark) | $0.0015 per post + $0.80 start per run · 1 user / 30 days | engagement, cadence, top posts for up to 5 handles | a run under $1 (its start fee alone is $0.80) |

Rival prices and users are from their Store listings, checked 2026-10-04 — each unit differs (report, insight, result, post).

### 💵 Pricing — what a run really costs

Pay per result: **one event per winning post, nothing else.**

| Event | When it is charged | Price |
|---|---|---|
| `free-tier` | your first 25 winning posts on this Actor, in any mode | **$0.00** |
| `qualified-winning-post-basic` | AI off — post fields, baseline, outlier multiple, rule tags | **$0.0032** |
| `qualified-winning-post-ai` | AI on — plus why it won, hook, pillar, call to action, tone, cluster, remix brief | **$0.009** |

**Never charged by us:** posts below the outlier multiple, posts that fail a filter, your exclude list, posts you already
received, dead or private profiles. **The source's scan is not ours to waive** — in live mode the scraper bills your
account per post read, capped by "Max source spend".

**How that compares** — the Store median for this search is $0.00325; $0.0032 is 0.98× it, but only per qualified winning post — one replaces ≈ 8 raw rows: $0.0004 per raw-row equivalent. All in per 100 winners: $1.15 rules only, $2.03 with AI.

**Worked example** — 300 scanned → ≈ 36 winners (≈ 12 %, estimate): source $0.30 on your account + 36 × $0.0032 = **$0.42,
about $0.012 per winning post** with rules only. With AI: $0.30 + 36 × $0.009 + ≈ $0.11 tokens = **$0.73, about $0.020 per
winning post**. Your account's first 25 winners are free, so its first run costs $0.30 + 11 × $0.0032 = $0.34.

**At volume** — an agency watching 10 clients × 5 profiles × 30 posts weekly: 1,500 posts ≈ $1.50 source + ≈ 180 winners
× $0.0032 ≈ $2.10 a week (≈ $9 a month) with rules, ≈ $3.70 a week with AI.

**AI tier, all in:** ≈ $0.012 per winning post ($0.009 here + ≈ $0.003 tokens, an estimate from ≈ 600 tokens in / 200 out
until a platform run measures it) — 3.8× the basic price; the source scan comes on top, ≈ $0.008 per winning post.

### 🤖 What the AI tier adds

The same winning post, AI **off** — facts, baseline and rule tags:

```json
{"name": "@demo_roastery: Why does your espresso taste sour? ☕", "format": "reel", "outlierMultiple": 6.86,
 "flags": ["viral_outlier", "reel_format", "question_hook", "cta_in_caption"], "ruleScore": 89, "label": "hot",
 "whyItWon": null, "remixBrief": null, "pillarCluster": "#coffeetips"}
```

AI **on** (`qualified-winning-post-ai`, $0.009) — the same post, explained and adapted to your brand (a real AI run of
the AI example input on the own-key default model, 2026-10-16):

```json
{"name": "@demo_roastery: Why does your espresso taste sour? ☕", "fitScore": 95, "score": 95, "label": "hot",
 "assessedBy": "ai", "aiModel": "google:gemini-3.5-flash-lite",
 "whyItWon": "The post likely succeeded by pairing a compelling question hook about sour espresso with a quick, actionable fix in a Reel, paired with a clear save call to action.",
 "hookType": "question", "contentPillar": "espresso extraction guide", "cta": "save", "tone": "educational",
 "remixBrief": "Create a quick Reel addressing a common daily habit frustration (like why your morning skincare flakes or your home workout feels ineffective). Open with a direct question, give an instant fix, and prompt viewers to save the guide for later.",
 "pillarCluster": "#coffeetips", "analysisSource": "llm"}
```

The rule tier gives the pattern; only the AI explains the mechanism and writes the adaptation for your brand — about 6
minutes by hand per post, based on our own estimate of reading the caption, comparing it with the median and writing the why and the idea (not yet timed).

<details><summary>Try the AI on any plan</summary>

The free demo shows labelled sample verdicts without model access; your first real search gets **5 live AI verdicts on us**, then "My own API key": a free Gemini key ([aistudio.google.com/apikey](https://aistudio.google.com/apikey)) assesses a few winners per run (the rest keep their rule score, billed as basic); a paid Gemini / Groq key assesses every winner.

</details>

### ⚙️ Input

<details><summary>Main fields and their defaults</summary>

| Field | Type | Default | What it does |
|---|---|---|---|
| `profiles` | string\[] | — | Competitor usernames, `@handles` or profile URLs. Typing them starts the live search. Empty with a topic that names a niche (coffee, fitness, skincare): that niche's preset accounts are searched and listed in `OUTPUT.profilesSuggested` |
| `outlierMultiple` | number | `2` | A post wins at this many times its profile's median likes + comments |
| `recentDays` | integer | `30` | Only winners posted in the last N days (0 = any age); the baseline always uses the latest posts |
| `postsPerProfile` | integer | `30` | Posts the source reads per profile (minimum 5) — about $0.001 each on your account |
| `focusTopic` | string | — | The topic the AI weighs relevance against |
| `minScore` | 0–100 | `30` | The field that decides what you pay: below this = not delivered, not charged (45 ≈ 2× the median, 70 ≈ 4×) |
| `maxQualified` | integer | `100` | Hard cap on winners (and on what this Actor charges) |
| `maxDiscoveryChargeUsd` | number | `0.5` | Stops the source run once it has cost this much — the same cap in the form and for an API call |
| `enableAi` | boolean | `true` | AI analysis on / off |
| `sourceMode` | `actor` | `dataset` | `list` | `actor` | Where posts come from (the form starts on the free `list` demo). With nothing to search — `{}` over the API — the free demo runs: nothing charged, the source is never started |
| `dedupeAcrossRuns` | boolean | `true` | Only new winners are delivered and charged |

Delivery: `notifyEmail` and **Send alerts to** (`sendAlertsTo`) — paste Slack, Discord, Teams, Google Chat, Telegram or
webhook URLs, one per line; headers, batching and the signing secret (`webhookSecret`) sit under *Delivery details
(advanced)*. All other options are in the **Input** tab, plain typed fields.

</details>

The full list of `targetFlags` values — [flags and presets](https://api.apify.com/v2/key-value-stores/L30kezxZxGUKX7jJm/records/api-reference.md) — an unknown name stops the run with the valid ones.

### 📤 Output

One dataset item per winning post — export as JSON, CSV or Excel, or stream it to a webhook. Views: `Shortlist` (best
first), `Score breakdown`, `Why they won`, `Remix briefs`, `Baseline maths`, `Export`.

<details><summary>Webhook body and retries</summary>

**Webhook:** `webhookBatchSize: 1` POSTs `{"event": "post.qualified", "post": {…}, "runId": "…"}` per winning post; a larger size POSTs `{"event": "posts.qualified", "posts": [{…}, …], "runId": "…"}` per batch. With `webhookSecret` every POST carries `X-Signature: sha256=<HMAC-SHA256 of the raw body>`. A 429 / 5xx / network error is retried once after 2 s; a POST that still fails never fails the run — it is counted in `OUTPUT.webhook.failed` with its rows' `dedupeKey`s in `OUTPUT.webhook.failedKeys`, and is not re-sent next run (it was delivered and charged).

</details>

An example row: API reference.

#### Output fields

<details><summary>Every field of a row</summary>

| Field | Description |
|---|---|
| `itemId`, `name`, `url`, `shortcode`, `username`, `profileUrl`, `fullName`, `isVerified` | The post (`url` is its own page) and who posted it; `null` when unreported |
| `format`, `caption`, `hashtags`, `mentions`, `taggedUsers`, `locationName`, `audioTitle`, `coauthors`, `thumbnailUrl` | Post content (cover links expire in days) |
| `likes`, `comments`, `views`, `videoDurationSec`, `hasAudio`, `commentsDisabled`, `postedAt`, `crawledAt` | Counts and dates as the source reported them, never estimated |
| `engagement`, `profileMedianEngagement`, `outlierMultiple`, `baselineWeak` | likes + comments, the profile's median, their ratio, fewer than 5 posts |
| `hookPattern`, `captionLength`, `hashtagCount`, `postWeekday`, `postHourUtc`, `flags`, `targetFlagsMatched` | Free rule tags and your matched flags |
| `ruleScore`, `fitScore`, `score`, `label`, `assessedBy` | Rule score, AI score, ranking score, hot / warm / cold, and which scale `score` is on (`ai` / `sample` / `rules`). Trend across runs on `ruleScore`; `score` is the AI fit where `aiModel` is set, else the rule score |
| `scoreReasons`, `whyItWon`, `hookType`, `contentPillar`, `cta`, `tone`, `remixBrief` | AI analysis (`null` with AI off); `remixBrief` needs a brand description |
| `pillarCluster`, `analysisSource`, `generatedText` | Pillar group, `llm` / `rule`, the line to act on |
| `aiModel`, `chargedEvent`, `billedAs`, `dedupeKey`, `source`, `scrapedAt` | Provenance and billing (`already-charged`: paid for under another search of the same memory, not charged again) |

</details>

**Upsert key for a CRM or Sheet:** `dedupeKey` — `sc:` plus the post's shortcode, so one post is one row however many
runs or profile lists find it; `itemId` is a hash of the same key.

A Slack / e-mail-ready **`DIGEST`** (new and hot counts, **what changed since the last run** — "vs last run: qualified 41 → 55, hot 5 → 9" — and the top 10 with links) and a client-ready **`REPORT`** page sit next to `OUTPUT` after every run that delivered; forward `OUTPUT.reportUrl`. `OUTPUT` is the full run record — see the API reference.

⭐ **Found it useful? A review on the Store helps others find it.**

### 🔁 Run it weekly

1. **Open the saved task and click Schedule** after your first real run — the run saves your search as a task on your
   account and links it in its status (`OUTPUT.scheduleTaskUrl`; nothing is scheduled until you click). Put your address
   in "E-mail me the new winning posts": every run with new winners e-mails you the digest and the trend vs the last run.
2. Leave "Never output the same winning post twice" on: the next run delivers and charges **only what is new**. The memory
   is kept per source, not per topic wording or profile list — add a profile and the schedule keeps its memory; for
   several clients give each its own dedupe store name.
3. Send the digest to Slack, Teams, Google Chat or Discord with a webhook URL; the rows reach Sheets or your CRM through a
   Make / n8n / Zapier "create or update row" step on the webhook (columns as in the [tracker template](https://api.apify.com/v2/key-value-stores/L30kezxZxGUKX7jJm/records/tracker.csv),
   upsert on `dedupeKey`) — no weekly import; a native CRM push is dated in the roadmap.

<details><summary>History, weekly cost and what is new each week</summary>

4. From the second run on, `OUTPUT.history` and the `REPORT` page show every run (winners, hot ones, median multiple),
   and a scheduled run's date window covers the time since the last run (`OUTPUT.scheduledSizing`). A running log
   (`historyDatasetName`) keeps every winner, dated, in one named dataset.

Weekly cost is new winners only: 10 profiles × 30 posts → $0.30 source + ≈ 8 new winners × $0.0032 ≈ $0.33 a week with rules; week 1 shows ≈ 12 % winners, afterwards only posts published since the last run can be new.

</details>

#### 🎯 Try it for your niche

Pick a niche in **Start from a ready niche search** at the top of the form and press Start, run it once, then schedule it.

<details><summary>The ready niche searches</summary>

| Niche | Start |
|---|---|
| Agency — 3 client niches | preset *Agency* |
| Coffee, fitness, skincare brands | preset inputs |

</details>

### 🔌 Integrations, automation and API

**After every `instagram-scraper/fast-instagram-post-scraper` run:** its Integrations tab → "Run succeeded → start this
Actor" with `sourceMode: dataset`, `datasetId` = `resource.defaultDatasetId`, `enableAi: false` — rules only.

#### Run outcomes — what your integration sees

<details><summary>Outcome table</summary>

| Outcome | Run status | `OUTPUT` | Charged? |
|---|---|---|---|
| Success / free demo | SUCCEEDED | `outcome: ok`, funnel, `chargedEvents`, `aiCoverage` | per winning post / no |
| Nothing matched | SUCCEEDED | `outcome: empty`, `qualified: 0` | not by us — a live search's source scan runs on your plan (≈ $0.001 per post read) |
| Your plan cannot run the source Store Actor | SUCCEEDED — the same for the Console, the API and a schedule; check `OUTPUT.ok` | `ok: false`, `outcome: source_refused`, `sourceRefused: plan` (the free sample is shown) | no |
| Source failed (nothing loaded, or its fields were renamed) | FAILED | `ok: false`, `outcome: source_failed`, `sourceError` | no |
| Source partial (timed out / aborted after scraping) | SUCCEEDED | `sourceStatus` (`partial: true`) | per winning post |
| Invalid input | FAILED | — | no |

</details>

Every outcome with what to do, webhook, Sheets, CRM and AI-agent recipes (free first call `{}` or `sourceMode: list`; upsert on `dedupeKey`): API reference.

<details><summary>API snippets — Python and JavaScript</summary>

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("rich_minds/ig-competitor-winning-posts").call(
    run_input={
        # free first call instead: {"sourceMode": "list", "itemsList": [...]} (any plan) or {} (the demo)
        "sourceMode": "actor",
        "profiles": ["bluebottle", "intelligentsia", "stumptowncoffee"],
        "postsPerProfile": 30,
        "outlierMultiple": 2,
        "focusTopic": "brewing education for home baristas",
        "maxQualified": 50,
        "maxDiscoveryChargeUsd": 0.5,  # spend cap on your account for the source's scan
    },
    timeout_secs=3600,  # sized for the AI path with your own key — see "How long does a run take?"
    # build="0.1.5",  # pin the build number your pipeline was tested with (Changelog below); omit for the latest
)
out = client.key_value_store(run["defaultKeyValueStoreId"]).get_record("OUTPUT")["value"]
if out.get("sourceError"):  # a plan refusal ends SUCCEEDED with 0 rows — never read it as "nothing new"
    raise RuntimeError(out["sourceError"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["url"], item["score"], item["label"])
```

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });
const run = await client.actor('rich_minds/ig-competitor-winning-posts').call({
    // free first call instead: { sourceMode: 'list', itemsList: [...] } (any plan) or {} (the demo)
    sourceMode: 'actor',
    profiles: ['bluebottle', 'intelligentsia', 'stumptowncoffee'],
    postsPerProfile: 30,
    outlierMultiple: 2,
    focusTopic: 'brewing education for home baristas',
    maxQualified: 50,
    maxDiscoveryChargeUsd: 0.5, // spend cap on your account for the source's scan
}, { timeout: 3600 /* , build: '0.1.5' — pin the build number your pipeline was tested with */ });
const out = (await client.keyValueStore(run.defaultKeyValueStoreId).getRecord('OUTPUT')).value;
if (out.sourceError) throw new Error(out.sourceError); // a plan refusal ends SUCCEEDED with 0 rows, not "nothing new"
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.map((i) => [i.url, i.score, i.label]));
```

</details>

**Use it from Claude, ChatGPT or any MCP client** — add Apify's MCP server with this Actor as a tool:

```json
{"mcpServers": {"apify": {"url": "https://mcp.apify.com/?actors=rich_minds/ig-competitor-winning-posts"}}}
```

**Minimal agent input** — every other input keeps its default:

```json
{"profiles": ["bluebottle", "intelligentsia"], "outlierMultiple": 2, "recentDays": 7, "dedupeAcrossRuns": false, "maxQualified": 50, "maxDiscoveryChargeUsd": 0.5}
{"sourceMode": "list", "itemsList": [{"shortcode": "…", "like_count": 900, "comment_count": 80, "user": {"username": "…"}}]}
```

The second line is the any-plan, no-source-run path.

**Which call runs what:** `{}` and the untouched form are the free demo, typed `profiles` start the live search; every run writes `OUTPUT.mode` — table in the [API reference](https://api.apify.com/v2/key-value-stores/L30kezxZxGUKX7jJm/records/api-reference.md).

### 👥 Who is it for?

| You are… | You run it to… | Start with |
|---|---|---|
| Social media manager tracking 5–50 competitor accounts | see what content worked this week and why | the niche preset closest to you, scheduled weekly |
| Content agency or brand marketer | brief clients with proven angles and remix ideas | preset *Agency*, then one task per client with its own dedupe store name |
| Creator researching a niche | find the formats and hooks that break out | 5 profiles, post type `reel`, outlier multiple 3 |
| AI agent or n8n workflow | get typed winners with scores and reasons | the minimal agent input above |

### 🧠 How the AI works

Every number and claim is grounded in the post the model saw; if it fails the run continues on rule scores.

Full detail — grounding rules, pillars, token use, fallback: API reference.

### 🔒 Data, compliance and limits

- Public Instagram posts only, read by the source scraper without a login — no private accounts. Follow Instagram's terms
  and applicable law (GDPR, CCPA) for your use.
- Hidden likes and missing view counts stay `null`, never estimated; a profile needs 2 loaded posts for a median (fewer than 5 is flagged `weak_baseline`).
- Cover-image links (`thumbnailUrl`) expire after a few days.

### ❓ FAQ

**What will my first real search cost?** 3 profiles × 30 posts ≈ $0.09 on your account (capped at $0.50 in the form) and
≈ 11 winners, all free — your first 25 winning posts are free.

**Which Instagram competitor posts are worth copying?** Instagram outlier posts — far above their own profile's median. Run their profiles and read the Why they won view: the hook pattern,
format, pillar and posting time that repeat across winners are the answer for your niche.

**Is this an Instagram profile posts scraper?** Not a raw one — it runs the Fast Instagram Profile Posts Scraper
(`instagram-scraper/fast-instagram-post-scraper`) on your account and adds the baseline, filter, analysis and memory.

**Will I be charged for the same post twice?** No, with "Never output the same winning post twice" on (default): every
charged post is remembered by shortcode in a key-value store on your account. Adding or removing a profile keeps that memory;
another source and each dedupe store name keep their own. Each set of tag or post-type filters keeps its own list, but a
post already paid for under another search of the same store is delivered as `already-charged`, never charged again. A post
is delivered again only after `dedupeTtlDays` days (0, the default, never).

#### List-mode rows

<details><summary>What a pasted post needs</summary>

[Ready template](https://api.apify.com/v2/key-value-stores/L30kezxZxGUKX7jJm/records/list-template.json) — rows come in the source scraper's shape:

| Field | Needed? | What it enables |
|---|---|---|
| `shortcode` or `post_url` | required | identity, link, dedupe key |
| `user.username` | required | the profile it is compared with |
| `like_count`, `comment_count` | required | engagement, outlier multiple |
| `caption`, `hashtags`, `type`, `date` | optional | hook, format, posting time, AI analysis |
| `view_count`, `video_duration`, `mentions`, `usertags`, `images`, `location.name`, `user.full_name`, `user.is_verified` | optional | the matching output fields |

</details>

<details><summary>More questions: costs, run time, plans, free units, safety, models, legality</summary>

**How much will one run cost me?** 10 profiles × 30 posts ≈ $0.30 source on your account + $0.0032 per winner here ($0.009 with AI + ≈ $0.003 tokens): about $0.42 with rules and $0.73 with AI for ≈ 36 winners; the first 25 are free.

**How long does a run take?** One row per mode — size `timeoutSecs` from it:

| Mode | Time | `timeoutSecs` to pass |
|---|---|---|
| Free demo (18 sample posts) | a few seconds | 120 |
| Your own posts (`list` / `dataset`), rules only | seconds (estimate) | 300 |
| Live search, rules only | the source's read of 300 posts, a minute or two (estimate) | 900 |
| AI via Apify's model access | ≈ 10–25 s per call, 8 at a time (estimate) | 1800 |
| AI with a free own key | a few winners per run — the AI stops after 2 minutes of rate-limit waiting, the rest rule-scored | 900 |
| AI with a paid own key | calls run 2 at a time (estimate) | 3600 |

Worst case, 100 winners and a rate-limited own key: source minutes + about 2 minutes of AI waiting (`OUTPUT.timing.aiBackoffSecs`) + seconds of rules; the rest is rule-scored and pushed. Every run reports its phases in `OUTPUT.timing`.

**Which Apify plan do I need?** Any plan runs the free demo. The live search and the built-in AI need a plan that can run
Store Actors; on any other plan the run shows the free sample and you paste posts in `list` mode, with "My own API key" —
a free Gemini / Groq key assesses a few winners per run, a paid key every winner.

**Do rule-scored winners use my free ones?** Yes while the AI is unavailable — except the last 5 (`OUTPUT.chargeSplit.freeKeptForAi`), kept for your first AI-analysed winners.

**What happens if nothing matches my filters?** The run succeeds with 0 rows and charges nothing here; the status says so.

**How do I send the openers safely?** The remix briefs are ideas, not copy: write your own caption, shoot your own media, never repost a
competitor's photo or video. If you turn an angle into a message, send it by hand — a few a day from an established
account, no links or off-platform IDs in a first message, paid collaborations through Instagram's official channel. The Actor sends no direct messages.

**Can I use my own model, and what if the AI fails?** Yes: "My own API key", or any OpenRouter slug in "AI model". If the
model fails, the post keeps its rule score and tags at the basic price (free while your free winners last); the run never fails.

</details>

### 🧩 More Actors from the same developer

Not quite your use case? The same pay-per-qualified-result model, closest to this Actor's buyers first:

- **[YouTube Outlier Videos Finder](https://apify.com/rich_minds/youtube-video-research-ai)** — The same winner-versus-baseline test for competitors' YouTube videos.
- **[Facebook Ad Library Winning Ads Finder](https://apify.com/rich_minds/fb-ad-library-winning-ads)** — Your competitors' longest-running Facebook ads, broken down.
- **[Facebook Page Post Tracker](https://apify.com/rich_minds/fb-page-post-tracker)** — The same weekly winners-and-why digest for the Facebook pages you track.
- **[Website Change Monitor](https://apify.com/rich_minds/website-change-monitor-ai)** — Every real change on competitors' pages, in your inbox weekly.

<details><summary>All 19 Actors from the same developer</summary>

- **[Trending Keywords for Your Niche](https://apify.com/rich_minds/trending-keywords-ai)** — New trending keywords and Black Friday peaks, weekly.
- **[Link Building Prospects & Guest Post Finder (Google, AI)](https://apify.com/rich_minds/link-building-prospects-ai)** — Guest-post and resource-page sites for your keywords, with a checked e-mail and a first line.
- **[Reddit Brand Monitoring](https://apify.com/rich_minds/reddit-brand-monitoring-ai)** — Every new Reddit mention of your brand — ranked, with the one to answer first.
- **[Zillow Deal Finder](https://apify.com/rich_minds/zillow-deal-finder-ai)** — New cash-flowing Zillow deals in your inbox every morning, scored 0–100 with AI memos.
- **[Twitter Lead Generation](https://apify.com/rich_minds/twitter-lead-generation-ai)** — People on X asking for a tool like yours — with a reply draft, every week.
- **[Spotify Artist Scout – Monthly Listeners, Play Counts, AI Score](https://apify.com/rich_minds/spotify-artist-scout-ai)** — New emerging artists worth signing — scored, explained and pitched — in your inbox every week.
- **[Local Business Leads](https://apify.com/rich_minds/local-business-lead)** — Local businesses with a checked contact and an AI opener, ready to pitch.
- **[Google Reviews Analysis AI](https://apify.com/rich_minds/google-reviews-insights)** — Google reviews analysis per business: recurring complaints, praise, owner reply rate, a reputation-risk score, verified contacts and an AI opener.
- **[Instagram Influencer Finder](https://apify.com/rich_minds/instagram-creator-qualifier)** — Instagram influencer finder (and TikTok) by hashtag, niche or lookalike — engagement rate, audience quality, contact e-mail and an AI opener per creator.
- **[Threads Brand Monitoring](https://apify.com/rich_minds/threads-brand-monitoring-ai)** — Every new Threads post about your brand, ranked — the one to answer first, every week.
- **[Xiaohongshu KOL Finder](https://apify.com/rich_minds/xiaohongshu-kol-finder-ai)** — New RedNote creators who fit your brand, vetted in English, in your inbox every week.
- **[LinkedIn Buying Intent Leads](https://apify.com/rich_minds/linkedin-intent-leads)** — LinkedIn buying intent leads: people asking for a product like yours.
- **[Email List Cleaner](https://apify.com/rich_minds/email-list-qualifier-ai)** — Every week, only the emails worth sending — domain-checked, on-ICP, billed per keeper.
- **[Truth Social Alerts](https://apify.com/rich_minds/truth-social-alerts-ai)** — New Trump posts that matter to your trades, tagged and pushed to you within minutes.
- **[1688 Supplier Finder](https://apify.com/rich_minds/1688-supplier-finder-ai)** — New trusted 1688 factories for your product — costed and translated, in your inbox every week.

</details>

### 🆘 Support

Something missing or wrong? Open an issue on the Actor's page or message the developer through the Apify Console.

### 📝 Changelog

One line per published build, newest first — what changed for you: output, status messages, prices.

- **0.1.5** (2026-10-16) — One "Send alerts to" box takes your Slack, Discord, Teams, Google Chat, Telegram or webhook links, and webhooks can now be signed, with any posts that failed to arrive named in the run results (webhook keys are now `post` / `posts`); A post you already paid for under another profile list or filter set is delivered again but never charged twice, and AI-checked winners now lead their tier with a "Scored by" column; If the source scraper changes its output, the run now stops with a clear reason and charges nothing, instead of finishing empty; and your own Gemini key works with the model field left empty.
- **0.1.4** (2026-10-04) — a plan that blocks the source scraper now shows the free sample winners and the any-plan next step, not 0 rows.
- **0.1.3** (2026-10-04) — shorter page; webhook and "source partial" outcomes spelled out.
- **0.1.2** (2026-10-04) — every row carries all its fields (empty when Instagram does not report them); an Agency preset.
- **0.1.1** (2026-10-04) — initial release: winners versus each profile's median, rule tags, AI analysis with remix brief and pillars, cross-run memory, weekly digest.

# Actor input Schema

## `profiles` (type: `array`):

Competitor or niche Instagram accounts: usernames (<code>nike</code>), <code>@handles</code> or profile URLs, one per line — 3 to 10 work best. Typing here starts the <b>live search</b>: it runs the source scraper on your own Apify account (any plan that runs Store Actors) and costs about $0.001 per post read — the free demo does not search them.

## `focusTopic` (type: `string`):

Plain words: what content you want to learn from, e.g. <i>coffee brewing tips for home baristas</i>. The AI weighs each winning post's relevance against it.

## `brandDescription` (type: `string`):

One or two sentences about your brand or product. With the AI on, every winning post gets a remix brief: how you could adapt its idea. Empty = no remix brief.

## `preset` (type: `string`):

Pick a niche and press Start: it fills the search fields you left empty and runs the live search (spend-capped by <code>maxDiscoveryChargeUsd</code>). Your own values always win. <b>Custom</b> = fill the fields yourself.

## `minScore` (type: `integer`):

The field that decides what you pay: winning posts scoring below this are discarded and <b>not charged</b>. Score 45 ≈ 2× the profile's median, 70 ≈ 4×. Affects what you pay.

## `maxQualified` (type: `integer`):

Hard cap on results — and the ceiling of what <b>this Actor</b> charges: at most this many × $0.009 with AI on (× $0.0032 with AI off), e.g. 100 × $0.009; the source's own spend has its cap right below. The best-scoring winning posts are output first.

## `maxDiscoveryChargeUsd` (type: `number`):

Hard cap on what the source Actor run may charge your account in <b>actor</b> mode — $0.50 in the form and for an API or agent call that leaves it out, so a first real search can never cost more. Raise it for bigger searches.

## `enableAi` (type: `boolean`):

Score each winning post against your goal, explain why, summarise it and generate text. <b>On = $0.009 per qualified winning post + AI tokens; off = $0.0032</b> (rule-based flags and scores only). Your first 5 winning posts get live AI verdicts on any plan; every one with Apify model access or a paid own key.

## `notifyEmail` (type: `string`):

After every run with at least one new winning post, the run's digest (how many are new, the top 10 with links) is e-mailed here through Apify's send-mail Actor. Schedule the run weekly (Actions → Schedule) and only the new winning posts come to your inbox — no Slack or Zapier needed. Never sent for the free demo.

## `outlierMultiple` (type: `number`):

A post wins when its likes + comments are at least this many times the profile's own median. 2 = twice as good as usual. Higher = fewer, stronger winners. Affects what you pay: only winners are charged.

## `recentDays` (type: `integer`):

0 = any age. Applies to the winners only — the baseline always uses each profile's latest posts, so a short window never weakens it. A scheduled run uses the days since its last run. Affects what you pay.

## `postsPerProfile` (type: `integer`):

How many of each profile's latest posts the source reads (minimum 5). More posts = a steadier median, but the source bills about $0.001 per post on your account: 10 profiles × 30 posts ≈ $0.30. Affects what you pay.

## `minLikes` (type: `integer`):

Winners with fewer likes are dropped for free (not charged). 0 = no minimum. Affects what you pay.

## `postTypes` (type: `array`):

Keep only these formats: <code>reel</code>, <code>image</code>, <code>carousel</code>. Empty = all.

## `targetFlags` (type: `array`):

Only deliver winning posts that have at least one of these tags. An API call passes the flag names, e.g. <code>question_hook</code>, <code>reel_format</code>, <code>how_to_hook</code>, <code>cta_in_caption</code> (<code>questionHook</code> works too); the README's flag table lists them all. Leave empty to keep every winner. An unknown name stops the run at once with the list of valid ones.

## `suppressionList` (type: `array`):

Usernames, post URLs or shortcodes to never output. Suppressed winning posts are skipped before any processing and never charged.

## `llmProvider` (type: `string`):

<b>Apify (no keys)</b> — the AI runs through Apify's built-in OpenRouter proxy; tokens are billed to your Apify account at OpenRouter's rates. <b>My own key</b> — use your OpenAI / Anthropic / Gemini / Groq key instead; a free-tier key assesses only a few winning posts per run — expect 1–3 AI checks (2 calls at a time, one after a rate limit, then the 3 borderline winning posts retried one by one) — and the rest keep their rule score; a paid Groq / Gemini key (billing on) assesses every winning post.

## `llmModel` (type: `string`):

Leave empty for the default: <code>anthropic/claude-haiku-4.5</code> through Apify, <code>google:gemini-3.5-flash-lite</code> with your own key (a free Gemini key works as is). Apify mode takes an OpenRouter slug such as <code>openai/gpt-4.1-mini</code>; own-key mode takes <code>provider:model</code>, e.g. <code>anthropic:claude-haiku-4-5-20251001</code> or <code>groq:openai/gpt-oss-120b</code>.

## `llmApiKey` (type: `string`):

Required when <b>AI model access</b> is <i>My own API key</i>. Stored encrypted by Apify, never logged.

## `aiCandidateMultiplier` (type: `integer`):

How many of the best rule-scored candidates get the AI pass, as a multiple of <b>Max qualified</b>. Higher = more thorough, slower, more tokens.

## `sendAlertsTo` (type: `string`):

Paste one or more URLs, one per line — the service is detected from the address: a Slack or Discord channel webhook, a Teams Workflows or Google Chat space webhook, your Telegram bot's send link (<code>https://api.telegram.org/bot\<token>/sendMessage?chat_id=@yourchannel</code>) or any other https URL (Zapier, Make, n8n, your CRM), which gets the winning posts as JSON. After every run with at least one new winning post, the digest (how many are new, the top 10 with links) is posted there. Never sent for the free demo. Headers, batching and signing: <i>Delivery details (advanced)</i>.

## `dedupeAcrossRuns` (type: `boolean`):

Remembers every winning post you were charged for (in a named key-value store on your account) and skips it in future runs.

## `dedupeTtlDays` (type: `integer`):

How long a delivered winning post stays remembered. 0 = never deliver or charge it again. A number of days lets a winning post that comes back (a seasonal peak, a relisted item) reach you again after that many days — charged again as a new winning post.

## `historyDatasetName` (type: `string`):

Optional. Type a name (e.g. <code>ig-competitor-winning-posts-seen-log</code>) and every run appends its new winning posts with the date to that named dataset on your account — one list across months to connect to Google Sheets or your BI tool once. Empty = off. Costs nothing extra.

## `sourceMode` (type: `string`):

<b>actor</b> — run <code>instagram-scraper/fast-instagram-post-scraper</code> on your account, billed separately. <b>dataset</b> — an existing Apify dataset. <b>list</b> — records you paste in. <b>Bring your own data:</b> rows or a dataset ID, and you pay only for the analysis — the source Actor is never run. The mode you choose always runs as chosen; only the untouched sample records next to a search you typed switch to the live search (spend-capped). <code>{}</code> over the API runs the free demo — nothing charged.

## `autoSwitchToLive` (type: `boolean`):

API only — hidden on the form, where it stays on. On (default): search terms typed next to the untouched sample records start the live search (spend-capped; <code>OUTPUT.switchedToLive</code> names them). Off: the mode you send is the mode that runs — the sample stays the free demo and the status names the terms it did not search. API pipelines that must never start a paid read on their own: send <code>false</code>.

## `datasetId` (type: `string`):

Only for <b>dataset</b> mode. Pick the dataset so the Actor is granted read access to it.

## `itemsList` (type: `array`):

Only for <b>list</b> mode. JSON array of posts in the source scraper's shape: <code>shortcode</code>, <code>caption</code>, <code>like_count</code>, <code>comment_count</code>, <code>date</code>, <code>user.username</code> … (README → List-mode rows). Needs at least 2 posts per profile.

## `discoveryActorId` (type: `string`):

Actor used in <b>actor</b> mode. Any Actor whose output has the fields listed in the README works.

## `discoveryInput` (type: `object`):

Only for <b>actor</b> mode. Extra input passed to the source Actor as-is (its <code>instagramUsernames</code> come from <b>Instagram profiles</b>; <code>postsPerProfile</code> from <b>Posts to read per profile</b>). The live search runs that Store Actor on your Apify plan — if your plan cannot run Store Actors, paste your own posts in <b>list</b> mode (any plan); <b>dataset</b> only for a dataset you already have from another account or tool.

## `maxToProcess` (type: `integer`):

Upper bound on how many winning posts are scored in one run (controls run time). Default = 3 × max winning posts.

## `webhookUrl` (type: `string`):

Qualified winning posts are POSTed here as JSON (Zapier, Make, n8n, your CRM). For Google Sheets / Slack you can also use Apify's built-in Integrations tab. Stored encrypted — Zapier / Make hook URLs carry their secret in the path.

## `webhookHeaders` (type: `object`):

Extra HTTP headers for the webhook, e.g. <code>{"Authorization": "Bearer …"}</code>. Stored encrypted by Apify, never logged.

## `webhookBatchSize` (type: `integer`):

1 = one POST per winning post the moment it is ready. Higher = one POST per N winning posts.

## `webhookSecret` (type: `string`):

Any random string. Every webhook POST then carries <code>X-Signature: sha256=\<HMAC-SHA256 of the raw body with this secret></code>, so your endpoint can verify it came from this Actor. Stored encrypted by Apify, never logged.

## `dedupeStoreName` (type: `string`):

Key-value store used for cross-run memory. Left at the default, the memory is kept per search (source and search terms): rewording <code>focusTopic</code> keeps it, so a scheduled run never re-delivers what you already have, and another search starts its own list. Running it for several clients on one account, type one name per client.

## `discoveryTimeoutSecs` (type: `integer`):

API only — hidden on the form. How long the source Store Actor may run before its partial results are used. Raise it when the status says the source stopped early.

## `slackWebhookUrl` (type: `string`):

API only — hidden on the form, where <code>sendAlertsTo</code> takes it. Slack incoming-webhook URL for the digest.

## `discordWebhookUrl` (type: `string`):

API only — hidden on the form, where <code>sendAlertsTo</code> takes it. Discord channel webhook URL for the digest.

## `teamsWebhookUrl` (type: `string`):

API only — hidden on the form, where <code>sendAlertsTo</code> takes it. Teams Workflows webhook URL for the digest.

## `googleChatWebhookUrl` (type: `string`):

API only — hidden on the form, where <code>sendAlertsTo</code> takes it. Google Chat space webhook URL for the digest.

## `telegramUrl` (type: `string`):

API only — hidden on the form, where <code>sendAlertsTo</code> takes it. The bot's sendMessage link with its chat_id.

## Actor input object example

```json
{
  "preset": "custom",
  "minScore": 30,
  "maxQualified": 100,
  "maxDiscoveryChargeUsd": 0.5,
  "enableAi": true,
  "outlierMultiple": 2,
  "recentDays": 30,
  "postsPerProfile": 30,
  "minLikes": 0,
  "llmProvider": "apify",
  "aiCandidateMultiplier": 2,
  "dedupeAcrossRuns": true,
  "dedupeTtlDays": 0,
  "historyDatasetName": "",
  "sourceMode": "list",
  "autoSwitchToLive": true,
  "itemsList": [
    {
      "shortcode": "rA1x2Y3z4",
      "post_url": "https://www.instagram.com/p/rA1x2Y3z4/",
      "type": "Video",
      "product_type": "clips",
      "caption": "Why does your espresso taste sour? ☕\nIt's almost never the beans — it's your grind. Here's the 10-second fix.\nSave this for your next shot.",
      "hashtags": [
        "espresso",
        "coffeetips",
        "homebarista",
        "coffeelover"
      ],
      "like_count": 3100,
      "comment_count": 210,
      "view_count": 41200,
      "date": "2026-09-26T08:15:00+00:00",
      "user": {
        "username": "demo_roastery",
        "full_name": "Demo Roastery",
        "is_verified": false
      },
      "from_url": "https://www.instagram.com/demo_roastery/",
      "comments_disabled": false
    },
    {
      "shortcode": "rB2y3Z4a5",
      "post_url": "https://www.instagram.com/p/rB2y3Z4a5/",
      "type": "Sidecar",
      "product_type": "carousel_container",
      "caption": "5 brew ratios every home barista should know\nSwipe through, then try number 3 tomorrow morning.",
      "hashtags": [
        "brewing",
        "coffeetips",
        "homebarista"
      ],
      "like_count": 1150,
      "comment_count": 100,
      "view_count": null,
      "date": "2026-09-22T17:40:00+00:00",
      "user": {
        "username": "demo_roastery",
        "full_name": "Demo Roastery",
        "is_verified": false
      },
      "from_url": "https://www.instagram.com/demo_roastery/",
      "carousel_media_count": 5,
      "comments_disabled": false
    },
    {
      "shortcode": "rC3z4A5b6",
      "post_url": "https://www.instagram.com/p/rC3z4A5b6/",
      "type": "Image",
      "product_type": "feed",
      "caption": "New single origin just landed: Ethiopia Guji, notes of peach and jasmine.",
      "hashtags": [
        "singleorigin",
        "coffee"
      ],
      "like_count": 395,
      "comment_count": 25,
      "view_count": null,
      "date": "2026-09-18T09:05:00+00:00",
      "user": {
        "username": "demo_roastery",
        "full_name": "Demo Roastery",
        "is_verified": false
      },
      "from_url": "https://www.instagram.com/demo_roastery/",
      "comments_disabled": false
    },
    {
      "shortcode": "rD4a5B6c7",
      "post_url": "https://www.instagram.com/p/rD4a5B6c7/",
      "type": "Image",
      "product_type": "feed",
      "caption": "Saturday at the roastery. Come say hi until 4 pm.",
      "hashtags": [
        "roastery",
        "coffee"
      ],
      "like_count": 440,
      "comment_count": 30,
      "view_count": null,
      "date": "2026-09-13T11:20:00+00:00",
      "user": {
        "username": "demo_roastery",
        "full_name": "Demo Roastery",
        "is_verified": false
      },
      "from_url": "https://www.instagram.com/demo_roastery/",
      "comments_disabled": false
    },
    {
      "shortcode": "rE5b6C7d8",
      "post_url": "https://www.instagram.com/p/rE5b6C7d8/",
      "type": "Video",
      "product_type": "clips",
      "caption": "Behind the scenes: roast day.",
      "hashtags": [
        "roasting",
        "coffee"
      ],
      "like_count": 460,
      "comment_count": 35,
      "view_count": 7800,
      "date": "2026-09-09T14:00:00+00:00",
      "user": {
        "username": "demo_roastery",
        "full_name": "Demo Roastery",
        "is_verified": false
      },
      "from_url": "https://www.instagram.com/demo_roastery/",
      "comments_disabled": false
    },
    {
      "shortcode": "rF6c7D8e9",
      "post_url": "https://www.instagram.com/p/rF6c7D8e9/",
      "type": "Image",
      "product_type": "feed",
      "caption": "Our autumn blend is back.",
      "hashtags": [
        "autumn",
        "coffee"
      ],
      "like_count": 420,
      "comment_count": 45,
      "view_count": null,
      "date": "2026-09-04T10:30:00+00:00",
      "user": {
        "username": "demo_roastery",
        "full_name": "Demo Roastery",
        "is_verified": false
      },
      "from_url": "https://www.instagram.com/demo_roastery/",
      "comments_disabled": false
    },
    {
      "shortcode": "fA1x2Y3z4",
      "post_url": "https://www.instagram.com/p/fA1x2Y3z4/",
      "type": "Video",
      "product_type": "clips",
      "caption": "How to do your first pull-up in 4 weeks 💪\nNo gym needed — just a door frame and a towel.\nComment PULL and I'll send you the plan.",
      "hashtags": [
        "pullup",
        "calisthenics",
        "homeworkout",
        "fitnessmotivation",
        "strength"
      ],
      "like_count": 2650,
      "comment_count": 480,
      "view_count": 63000,
      "date": "2026-09-25T06:45:00+00:00",
      "user": {
        "username": "demo_fitcoach",
        "full_name": "Demo Fit Coach",
        "is_verified": false
      },
      "from_url": "https://www.instagram.com/demo_fitcoach/",
      "comments_disabled": false
    },
    {
      "shortcode": "fB2y3Z4a5",
      "post_url": "https://www.instagram.com/p/fB2y3Z4a5/",
      "type": "Sidecar",
      "product_type": "carousel_container",
      "caption": "3 mistakes that keep your squat stuck at the same weight\nMistake #2 surprised most of my clients.",
      "hashtags": [
        "squat",
        "strengthtraining",
        "gymtips"
      ],
      "like_count": 1020,
      "comment_count": 90,
      "view_count": null,
      "date": "2026-09-20T18:10:00+00:00",
      "user": {
        "username": "demo_fitcoach",
        "full_name": "Demo Fit Coach",
        "is_verified": false
      },
      "from_url": "https://www.instagram.com/demo_fitcoach/",
      "carousel_media_count": 5,
      "comments_disabled": false
    },
    {
      "shortcode": "fC3z4A5b6",
      "post_url": "https://www.instagram.com/p/fC3z4A5b6/",
      "type": "Image",
      "product_type": "feed",
      "caption": "Meal prep Sunday. Chicken, rice, greens.",
      "hashtags": [
        "mealprep",
        "fitfood"
      ],
      "like_count": 330,
      "comment_count": 20,
      "view_count": null,
      "date": "2026-09-15T12:00:00+00:00",
      "user": {
        "username": "demo_fitcoach",
        "full_name": "Demo Fit Coach",
        "is_verified": false
      },
      "from_url": "https://www.instagram.com/demo_fitcoach/",
      "comments_disabled": false
    },
    {
      "shortcode": "fD4a5B6c7",
      "post_url": "https://www.instagram.com/p/fD4a5B6c7/",
      "type": "Video",
      "product_type": "clips",
      "caption": "Quick mobility flow before work.",
      "hashtags": [
        "mobility",
        "stretching"
      ],
      "like_count": 360,
      "comment_count": 40,
      "view_count": 5200,
      "date": "2026-09-11T07:30:00+00:00",
      "user": {
        "username": "demo_fitcoach",
        "full_name": "Demo Fit Coach",
        "is_verified": false
      },
      "from_url": "https://www.instagram.com/demo_fitcoach/",
      "comments_disabled": false
    },
    {
      "shortcode": "fE5b6C7d8",
      "post_url": "https://www.instagram.com/p/fE5b6C7d8/",
      "type": "Image",
      "product_type": "feed",
      "caption": "Client win of the week — 12 weeks, one big smile.",
      "hashtags": [
        "clientwin",
        "transformation"
      ],
      "like_count": 390,
      "comment_count": 30,
      "view_count": null,
      "date": "2026-09-07T16:20:00+00:00",
      "user": {
        "username": "demo_fitcoach",
        "full_name": "Demo Fit Coach",
        "is_verified": false
      },
      "from_url": "https://www.instagram.com/demo_fitcoach/",
      "comments_disabled": false
    },
    {
      "shortcode": "fF6c7D8e9",
      "post_url": "https://www.instagram.com/p/fF6c7D8e9/",
      "type": "Image",
      "product_type": "feed",
      "caption": "Rest day reminder: recovery is training too.",
      "hashtags": [
        "recovery",
        "restday"
      ],
      "like_count": 340,
      "comment_count": 25,
      "view_count": null,
      "date": "2026-09-02T09:00:00+00:00",
      "user": {
        "username": "demo_fitcoach",
        "full_name": "Demo Fit Coach",
        "is_verified": false
      },
      "from_url": "https://www.instagram.com/demo_fitcoach/",
      "comments_disabled": false
    },
    {
      "shortcode": "sA1x2Y3z4",
      "post_url": "https://www.instagram.com/p/sA1x2Y3z4/",
      "type": "Image",
      "product_type": "feed",
      "caption": "Stop layering five serums. Here's what a dermatologist-reviewed routine actually looks like.\nSave this before your next skincare haul.",
      "hashtags": [
        "skincare",
        "skincareroutine",
        "glowup",
        "serum",
        "skintok",
        "beautytips",
        "dermatology",
        "cleanbeauty"
      ],
      "like_count": 2250,
      "comment_count": 310,
      "view_count": null,
      "date": "2026-09-24T13:25:00+00:00",
      "user": {
        "username": "demo_skinlab",
        "full_name": "Demo Skin Lab",
        "is_verified": false
      },
      "from_url": "https://www.instagram.com/demo_skinlab/",
      "comments_disabled": false
    },
    {
      "shortcode": "sB2y3Z4a5",
      "post_url": "https://www.instagram.com/p/sB2y3Z4a5/",
      "type": "Video",
      "product_type": "clips",
      "caption": "3 ingredients that don't mix 🚫\nNumber 2 is in half your bathroom cabinets.",
      "hashtags": [
        "skincare",
        "ingredients",
        "skincaretips"
      ],
      "like_count": 1180,
      "comment_count": 140,
      "view_count": 28900,
      "date": "2026-09-19T19:00:00+00:00",
      "user": {
        "username": "demo_skinlab",
        "full_name": "Demo Skin Lab",
        "is_verified": false
      },
      "from_url": "https://www.instagram.com/demo_skinlab/",
      "comments_disabled": false
    },
    {
      "shortcode": "sC3z4A5b6",
      "post_url": "https://www.instagram.com/p/sC3z4A5b6/",
      "type": "Image",
      "product_type": "feed",
      "caption": "New: barrier repair cream, now in a larger jar.",
      "hashtags": [
        "newlaunch",
        "skincare"
      ],
      "like_count": 410,
      "comment_count": 30,
      "view_count": null,
      "date": "2026-09-16T10:10:00+00:00",
      "user": {
        "username": "demo_skinlab",
        "full_name": "Demo Skin Lab",
        "is_verified": false
      },
      "from_url": "https://www.instagram.com/demo_skinlab/",
      "comments_disabled": false
    },
    {
      "shortcode": "sD4a5B6c7",
      "post_url": "https://www.instagram.com/p/sD4a5B6c7/",
      "type": "Image",
      "product_type": "feed",
      "caption": "Behind the lab: where we test every batch.",
      "hashtags": [
        "behindthescenes",
        "lab"
      ],
      "like_count": 380,
      "comment_count": 35,
      "view_count": null,
      "date": "2026-09-10T12:45:00+00:00",
      "user": {
        "username": "demo_skinlab",
        "full_name": "Demo Skin Lab",
        "is_verified": false
      },
      "from_url": "https://www.instagram.com/demo_skinlab/",
      "comments_disabled": false
    },
    {
      "shortcode": "sE5b6C7d8",
      "post_url": "https://www.instagram.com/p/sE5b6C7d8/",
      "type": "Sidecar",
      "product_type": "carousel_container",
      "caption": "Ingredient glossary, part one.",
      "hashtags": [
        "ingredients",
        "skincare"
      ],
      "like_count": 430,
      "comment_count": 25,
      "view_count": null,
      "date": "2026-09-06T15:00:00+00:00",
      "user": {
        "username": "demo_skinlab",
        "full_name": "Demo Skin Lab",
        "is_verified": false
      },
      "from_url": "https://www.instagram.com/demo_skinlab/",
      "carousel_media_count": 5,
      "comments_disabled": false
    },
    {
      "shortcode": "sF6c7D8e9",
      "post_url": "https://www.instagram.com/p/sF6c7D8e9/",
      "type": "Image",
      "product_type": "feed",
      "caption": "Weekend sale: 15% off the starter set.",
      "hashtags": [
        "sale",
        "skincare"
      ],
      "like_count": 365,
      "comment_count": 20,
      "view_count": null,
      "date": "2026-09-01T08:00:00+00:00",
      "user": {
        "username": "demo_skinlab",
        "full_name": "Demo Skin Lab",
        "is_verified": false
      },
      "from_url": "https://www.instagram.com/demo_skinlab/",
      "comments_disabled": false
    }
  ],
  "discoveryActorId": "instagram-scraper/fast-instagram-post-scraper",
  "discoveryInput": {},
  "webhookBatchSize": 1,
  "dedupeStoreName": "ig-competitor-winning-posts-seen",
  "discoveryTimeoutSecs": 3600
}
```

# Actor output Schema

## `qualified` (type: `string`):

All qualified winning posts as JSON, best-scoring first.

## `sheet` (type: `string`):

The same winning posts as a spreadsheet.

## `runSummary` (type: `string`):

JSON record with the funnel (loaded -> filtered -> AI-assessed -> qualified), per-reason skip counts, charged events by type, free-tier winning posts used and remaining, whether a budget limit was reached, webhook delivery counts and the dedupe store size.

# 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 = {
    "maxDiscoveryChargeUsd": 0.5,
    "sourceMode": "list",
    "itemsList": [
        {
            "shortcode": "rA1x2Y3z4",
            "post_url": "https://www.instagram.com/p/rA1x2Y3z4/",
            "type": "Video",
            "product_type": "clips",
            "caption": "Why does your espresso taste sour? ☕\nIt's almost never the beans — it's your grind. Here's the 10-second fix.\nSave this for your next shot.",
            "hashtags": [
                "espresso",
                "coffeetips",
                "homebarista",
                "coffeelover"
            ],
            "like_count": 3100,
            "comment_count": 210,
            "view_count": 41200,
            "date": "2026-09-26T08:15:00+00:00",
            "user": {
                "username": "demo_roastery",
                "full_name": "Demo Roastery",
                "is_verified": false
            },
            "from_url": "https://www.instagram.com/demo_roastery/",
            "comments_disabled": false
        },
        {
            "shortcode": "rB2y3Z4a5",
            "post_url": "https://www.instagram.com/p/rB2y3Z4a5/",
            "type": "Sidecar",
            "product_type": "carousel_container",
            "caption": "5 brew ratios every home barista should know\nSwipe through, then try number 3 tomorrow morning.",
            "hashtags": [
                "brewing",
                "coffeetips",
                "homebarista"
            ],
            "like_count": 1150,
            "comment_count": 100,
            "view_count": null,
            "date": "2026-09-22T17:40:00+00:00",
            "user": {
                "username": "demo_roastery",
                "full_name": "Demo Roastery",
                "is_verified": false
            },
            "from_url": "https://www.instagram.com/demo_roastery/",
            "carousel_media_count": 5,
            "comments_disabled": false
        },
        {
            "shortcode": "rC3z4A5b6",
            "post_url": "https://www.instagram.com/p/rC3z4A5b6/",
            "type": "Image",
            "product_type": "feed",
            "caption": "New single origin just landed: Ethiopia Guji, notes of peach and jasmine.",
            "hashtags": [
                "singleorigin",
                "coffee"
            ],
            "like_count": 395,
            "comment_count": 25,
            "view_count": null,
            "date": "2026-09-18T09:05:00+00:00",
            "user": {
                "username": "demo_roastery",
                "full_name": "Demo Roastery",
                "is_verified": false
            },
            "from_url": "https://www.instagram.com/demo_roastery/",
            "comments_disabled": false
        },
        {
            "shortcode": "rD4a5B6c7",
            "post_url": "https://www.instagram.com/p/rD4a5B6c7/",
            "type": "Image",
            "product_type": "feed",
            "caption": "Saturday at the roastery. Come say hi until 4 pm.",
            "hashtags": [
                "roastery",
                "coffee"
            ],
            "like_count": 440,
            "comment_count": 30,
            "view_count": null,
            "date": "2026-09-13T11:20:00+00:00",
            "user": {
                "username": "demo_roastery",
                "full_name": "Demo Roastery",
                "is_verified": false
            },
            "from_url": "https://www.instagram.com/demo_roastery/",
            "comments_disabled": false
        },
        {
            "shortcode": "rE5b6C7d8",
            "post_url": "https://www.instagram.com/p/rE5b6C7d8/",
            "type": "Video",
            "product_type": "clips",
            "caption": "Behind the scenes: roast day.",
            "hashtags": [
                "roasting",
                "coffee"
            ],
            "like_count": 460,
            "comment_count": 35,
            "view_count": 7800,
            "date": "2026-09-09T14:00:00+00:00",
            "user": {
                "username": "demo_roastery",
                "full_name": "Demo Roastery",
                "is_verified": false
            },
            "from_url": "https://www.instagram.com/demo_roastery/",
            "comments_disabled": false
        },
        {
            "shortcode": "rF6c7D8e9",
            "post_url": "https://www.instagram.com/p/rF6c7D8e9/",
            "type": "Image",
            "product_type": "feed",
            "caption": "Our autumn blend is back.",
            "hashtags": [
                "autumn",
                "coffee"
            ],
            "like_count": 420,
            "comment_count": 45,
            "view_count": null,
            "date": "2026-09-04T10:30:00+00:00",
            "user": {
                "username": "demo_roastery",
                "full_name": "Demo Roastery",
                "is_verified": false
            },
            "from_url": "https://www.instagram.com/demo_roastery/",
            "comments_disabled": false
        },
        {
            "shortcode": "fA1x2Y3z4",
            "post_url": "https://www.instagram.com/p/fA1x2Y3z4/",
            "type": "Video",
            "product_type": "clips",
            "caption": "How to do your first pull-up in 4 weeks 💪\nNo gym needed — just a door frame and a towel.\nComment PULL and I'll send you the plan.",
            "hashtags": [
                "pullup",
                "calisthenics",
                "homeworkout",
                "fitnessmotivation",
                "strength"
            ],
            "like_count": 2650,
            "comment_count": 480,
            "view_count": 63000,
            "date": "2026-09-25T06:45:00+00:00",
            "user": {
                "username": "demo_fitcoach",
                "full_name": "Demo Fit Coach",
                "is_verified": false
            },
            "from_url": "https://www.instagram.com/demo_fitcoach/",
            "comments_disabled": false
        },
        {
            "shortcode": "fB2y3Z4a5",
            "post_url": "https://www.instagram.com/p/fB2y3Z4a5/",
            "type": "Sidecar",
            "product_type": "carousel_container",
            "caption": "3 mistakes that keep your squat stuck at the same weight\nMistake #2 surprised most of my clients.",
            "hashtags": [
                "squat",
                "strengthtraining",
                "gymtips"
            ],
            "like_count": 1020,
            "comment_count": 90,
            "view_count": null,
            "date": "2026-09-20T18:10:00+00:00",
            "user": {
                "username": "demo_fitcoach",
                "full_name": "Demo Fit Coach",
                "is_verified": false
            },
            "from_url": "https://www.instagram.com/demo_fitcoach/",
            "carousel_media_count": 5,
            "comments_disabled": false
        },
        {
            "shortcode": "fC3z4A5b6",
            "post_url": "https://www.instagram.com/p/fC3z4A5b6/",
            "type": "Image",
            "product_type": "feed",
            "caption": "Meal prep Sunday. Chicken, rice, greens.",
            "hashtags": [
                "mealprep",
                "fitfood"
            ],
            "like_count": 330,
            "comment_count": 20,
            "view_count": null,
            "date": "2026-09-15T12:00:00+00:00",
            "user": {
                "username": "demo_fitcoach",
                "full_name": "Demo Fit Coach",
                "is_verified": false
            },
            "from_url": "https://www.instagram.com/demo_fitcoach/",
            "comments_disabled": false
        },
        {
            "shortcode": "fD4a5B6c7",
            "post_url": "https://www.instagram.com/p/fD4a5B6c7/",
            "type": "Video",
            "product_type": "clips",
            "caption": "Quick mobility flow before work.",
            "hashtags": [
                "mobility",
                "stretching"
            ],
            "like_count": 360,
            "comment_count": 40,
            "view_count": 5200,
            "date": "2026-09-11T07:30:00+00:00",
            "user": {
                "username": "demo_fitcoach",
                "full_name": "Demo Fit Coach",
                "is_verified": false
            },
            "from_url": "https://www.instagram.com/demo_fitcoach/",
            "comments_disabled": false
        },
        {
            "shortcode": "fE5b6C7d8",
            "post_url": "https://www.instagram.com/p/fE5b6C7d8/",
            "type": "Image",
            "product_type": "feed",
            "caption": "Client win of the week — 12 weeks, one big smile.",
            "hashtags": [
                "clientwin",
                "transformation"
            ],
            "like_count": 390,
            "comment_count": 30,
            "view_count": null,
            "date": "2026-09-07T16:20:00+00:00",
            "user": {
                "username": "demo_fitcoach",
                "full_name": "Demo Fit Coach",
                "is_verified": false
            },
            "from_url": "https://www.instagram.com/demo_fitcoach/",
            "comments_disabled": false
        },
        {
            "shortcode": "fF6c7D8e9",
            "post_url": "https://www.instagram.com/p/fF6c7D8e9/",
            "type": "Image",
            "product_type": "feed",
            "caption": "Rest day reminder: recovery is training too.",
            "hashtags": [
                "recovery",
                "restday"
            ],
            "like_count": 340,
            "comment_count": 25,
            "view_count": null,
            "date": "2026-09-02T09:00:00+00:00",
            "user": {
                "username": "demo_fitcoach",
                "full_name": "Demo Fit Coach",
                "is_verified": false
            },
            "from_url": "https://www.instagram.com/demo_fitcoach/",
            "comments_disabled": false
        },
        {
            "shortcode": "sA1x2Y3z4",
            "post_url": "https://www.instagram.com/p/sA1x2Y3z4/",
            "type": "Image",
            "product_type": "feed",
            "caption": "Stop layering five serums. Here's what a dermatologist-reviewed routine actually looks like.\nSave this before your next skincare haul.",
            "hashtags": [
                "skincare",
                "skincareroutine",
                "glowup",
                "serum",
                "skintok",
                "beautytips",
                "dermatology",
                "cleanbeauty"
            ],
            "like_count": 2250,
            "comment_count": 310,
            "view_count": null,
            "date": "2026-09-24T13:25:00+00:00",
            "user": {
                "username": "demo_skinlab",
                "full_name": "Demo Skin Lab",
                "is_verified": false
            },
            "from_url": "https://www.instagram.com/demo_skinlab/",
            "comments_disabled": false
        },
        {
            "shortcode": "sB2y3Z4a5",
            "post_url": "https://www.instagram.com/p/sB2y3Z4a5/",
            "type": "Video",
            "product_type": "clips",
            "caption": "3 ingredients that don't mix 🚫\nNumber 2 is in half your bathroom cabinets.",
            "hashtags": [
                "skincare",
                "ingredients",
                "skincaretips"
            ],
            "like_count": 1180,
            "comment_count": 140,
            "view_count": 28900,
            "date": "2026-09-19T19:00:00+00:00",
            "user": {
                "username": "demo_skinlab",
                "full_name": "Demo Skin Lab",
                "is_verified": false
            },
            "from_url": "https://www.instagram.com/demo_skinlab/",
            "comments_disabled": false
        },
        {
            "shortcode": "sC3z4A5b6",
            "post_url": "https://www.instagram.com/p/sC3z4A5b6/",
            "type": "Image",
            "product_type": "feed",
            "caption": "New: barrier repair cream, now in a larger jar.",
            "hashtags": [
                "newlaunch",
                "skincare"
            ],
            "like_count": 410,
            "comment_count": 30,
            "view_count": null,
            "date": "2026-09-16T10:10:00+00:00",
            "user": {
                "username": "demo_skinlab",
                "full_name": "Demo Skin Lab",
                "is_verified": false
            },
            "from_url": "https://www.instagram.com/demo_skinlab/",
            "comments_disabled": false
        },
        {
            "shortcode": "sD4a5B6c7",
            "post_url": "https://www.instagram.com/p/sD4a5B6c7/",
            "type": "Image",
            "product_type": "feed",
            "caption": "Behind the lab: where we test every batch.",
            "hashtags": [
                "behindthescenes",
                "lab"
            ],
            "like_count": 380,
            "comment_count": 35,
            "view_count": null,
            "date": "2026-09-10T12:45:00+00:00",
            "user": {
                "username": "demo_skinlab",
                "full_name": "Demo Skin Lab",
                "is_verified": false
            },
            "from_url": "https://www.instagram.com/demo_skinlab/",
            "comments_disabled": false
        },
        {
            "shortcode": "sE5b6C7d8",
            "post_url": "https://www.instagram.com/p/sE5b6C7d8/",
            "type": "Sidecar",
            "product_type": "carousel_container",
            "caption": "Ingredient glossary, part one.",
            "hashtags": [
                "ingredients",
                "skincare"
            ],
            "like_count": 430,
            "comment_count": 25,
            "view_count": null,
            "date": "2026-09-06T15:00:00+00:00",
            "user": {
                "username": "demo_skinlab",
                "full_name": "Demo Skin Lab",
                "is_verified": false
            },
            "from_url": "https://www.instagram.com/demo_skinlab/",
            "carousel_media_count": 5,
            "comments_disabled": false
        },
        {
            "shortcode": "sF6c7D8e9",
            "post_url": "https://www.instagram.com/p/sF6c7D8e9/",
            "type": "Image",
            "product_type": "feed",
            "caption": "Weekend sale: 15% off the starter set.",
            "hashtags": [
                "sale",
                "skincare"
            ],
            "like_count": 365,
            "comment_count": 20,
            "view_count": null,
            "date": "2026-09-01T08:00:00+00:00",
            "user": {
                "username": "demo_skinlab",
                "full_name": "Demo Skin Lab",
                "is_verified": false
            },
            "from_url": "https://www.instagram.com/demo_skinlab/",
            "comments_disabled": false
        }
    ],
    "discoveryInput": {}
};

// Run the Actor and wait for it to finish
const run = await client.actor("rich_minds/ig-competitor-winning-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 = {
    "maxDiscoveryChargeUsd": 0.5,
    "sourceMode": "list",
    "itemsList": [
        {
            "shortcode": "rA1x2Y3z4",
            "post_url": "https://www.instagram.com/p/rA1x2Y3z4/",
            "type": "Video",
            "product_type": "clips",
            "caption": """Why does your espresso taste sour? ☕
It's almost never the beans — it's your grind. Here's the 10-second fix.
Save this for your next shot.""",
            "hashtags": [
                "espresso",
                "coffeetips",
                "homebarista",
                "coffeelover",
            ],
            "like_count": 3100,
            "comment_count": 210,
            "view_count": 41200,
            "date": "2026-09-26T08:15:00+00:00",
            "user": {
                "username": "demo_roastery",
                "full_name": "Demo Roastery",
                "is_verified": False,
            },
            "from_url": "https://www.instagram.com/demo_roastery/",
            "comments_disabled": False,
        },
        {
            "shortcode": "rB2y3Z4a5",
            "post_url": "https://www.instagram.com/p/rB2y3Z4a5/",
            "type": "Sidecar",
            "product_type": "carousel_container",
            "caption": """5 brew ratios every home barista should know
Swipe through, then try number 3 tomorrow morning.""",
            "hashtags": [
                "brewing",
                "coffeetips",
                "homebarista",
            ],
            "like_count": 1150,
            "comment_count": 100,
            "view_count": None,
            "date": "2026-09-22T17:40:00+00:00",
            "user": {
                "username": "demo_roastery",
                "full_name": "Demo Roastery",
                "is_verified": False,
            },
            "from_url": "https://www.instagram.com/demo_roastery/",
            "carousel_media_count": 5,
            "comments_disabled": False,
        },
        {
            "shortcode": "rC3z4A5b6",
            "post_url": "https://www.instagram.com/p/rC3z4A5b6/",
            "type": "Image",
            "product_type": "feed",
            "caption": "New single origin just landed: Ethiopia Guji, notes of peach and jasmine.",
            "hashtags": [
                "singleorigin",
                "coffee",
            ],
            "like_count": 395,
            "comment_count": 25,
            "view_count": None,
            "date": "2026-09-18T09:05:00+00:00",
            "user": {
                "username": "demo_roastery",
                "full_name": "Demo Roastery",
                "is_verified": False,
            },
            "from_url": "https://www.instagram.com/demo_roastery/",
            "comments_disabled": False,
        },
        {
            "shortcode": "rD4a5B6c7",
            "post_url": "https://www.instagram.com/p/rD4a5B6c7/",
            "type": "Image",
            "product_type": "feed",
            "caption": "Saturday at the roastery. Come say hi until 4 pm.",
            "hashtags": [
                "roastery",
                "coffee",
            ],
            "like_count": 440,
            "comment_count": 30,
            "view_count": None,
            "date": "2026-09-13T11:20:00+00:00",
            "user": {
                "username": "demo_roastery",
                "full_name": "Demo Roastery",
                "is_verified": False,
            },
            "from_url": "https://www.instagram.com/demo_roastery/",
            "comments_disabled": False,
        },
        {
            "shortcode": "rE5b6C7d8",
            "post_url": "https://www.instagram.com/p/rE5b6C7d8/",
            "type": "Video",
            "product_type": "clips",
            "caption": "Behind the scenes: roast day.",
            "hashtags": [
                "roasting",
                "coffee",
            ],
            "like_count": 460,
            "comment_count": 35,
            "view_count": 7800,
            "date": "2026-09-09T14:00:00+00:00",
            "user": {
                "username": "demo_roastery",
                "full_name": "Demo Roastery",
                "is_verified": False,
            },
            "from_url": "https://www.instagram.com/demo_roastery/",
            "comments_disabled": False,
        },
        {
            "shortcode": "rF6c7D8e9",
            "post_url": "https://www.instagram.com/p/rF6c7D8e9/",
            "type": "Image",
            "product_type": "feed",
            "caption": "Our autumn blend is back.",
            "hashtags": [
                "autumn",
                "coffee",
            ],
            "like_count": 420,
            "comment_count": 45,
            "view_count": None,
            "date": "2026-09-04T10:30:00+00:00",
            "user": {
                "username": "demo_roastery",
                "full_name": "Demo Roastery",
                "is_verified": False,
            },
            "from_url": "https://www.instagram.com/demo_roastery/",
            "comments_disabled": False,
        },
        {
            "shortcode": "fA1x2Y3z4",
            "post_url": "https://www.instagram.com/p/fA1x2Y3z4/",
            "type": "Video",
            "product_type": "clips",
            "caption": """How to do your first pull-up in 4 weeks 💪
No gym needed — just a door frame and a towel.
Comment PULL and I'll send you the plan.""",
            "hashtags": [
                "pullup",
                "calisthenics",
                "homeworkout",
                "fitnessmotivation",
                "strength",
            ],
            "like_count": 2650,
            "comment_count": 480,
            "view_count": 63000,
            "date": "2026-09-25T06:45:00+00:00",
            "user": {
                "username": "demo_fitcoach",
                "full_name": "Demo Fit Coach",
                "is_verified": False,
            },
            "from_url": "https://www.instagram.com/demo_fitcoach/",
            "comments_disabled": False,
        },
        {
            "shortcode": "fB2y3Z4a5",
            "post_url": "https://www.instagram.com/p/fB2y3Z4a5/",
            "type": "Sidecar",
            "product_type": "carousel_container",
            "caption": """3 mistakes that keep your squat stuck at the same weight
Mistake #2 surprised most of my clients.""",
            "hashtags": [
                "squat",
                "strengthtraining",
                "gymtips",
            ],
            "like_count": 1020,
            "comment_count": 90,
            "view_count": None,
            "date": "2026-09-20T18:10:00+00:00",
            "user": {
                "username": "demo_fitcoach",
                "full_name": "Demo Fit Coach",
                "is_verified": False,
            },
            "from_url": "https://www.instagram.com/demo_fitcoach/",
            "carousel_media_count": 5,
            "comments_disabled": False,
        },
        {
            "shortcode": "fC3z4A5b6",
            "post_url": "https://www.instagram.com/p/fC3z4A5b6/",
            "type": "Image",
            "product_type": "feed",
            "caption": "Meal prep Sunday. Chicken, rice, greens.",
            "hashtags": [
                "mealprep",
                "fitfood",
            ],
            "like_count": 330,
            "comment_count": 20,
            "view_count": None,
            "date": "2026-09-15T12:00:00+00:00",
            "user": {
                "username": "demo_fitcoach",
                "full_name": "Demo Fit Coach",
                "is_verified": False,
            },
            "from_url": "https://www.instagram.com/demo_fitcoach/",
            "comments_disabled": False,
        },
        {
            "shortcode": "fD4a5B6c7",
            "post_url": "https://www.instagram.com/p/fD4a5B6c7/",
            "type": "Video",
            "product_type": "clips",
            "caption": "Quick mobility flow before work.",
            "hashtags": [
                "mobility",
                "stretching",
            ],
            "like_count": 360,
            "comment_count": 40,
            "view_count": 5200,
            "date": "2026-09-11T07:30:00+00:00",
            "user": {
                "username": "demo_fitcoach",
                "full_name": "Demo Fit Coach",
                "is_verified": False,
            },
            "from_url": "https://www.instagram.com/demo_fitcoach/",
            "comments_disabled": False,
        },
        {
            "shortcode": "fE5b6C7d8",
            "post_url": "https://www.instagram.com/p/fE5b6C7d8/",
            "type": "Image",
            "product_type": "feed",
            "caption": "Client win of the week — 12 weeks, one big smile.",
            "hashtags": [
                "clientwin",
                "transformation",
            ],
            "like_count": 390,
            "comment_count": 30,
            "view_count": None,
            "date": "2026-09-07T16:20:00+00:00",
            "user": {
                "username": "demo_fitcoach",
                "full_name": "Demo Fit Coach",
                "is_verified": False,
            },
            "from_url": "https://www.instagram.com/demo_fitcoach/",
            "comments_disabled": False,
        },
        {
            "shortcode": "fF6c7D8e9",
            "post_url": "https://www.instagram.com/p/fF6c7D8e9/",
            "type": "Image",
            "product_type": "feed",
            "caption": "Rest day reminder: recovery is training too.",
            "hashtags": [
                "recovery",
                "restday",
            ],
            "like_count": 340,
            "comment_count": 25,
            "view_count": None,
            "date": "2026-09-02T09:00:00+00:00",
            "user": {
                "username": "demo_fitcoach",
                "full_name": "Demo Fit Coach",
                "is_verified": False,
            },
            "from_url": "https://www.instagram.com/demo_fitcoach/",
            "comments_disabled": False,
        },
        {
            "shortcode": "sA1x2Y3z4",
            "post_url": "https://www.instagram.com/p/sA1x2Y3z4/",
            "type": "Image",
            "product_type": "feed",
            "caption": """Stop layering five serums. Here's what a dermatologist-reviewed routine actually looks like.
Save this before your next skincare haul.""",
            "hashtags": [
                "skincare",
                "skincareroutine",
                "glowup",
                "serum",
                "skintok",
                "beautytips",
                "dermatology",
                "cleanbeauty",
            ],
            "like_count": 2250,
            "comment_count": 310,
            "view_count": None,
            "date": "2026-09-24T13:25:00+00:00",
            "user": {
                "username": "demo_skinlab",
                "full_name": "Demo Skin Lab",
                "is_verified": False,
            },
            "from_url": "https://www.instagram.com/demo_skinlab/",
            "comments_disabled": False,
        },
        {
            "shortcode": "sB2y3Z4a5",
            "post_url": "https://www.instagram.com/p/sB2y3Z4a5/",
            "type": "Video",
            "product_type": "clips",
            "caption": """3 ingredients that don't mix 🚫
Number 2 is in half your bathroom cabinets.""",
            "hashtags": [
                "skincare",
                "ingredients",
                "skincaretips",
            ],
            "like_count": 1180,
            "comment_count": 140,
            "view_count": 28900,
            "date": "2026-09-19T19:00:00+00:00",
            "user": {
                "username": "demo_skinlab",
                "full_name": "Demo Skin Lab",
                "is_verified": False,
            },
            "from_url": "https://www.instagram.com/demo_skinlab/",
            "comments_disabled": False,
        },
        {
            "shortcode": "sC3z4A5b6",
            "post_url": "https://www.instagram.com/p/sC3z4A5b6/",
            "type": "Image",
            "product_type": "feed",
            "caption": "New: barrier repair cream, now in a larger jar.",
            "hashtags": [
                "newlaunch",
                "skincare",
            ],
            "like_count": 410,
            "comment_count": 30,
            "view_count": None,
            "date": "2026-09-16T10:10:00+00:00",
            "user": {
                "username": "demo_skinlab",
                "full_name": "Demo Skin Lab",
                "is_verified": False,
            },
            "from_url": "https://www.instagram.com/demo_skinlab/",
            "comments_disabled": False,
        },
        {
            "shortcode": "sD4a5B6c7",
            "post_url": "https://www.instagram.com/p/sD4a5B6c7/",
            "type": "Image",
            "product_type": "feed",
            "caption": "Behind the lab: where we test every batch.",
            "hashtags": [
                "behindthescenes",
                "lab",
            ],
            "like_count": 380,
            "comment_count": 35,
            "view_count": None,
            "date": "2026-09-10T12:45:00+00:00",
            "user": {
                "username": "demo_skinlab",
                "full_name": "Demo Skin Lab",
                "is_verified": False,
            },
            "from_url": "https://www.instagram.com/demo_skinlab/",
            "comments_disabled": False,
        },
        {
            "shortcode": "sE5b6C7d8",
            "post_url": "https://www.instagram.com/p/sE5b6C7d8/",
            "type": "Sidecar",
            "product_type": "carousel_container",
            "caption": "Ingredient glossary, part one.",
            "hashtags": [
                "ingredients",
                "skincare",
            ],
            "like_count": 430,
            "comment_count": 25,
            "view_count": None,
            "date": "2026-09-06T15:00:00+00:00",
            "user": {
                "username": "demo_skinlab",
                "full_name": "Demo Skin Lab",
                "is_verified": False,
            },
            "from_url": "https://www.instagram.com/demo_skinlab/",
            "carousel_media_count": 5,
            "comments_disabled": False,
        },
        {
            "shortcode": "sF6c7D8e9",
            "post_url": "https://www.instagram.com/p/sF6c7D8e9/",
            "type": "Image",
            "product_type": "feed",
            "caption": "Weekend sale: 15% off the starter set.",
            "hashtags": [
                "sale",
                "skincare",
            ],
            "like_count": 365,
            "comment_count": 20,
            "view_count": None,
            "date": "2026-09-01T08:00:00+00:00",
            "user": {
                "username": "demo_skinlab",
                "full_name": "Demo Skin Lab",
                "is_verified": False,
            },
            "from_url": "https://www.instagram.com/demo_skinlab/",
            "comments_disabled": False,
        },
    ],
    "discoveryInput": {},
}

# Run the Actor and wait for it to finish
run = client.actor("rich_minds/ig-competitor-winning-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 '{
  "maxDiscoveryChargeUsd": 0.5,
  "sourceMode": "list",
  "itemsList": [
    {
      "shortcode": "rA1x2Y3z4",
      "post_url": "https://www.instagram.com/p/rA1x2Y3z4/",
      "type": "Video",
      "product_type": "clips",
      "caption": "Why does your espresso taste sour? ☕\\nIt'\''s almost never the beans — it'\''s your grind. Here'\''s the 10-second fix.\\nSave this for your next shot.",
      "hashtags": [
        "espresso",
        "coffeetips",
        "homebarista",
        "coffeelover"
      ],
      "like_count": 3100,
      "comment_count": 210,
      "view_count": 41200,
      "date": "2026-09-26T08:15:00+00:00",
      "user": {
        "username": "demo_roastery",
        "full_name": "Demo Roastery",
        "is_verified": false
      },
      "from_url": "https://www.instagram.com/demo_roastery/",
      "comments_disabled": false
    },
    {
      "shortcode": "rB2y3Z4a5",
      "post_url": "https://www.instagram.com/p/rB2y3Z4a5/",
      "type": "Sidecar",
      "product_type": "carousel_container",
      "caption": "5 brew ratios every home barista should know\\nSwipe through, then try number 3 tomorrow morning.",
      "hashtags": [
        "brewing",
        "coffeetips",
        "homebarista"
      ],
      "like_count": 1150,
      "comment_count": 100,
      "view_count": null,
      "date": "2026-09-22T17:40:00+00:00",
      "user": {
        "username": "demo_roastery",
        "full_name": "Demo Roastery",
        "is_verified": false
      },
      "from_url": "https://www.instagram.com/demo_roastery/",
      "carousel_media_count": 5,
      "comments_disabled": false
    },
    {
      "shortcode": "rC3z4A5b6",
      "post_url": "https://www.instagram.com/p/rC3z4A5b6/",
      "type": "Image",
      "product_type": "feed",
      "caption": "New single origin just landed: Ethiopia Guji, notes of peach and jasmine.",
      "hashtags": [
        "singleorigin",
        "coffee"
      ],
      "like_count": 395,
      "comment_count": 25,
      "view_count": null,
      "date": "2026-09-18T09:05:00+00:00",
      "user": {
        "username": "demo_roastery",
        "full_name": "Demo Roastery",
        "is_verified": false
      },
      "from_url": "https://www.instagram.com/demo_roastery/",
      "comments_disabled": false
    },
    {
      "shortcode": "rD4a5B6c7",
      "post_url": "https://www.instagram.com/p/rD4a5B6c7/",
      "type": "Image",
      "product_type": "feed",
      "caption": "Saturday at the roastery. Come say hi until 4 pm.",
      "hashtags": [
        "roastery",
        "coffee"
      ],
      "like_count": 440,
      "comment_count": 30,
      "view_count": null,
      "date": "2026-09-13T11:20:00+00:00",
      "user": {
        "username": "demo_roastery",
        "full_name": "Demo Roastery",
        "is_verified": false
      },
      "from_url": "https://www.instagram.com/demo_roastery/",
      "comments_disabled": false
    },
    {
      "shortcode": "rE5b6C7d8",
      "post_url": "https://www.instagram.com/p/rE5b6C7d8/",
      "type": "Video",
      "product_type": "clips",
      "caption": "Behind the scenes: roast day.",
      "hashtags": [
        "roasting",
        "coffee"
      ],
      "like_count": 460,
      "comment_count": 35,
      "view_count": 7800,
      "date": "2026-09-09T14:00:00+00:00",
      "user": {
        "username": "demo_roastery",
        "full_name": "Demo Roastery",
        "is_verified": false
      },
      "from_url": "https://www.instagram.com/demo_roastery/",
      "comments_disabled": false
    },
    {
      "shortcode": "rF6c7D8e9",
      "post_url": "https://www.instagram.com/p/rF6c7D8e9/",
      "type": "Image",
      "product_type": "feed",
      "caption": "Our autumn blend is back.",
      "hashtags": [
        "autumn",
        "coffee"
      ],
      "like_count": 420,
      "comment_count": 45,
      "view_count": null,
      "date": "2026-09-04T10:30:00+00:00",
      "user": {
        "username": "demo_roastery",
        "full_name": "Demo Roastery",
        "is_verified": false
      },
      "from_url": "https://www.instagram.com/demo_roastery/",
      "comments_disabled": false
    },
    {
      "shortcode": "fA1x2Y3z4",
      "post_url": "https://www.instagram.com/p/fA1x2Y3z4/",
      "type": "Video",
      "product_type": "clips",
      "caption": "How to do your first pull-up in 4 weeks 💪\\nNo gym needed — just a door frame and a towel.\\nComment PULL and I'\''ll send you the plan.",
      "hashtags": [
        "pullup",
        "calisthenics",
        "homeworkout",
        "fitnessmotivation",
        "strength"
      ],
      "like_count": 2650,
      "comment_count": 480,
      "view_count": 63000,
      "date": "2026-09-25T06:45:00+00:00",
      "user": {
        "username": "demo_fitcoach",
        "full_name": "Demo Fit Coach",
        "is_verified": false
      },
      "from_url": "https://www.instagram.com/demo_fitcoach/",
      "comments_disabled": false
    },
    {
      "shortcode": "fB2y3Z4a5",
      "post_url": "https://www.instagram.com/p/fB2y3Z4a5/",
      "type": "Sidecar",
      "product_type": "carousel_container",
      "caption": "3 mistakes that keep your squat stuck at the same weight\\nMistake #2 surprised most of my clients.",
      "hashtags": [
        "squat",
        "strengthtraining",
        "gymtips"
      ],
      "like_count": 1020,
      "comment_count": 90,
      "view_count": null,
      "date": "2026-09-20T18:10:00+00:00",
      "user": {
        "username": "demo_fitcoach",
        "full_name": "Demo Fit Coach",
        "is_verified": false
      },
      "from_url": "https://www.instagram.com/demo_fitcoach/",
      "carousel_media_count": 5,
      "comments_disabled": false
    },
    {
      "shortcode": "fC3z4A5b6",
      "post_url": "https://www.instagram.com/p/fC3z4A5b6/",
      "type": "Image",
      "product_type": "feed",
      "caption": "Meal prep Sunday. Chicken, rice, greens.",
      "hashtags": [
        "mealprep",
        "fitfood"
      ],
      "like_count": 330,
      "comment_count": 20,
      "view_count": null,
      "date": "2026-09-15T12:00:00+00:00",
      "user": {
        "username": "demo_fitcoach",
        "full_name": "Demo Fit Coach",
        "is_verified": false
      },
      "from_url": "https://www.instagram.com/demo_fitcoach/",
      "comments_disabled": false
    },
    {
      "shortcode": "fD4a5B6c7",
      "post_url": "https://www.instagram.com/p/fD4a5B6c7/",
      "type": "Video",
      "product_type": "clips",
      "caption": "Quick mobility flow before work.",
      "hashtags": [
        "mobility",
        "stretching"
      ],
      "like_count": 360,
      "comment_count": 40,
      "view_count": 5200,
      "date": "2026-09-11T07:30:00+00:00",
      "user": {
        "username": "demo_fitcoach",
        "full_name": "Demo Fit Coach",
        "is_verified": false
      },
      "from_url": "https://www.instagram.com/demo_fitcoach/",
      "comments_disabled": false
    },
    {
      "shortcode": "fE5b6C7d8",
      "post_url": "https://www.instagram.com/p/fE5b6C7d8/",
      "type": "Image",
      "product_type": "feed",
      "caption": "Client win of the week — 12 weeks, one big smile.",
      "hashtags": [
        "clientwin",
        "transformation"
      ],
      "like_count": 390,
      "comment_count": 30,
      "view_count": null,
      "date": "2026-09-07T16:20:00+00:00",
      "user": {
        "username": "demo_fitcoach",
        "full_name": "Demo Fit Coach",
        "is_verified": false
      },
      "from_url": "https://www.instagram.com/demo_fitcoach/",
      "comments_disabled": false
    },
    {
      "shortcode": "fF6c7D8e9",
      "post_url": "https://www.instagram.com/p/fF6c7D8e9/",
      "type": "Image",
      "product_type": "feed",
      "caption": "Rest day reminder: recovery is training too.",
      "hashtags": [
        "recovery",
        "restday"
      ],
      "like_count": 340,
      "comment_count": 25,
      "view_count": null,
      "date": "2026-09-02T09:00:00+00:00",
      "user": {
        "username": "demo_fitcoach",
        "full_name": "Demo Fit Coach",
        "is_verified": false
      },
      "from_url": "https://www.instagram.com/demo_fitcoach/",
      "comments_disabled": false
    },
    {
      "shortcode": "sA1x2Y3z4",
      "post_url": "https://www.instagram.com/p/sA1x2Y3z4/",
      "type": "Image",
      "product_type": "feed",
      "caption": "Stop layering five serums. Here'\''s what a dermatologist-reviewed routine actually looks like.\\nSave this before your next skincare haul.",
      "hashtags": [
        "skincare",
        "skincareroutine",
        "glowup",
        "serum",
        "skintok",
        "beautytips",
        "dermatology",
        "cleanbeauty"
      ],
      "like_count": 2250,
      "comment_count": 310,
      "view_count": null,
      "date": "2026-09-24T13:25:00+00:00",
      "user": {
        "username": "demo_skinlab",
        "full_name": "Demo Skin Lab",
        "is_verified": false
      },
      "from_url": "https://www.instagram.com/demo_skinlab/",
      "comments_disabled": false
    },
    {
      "shortcode": "sB2y3Z4a5",
      "post_url": "https://www.instagram.com/p/sB2y3Z4a5/",
      "type": "Video",
      "product_type": "clips",
      "caption": "3 ingredients that don'\''t mix 🚫\\nNumber 2 is in half your bathroom cabinets.",
      "hashtags": [
        "skincare",
        "ingredients",
        "skincaretips"
      ],
      "like_count": 1180,
      "comment_count": 140,
      "view_count": 28900,
      "date": "2026-09-19T19:00:00+00:00",
      "user": {
        "username": "demo_skinlab",
        "full_name": "Demo Skin Lab",
        "is_verified": false
      },
      "from_url": "https://www.instagram.com/demo_skinlab/",
      "comments_disabled": false
    },
    {
      "shortcode": "sC3z4A5b6",
      "post_url": "https://www.instagram.com/p/sC3z4A5b6/",
      "type": "Image",
      "product_type": "feed",
      "caption": "New: barrier repair cream, now in a larger jar.",
      "hashtags": [
        "newlaunch",
        "skincare"
      ],
      "like_count": 410,
      "comment_count": 30,
      "view_count": null,
      "date": "2026-09-16T10:10:00+00:00",
      "user": {
        "username": "demo_skinlab",
        "full_name": "Demo Skin Lab",
        "is_verified": false
      },
      "from_url": "https://www.instagram.com/demo_skinlab/",
      "comments_disabled": false
    },
    {
      "shortcode": "sD4a5B6c7",
      "post_url": "https://www.instagram.com/p/sD4a5B6c7/",
      "type": "Image",
      "product_type": "feed",
      "caption": "Behind the lab: where we test every batch.",
      "hashtags": [
        "behindthescenes",
        "lab"
      ],
      "like_count": 380,
      "comment_count": 35,
      "view_count": null,
      "date": "2026-09-10T12:45:00+00:00",
      "user": {
        "username": "demo_skinlab",
        "full_name": "Demo Skin Lab",
        "is_verified": false
      },
      "from_url": "https://www.instagram.com/demo_skinlab/",
      "comments_disabled": false
    },
    {
      "shortcode": "sE5b6C7d8",
      "post_url": "https://www.instagram.com/p/sE5b6C7d8/",
      "type": "Sidecar",
      "product_type": "carousel_container",
      "caption": "Ingredient glossary, part one.",
      "hashtags": [
        "ingredients",
        "skincare"
      ],
      "like_count": 430,
      "comment_count": 25,
      "view_count": null,
      "date": "2026-09-06T15:00:00+00:00",
      "user": {
        "username": "demo_skinlab",
        "full_name": "Demo Skin Lab",
        "is_verified": false
      },
      "from_url": "https://www.instagram.com/demo_skinlab/",
      "carousel_media_count": 5,
      "comments_disabled": false
    },
    {
      "shortcode": "sF6c7D8e9",
      "post_url": "https://www.instagram.com/p/sF6c7D8e9/",
      "type": "Image",
      "product_type": "feed",
      "caption": "Weekend sale: 15% off the starter set.",
      "hashtags": [
        "sale",
        "skincare"
      ],
      "like_count": 365,
      "comment_count": 20,
      "view_count": null,
      "date": "2026-09-01T08:00:00+00:00",
      "user": {
        "username": "demo_skinlab",
        "full_name": "Demo Skin Lab",
        "is_verified": false
      },
      "from_url": "https://www.instagram.com/demo_skinlab/",
      "comments_disabled": false
    }
  ],
  "discoveryInput": {}
}' |
apify call rich_minds/ig-competitor-winning-posts --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,rich_minds/ig-competitor-winning-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/p20Ljp9gJSYImnvqy/builds/cIOfUCyAhqHzEzu94/openapi.json
