# Instagram Carousel Analysis — Instagram Post Text Extractor (`afanasenko/instagram-carousel-analyzer`) Actor

Instagram carousel analysis from a post link or uploaded slides. Extract carousel text, hook and structure formulas, visual descriptions and marketing notes. Compare engagement with the author's other carousels. Instagram post text extractor with ordered slide results.

- **URL**: https://apify.com/afanasenko/instagram-carousel-analyzer.md
- **Developed by:** [Andrey Afanasenko](https://apify.com/afanasenko) (community)
- **Categories:** Social media, AI
- **Stats:** 3 total users, 2 monthly users, 66.7% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $200.00 / 1,000 carousels

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Instagram Carousel Analysis — Instagram Post Text Extractor

[![Apify Actor](https://apify.com/actor-badge?actor=afanasenko/instagram-carousel-analyzer)](https://apify.com/afanasenko/instagram-carousel-analyzer)

> **Extract Instagram carousel text and turn its hook, structure and visuals into a reusable content brief.**
> For marketers, creators and researchers: ordered slide results, marketing notes and an illustrated report.

> **🆓 Start on Apify's Free plan:** Try one complete carousel per run using your available Apify credit. You get the full analysis and exports. Carousel events still carry the prices listed below.

### 🎯 What it does

Analyze one whole carousel, with **2–20 slides**, from a public post or your own uploaded images.

| Mode | Input | What it returns |
|---|---|---|
| **Mode 1: Analyze Instagram carousel links** | Public Instagram post links | Slide analysis plus an engagement comparison when enough public metrics exist |
| **Mode 2: Analyze uploaded slides** | Images of one carousel, in order | The same content analysis, including drafts; no engagement comparison |

Text stays in its original language. Notes use the carousel's main language. Video previews exclude speech and movement.

> ⚠️ **Pick your mode first.** Both mode sections stay visible. Each mode reads its own fields. If you select Mode 1 but upload files under Mode 2, the empty link list runs the bundled sample instead. Fill the section matching your choice; empty selected input starts a normally charged sample.

### 📦 Output sample

**One row represents one carousel**, with its slides kept in order:

- **Source and slides:** `carouselUrl`, `authorUsername`, `postedAt`, `language`, `slideCount`, `slides`, `slidesText`.
- **Hook and structure:** `hookQuote`, `hookType`, `hookFormula`, `hookSlideNumbers`, `structureFormula`, `structureRoles`, `structureSlideNumbers`.
- **Marketing review:** `ctaQuote`, `ctaType`, `ctaSlideNumbers`, `marketingNotes`, `strengths`, `recommendations`, and readable text columns.
- **Performance and delivery:** `performance`, `likes`, `comments`, `medianEngagement`, `engagementVsAuthorMedian`, `analysisStatus`, `error`, `analyzedAt`.

This complete row comes from an actual run of the bundled two-slide sample, with normal Carousel pricing:

```json
{
  "inputId": "sample-en-2", "carouselUrl": null, "authorUsername": null, "postedAt": null,
  "slideCount": 2, "previewOnlyVideoCount": 0, "language": "en",
  "slides": [
    {
      "number": 1, "visualDescription": "A minimal slide with light background, a blue top border bar, an orange circle in the bottom right corner, and text presenting a productivity question.", "role": "hook",
      "marketingNotes": [{"note":"Uses a clear benefit-driven question combined with a negative constraint to attract an overworked audience.","slideNumbers":[1],"kind":"model_inference"}],
      "textBlocks": [{"readable":true,"text":"How to win 3 hours back\n\nwithout burning out?\n\nA practical carousel guide","location":"top center"},{"readable":true,"text":"1/2","location":"bottom left"}],
      "text": "How to win 3 hours back\n\nwithout burning out?\n\nA practical carousel guide\n1/2", "unreadableFragments": [], "mediaType": "image", "previewUrl": "https://api.apify.com/v2/key-value-stores/mTtzbCfgdxbLooCno/records/slide-sample-en-2-1.jpg?signature=15YXhx4hjsjIhRWEJjNFH"
    },
    {
      "number": 2, "visualDescription": "A slide with off-white background, blue top border, orange dot in the bottom right, and three actionable closing directives.", "role": "cta",
      "marketingNotes": [{"note":"Provides explicit multi-step instructions telling the reader exactly how to engage.","slideNumbers":[2],"kind":"model_inference"}],
      "textBlocks": [{"readable":true,"text":"Save this checklist.\n\nTry one step this week.\n\nShare your result in the comments.","location":"top center"},{"readable":true,"text":"2/2","location":"bottom left"}],
      "text": "Save this checklist.\n\nTry one step this week.\n\nShare your result in the comments.\n2/2", "unreadableFragments": [], "mediaType": "image", "previewUrl": "https://api.apify.com/v2/key-value-stores/mTtzbCfgdxbLooCno/records/slide-sample-en-2-2.jpg?signature=1kIinKCjarn4eUfTdwVdd"
    }
  ],
  "slidesText": "Slide 1\nHow to win 3 hours back\n\nwithout burning out?\n\nA practical carousel guide\n1/2\n\nSlide 2\nSave this checklist.\n\nTry one step this week.\n\nShare your result in the comments.\n2/2", "structureRoles": "1: hook → 2: cta",
  "hookQuote": "How to win 3 hours back\n\nwithout burning out?", "hookType": "question", "hookFormula": "How to [achieve desirable outcome] without [pain point]?", "hookSlideNumbers": [1],
  "structureFormula": "Pose a time-saving question with a constraint on slide 1, followed by a direct call to action and engagement steps on slide 2.", "structureSlideNumbers": [1,2],
  "ctaQuote": "Save this checklist.", "ctaType": "save", "ctaSlideNumbers": [2],
  "marketingNotes": [{"note":"Extremely short two-slide structure that gets straight to the point without filler content.","slideNumbers":[1,2],"kind":"model_inference"}],
  "strengths": [{"note":"Clean, uncluttered layout with consistent branding elements like the top blue bar and orange circle.","slideNumbers":[1,2],"kind":"model_inference"}],
  "recommendations": [{"note":"Expand the carousel by adding intermediate slides with actual actionable tips instead of jumping straight from the hook to the CTA.","slideNumbers":[1,2],"kind":"model_inference"}],
  "marketingNotesText": "Slides 1, 2: Extremely short two-slide structure that gets straight to the point without filler content.", "recommendationsText": "Slides 1, 2: Expand the carousel by adding intermediate slides with actual actionable tips instead of jumping straight from the hook to the CTA.",
  "performance": {"status":"not_assessed","reason":"uploaded_slides","observedAt":"2026-10-07T12:34:57.749Z","likes":null,"comments":null,"cohort":[],"cohortSize":0,"medianEngagement":null,"engagementVsAuthorMedian":null,"ageWindowDays":null,"scan":{"pages":0,"posts":0,"complete":false}},
  "likes": null, "comments": null, "medianEngagement": null, "engagementVsAuthorMedian": null,
  "analysisStatus": "analyzed", "error": null, "analyzedAt": "2026-10-07T12:34:57.891Z"
}
```

Missing values are `null`; missing lists are `[]`. Interpretations carry `kind: "model_inference"`; citations name the source slides.

| View | What each row is | Best for |
|---|---|---|
| **Carousel analyses** | The same carousel rows, showing selected summary columns | Comparing hooks, text, recommendations and available engagement |

Export the **full dataset as JSON** for nested slides and comparison posts. Use CSV/Excel text columns for spreadsheet reviews.

### ⚡ Quick start

1. **Pick your mode first** in **Choose operation mode**. Both sections remain visible; fill only the matching section.
2. For your own post, select **Mode 1**, paste its public carousel link and set **Maximum carousels** to `1`.
3. Click **Start**. Open **Carousel Report** for images and notes, or **Storage → Dataset** for structured results.

To try the bundled sample instead, use this tested minimal input on either a Free or paid account:

```json
{}
```

Empty input produces one two-slide sample analysis, consumes your allowance, and triggers one normally priced **Carousel** event.

### ⭐ Choose your mode

#### 🎯 Mode 1: Analyze Instagram carousel links

Set `mode` to `analyzeUrls` and fill `postUrls` with public `/p/` links.
Repeated links are merged before processing. `maxCarousels` defaults to `10`; paid accounts can request up to `100`.
Free accounts analyze one complete carousel per run. No Instagram login or cookies are requested.

#### 🎯 Mode 2: Analyze uploaded slides

Set `mode` to `analyzeSlides`. Upload **2–20 JPG, PNG or WebP images** into `slideImages`.
The first file becomes slide 1; keep the complete presentation order. API users provide downloadable HTTPS image URLs.
One run represents one uploaded carousel. Author details and engagement metrics remain unknown.

### 🧭 When to use it

- **Content marketers:** Turn a reference carousel into a brief with its opening promise, sequence and call to action.
- **Creators:** Review a draft for gaps between its hook, supporting slides and final request.
- **Social media agencies:** Build a spreadsheet of client and competitor hooks, structures and marketing notes.
- **Brand researchers:** Search the text inside slide images, beyond the post caption.
- **Campaign analysts:** Compare a public carousel with other carousels from the same author.
- **Multilingual teams:** Keep original English, Russian or Spanish text alongside notes in the main language.

Use the recommendations as review prompts. They are interpretations, not evidence that a design choice caused higher engagement.

### 🛠 Input

| Section | Purpose |
|---|---|
| **Choose operation mode** | Select which input the actor reads |
| **🎯 Mode 1: Analyze Instagram carousel links** | Enter post links and limit the number of carousels |
| **🎯 Mode 2: Analyze uploaded slides** | Upload one ordered set of slide images |

- **`mode`** — Set this first: `analyzeUrls` or `analyzeSlides`. Other mode fields do not provide input for your selection.
- **`postUrls`** — Public carousel links. Different links to the same post count once within the run.
- **`maxCarousels`** — Mode 1 limit: default `10`, range `1–100`; Free accounts are capped at one.
- **`slideImages`** — Mode 2 images: exactly one carousel, with `2–20` files in presentation order.

In the run settings, use **Maximum charge** as your spending ceiling. This setting is separate from the JSON input.
A limit stops new analyses; it never delivers only part of a carousel to fit the budget.

### 💰 How much will Instagram carousel analysis cost?

The actor uses **Pay Per Event** with one product event: **Carousel** (`CAROUSEL_ANALYZED`).
It is charged after a complete, validated analysis is saved. The price includes up to 20 slides and available engagement comparison.

| Apify tier | Price per Carousel |
|---|---:|
| Free / Bronze | **$0.25** |
| Silver | **$0.22** |
| Gold / Platinum / Diamond | **$0.20** |

**Pricing math:** totals below cover successfully delivered Carousel events.

| Carousels analyzed | Free / Bronze rate | Silver rate | Gold and higher rate |
|---:|---:|---:|---:|
| 1 | $0.25 | $0.22 | $0.20 |
| 5 | $1.25 | $1.10 | $1.00 |
| 10 | $2.50 | $2.20 | $2.00 |
| 30 | $7.50 | $6.60 | $6.00 |
| 100 | $25.00 | $22.00 | $20.00 |

Free accounts can analyze only one per run. Larger totals require a paid account; Bronze uses the first rate column.
Failed, unavailable or incomplete analyses trigger no Carousel event. Retries add no separate event or per-slide fee.
Check Apify's run estimate for any standard platform start charge. Starting a new run can charge the same post again.

### 🆓 Free vs paid plan

| Feature | Apify Free plan | Paid plan |
|---|---|---|
| Carousels per run | One complete carousel | Up to 100 links, or one uploaded carousel |
| Slides per carousel | 2–20 | 2–20 |
| Content analysis and reports | Full result | Full result |
| Public engagement comparison | Included when eligible | Included when eligible |
| Successful runs per UTC month | Up to 15, subject to monthly analysis allowance | Free-plan monthly cap does not apply |
| Payment | Carousel price uses available Apify credit | Carousel price uses account balance |

The monthly analysis allowance can run out before the 15-run cap, especially with longer, denser carousels.
Check **User Message** if an allowance stops your run. Upgrade for larger batches and continued use beyond Free limits.

### 🧪 Recipes

**Review one public carousel.** Replace the example link with your own public post when needed.

```json
{
  "mode": "analyzeUrls",
  "postUrls": ["https://www.instagram.com/p/Dd9JNwOlyjj/"],
  "maxCarousels": 1
}
```

This limits the request to one carousel and works within the Free per-run allowance, if the post remains available.

**Analyze uploaded draft slides.** These URLs reproduce our two-slide sample. For a draft, upload your files in the form.

```json
{
  "mode": "analyzeSlides",
  "slideImages": [
    "https://api.apify.com/v2/key-value-stores/mTtzbCfgdxbLooCno/records/slide-sample-en-2-1.jpg?signature=15YXhx4hjsjIhRWEJjNFH",
    "https://api.apify.com/v2/key-value-stores/mTtzbCfgdxbLooCno/records/slide-sample-en-2-2.jpg?signature=1kIinKCjarn4eUfTdwVdd"
  ]
}
```

API users replace the URLs with their own downloadable images. Array order defines slide order; no author metrics are inferred.

### 🔁 Resume / checkpoint

If a run is interrupted, use Apify's **Resurrect** action on that same run when available.
The actor preserves saved results and avoids another Carousel charge for results already delivered in that run.

**Start** creates a new run. It does not reuse the previous run's billing or make repeat analysis free.
For a failed carousel, read `error`, fix its input and retry. Existing results remain available in the original dataset.

### 📡 Live status & storage records

Open **Carousel Report** during processing to follow progress. It refreshes as complete results arrive.
After completion, it shows slides, source text, visual descriptions and slide-linked marketing notes in presentation order.

| Storage key | Type | What it holds |
|---|---|---|
| `status.html` | HTML | Progress, ordered slide previews, full analysis and a CSV download link |
| `RUN_SUMMARY` | JSON | Result counts, charges, stop reason, report and export links |
| `USER_MESSAGE` | JSON | A plain-language explanation and the suggested next step |
| `FREE_LIMITS_APPLIED` | JSON | Free allowances applied to this run |

The running container also provides `/` for the report, `/api/status` for progress JSON and `/health` for availability.
After the container stops, use the stored report. Save exports you need beyond your account's storage retention period.

### 🤖 Programmatic / API use

Use the [Apify REST API](https://docs.apify.com/api/v2/actors-runs-post) with your Apify token in the authorization header:

```bash
curl --fail-with-body -X POST \
  'https://api.apify.com/v2/acts/afanasenko~instagram-carousel-analyzer/runs?maxTotalChargeUsd=0.50' \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"mode":"analyzeUrls","postUrls":["https://www.instagram.com/p/Dd9JNwOlyjj/"],"maxCarousels":1}'
```

The response supplies `data.id`. Poll `GET /v2/actor-runs/{runId}` until the run finishes.
Read `data.defaultDatasetId`, then fetch `GET /v2/datasets/{datasetId}/items?format=json&clean=true` with the same authorization header.
[Dataset exports](https://docs.apify.com/api/v2/dataset-items-get) also support `format=csv` and `format=xlsx`.

**AI assistants:** Connect your client to [Apify's MCP server](https://docs.apify.com/integrations/mcp) at `https://mcp.apify.com`.
Ask it to find and run `afanasenko/instagram-carousel-analyzer`, inspect its input, and retrieve the resulting dataset.
Example: “Analyze this Instagram carousel; extract every slide's text and explain the hook formula with slide references.”

For recurring workflows, save an Apify task or configure [integrations and webhooks](https://docs.apify.com/integrations).
For a marketing sheet, export `slidesText`, `hookFormula`, `structureFormula` and `recommendationsText` after the run succeeds.

### 💡 Tips & Best Practices

#### Getting maximum results

- Start with one reference carousel. Check its report before building a larger library.
- Include every slide in a draft, especially the opening and final call to action.
- Read the slide references beside recommendations to judge whether each suggestion fits your material.

#### Cost optimization

- Set `maxCarousels` to the number of analyses you actually need; the default for links is ten.
- Set **Maximum charge** before a batch. Leave enough room for at least one full Carousel event.
- Save your exports and reuse them for later research. A new analysis run can charge again.

#### Performance

- Use direct, downloadable image URLs for API uploads; avoid links to preview pages.
- Group same-author links together. The actor reuses the author's metric scan within a run.
- Use the live report to follow longer batches. Dense text and longer sequences can take more time.

#### Data quality

- Upload full-resolution slides in the correct order. Avoid crops that remove small labels or footnotes.
- Check `unreadableFragments` and compare important quotations with the source image.
- Treat marketing notes as suggestions. Check public engagement separately before calling a reference a success.

### ❓ FAQ

**How do I extract text from an Instagram carousel?**
Use Mode 1 with a public carousel link, or Mode 2 with ordered images. `slides[].text` preserves visible source text.
Use `slidesText` when you want the whole sequence in one spreadsheet cell.

**How do I find a carousel's hook formula and structure?**
Read `hookQuote`, `hookFormula` and `structureFormula`. The hook formula uses variables such as `[desired outcome]`.
Slide numbers connect each quote and recommendation to the source. Missing textual hooks and CTAs remain `null`.

**Can I analyze an Instagram carousel before publishing it?**
Yes. Upload all slide images in Mode 2. You get the full content review without invented engagement or author details.

**Is there a free Instagram carousel analyzer trial?**
You can try this actor on Apify's Free plan using available credit. Analysis events remain priced at $0.25 each.
The actor allows one carousel per run and up to 15 successful runs per UTC month, within its monthly analysis allowance.

**How does it compare carousel performance?**
It compares likes plus comments with the median of up to 30 other carousels by the same author.
Posts must be half to twice the target's age, inside 48 hours–90 days. At least five need visible metrics.
The scan covers up to 10 pages / 120 posts from the last 90 days; `performance` includes coverage, dates and sample members.
Hidden counts, too few eligible posts or a zero median leave the ratio `null`. Uploads have no comparison.
The comparison measures observed engagement. Metrics are kept out of content analysis and cannot explain what caused success.

**Does it transcribe video slides or measure reach and saves?**
No. `video_preview` means only the static preview was read. Speech, motion, reach, saves and swipe-through are unavailable.
For reel speech and on-screen text, use the related Instagram Transcript actor below.

**How accurate is carousel text extraction?**
Clear text gives better results than small, blurred or decorative lettering. Unreadable regions are marked rather than reconstructed.
Review critical quotations against the image. There is no promised accuracy percentage for arbitrary Instagram content.

**Why did I receive the sample instead of my own carousel?**
The selected mode had empty input. For `analyzeUrls`, fill `postUrls`; for `analyzeSlides`, fill `slideImages`.
Files entered under the other mode are ignored. Empty selected input runs the bundled sample and consumes a normal analysis event.

**Why are some values `null`, and are duplicate posts charged twice?**
`null` means the value is absent or cannot be assessed. Missing lists are `[]`; failed rows have blank text columns.
Repeated links to the same post are merged within one run. Starting a fresh run can charge for that post again.

**What happens if an image or analysis fails?**
The dataset records the reason without a Carousel event. The actor does not sell a partial or invalid analysis.
Read **User Message** for the next step; a private or deleted post may require your own permitted slide uploads.

**How fast is it?**
Length, image access, text density and the author's metric scan affect run time. Follow the live report for progress.

### 🔗 Other related actors (same author)

| You start with… | You want… | Use this actor |
|---|---|---|
| Carousel links or slide images | Slide text, hook and structure formulas, marketing notes | **This actor** |
| Reels or video links | Spoken transcript and on-screen text | [Instagram Transcript — Instagram Reel & Video Transcript](https://apify.com/afanasenko/instagram-reel-script-extractor) |
| Public account usernames | Stories, highlights, media links and mentions | [Instagram Stories & Highlights Scraper](https://apify.com/afanasenko/instagram-stories-highlights-scraper) |
| Profile names or keywords | Public profile details and account discovery | [Instagram Profile Scraper](https://apify.com/afanasenko/instagram-profile-scraper) |

### 🛟 Support & feedback

- Open the [Issues tab in Apify Console](https://console.apify.com/actors/5uTjNLycChhTi7IKq/issues) for problems or feature requests.
- Include the **run ID**, selected mode, and the result or error you expected us to inspect.
- Leave feedback on the [Apify Store page](https://apify.com/afanasenko/instagram-carousel-analyzer) to help other users choose.

### ⚖️ Is it legal to analyze Instagram carousels?

Public availability does not grant unrestricted rights to copy or reuse a carousel. Use material you have permission to process.
The actor accepts public post links or uploaded images; it does not request Instagram credentials or access private accounts.
Follow [Instagram's Terms of Use](https://help.instagram.com/581066165581870), content rights and privacy rules relevant to your use.

# Changelog

This Actor's version history is a separate document: https://apify.com/afanasenko/instagram-carousel-analyzer/changelog.md

# Actor input Schema

## `mode` (type: `string`):

Choose how to provide your carousel. Fill in the matching section below.

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

Paste public Instagram carousel /p/ links, one per line. Repeated links are processed once. Used in Mode 1.

## `maxCarousels` (type: `integer`):

Stop after this many unique carousel links. Default 10, maximum 100. Free plans analyze one complete carousel per run. Used in Mode 1.

## `slideImages` (type: `array`):

Upload 2–20 JPG, PNG or WebP images of one carousel in slide order. The first file is slide 1. API users pass an ordered array of downloadable image URLs. Used in Mode 2.

## Actor input object example

```json
{
  "mode": "analyzeUrls",
  "postUrls": [],
  "maxCarousels": 10,
  "slideImages": []
}
```

# Actor output Schema

## `report` (type: `string`):

No description

## `results` (type: `string`):

No description

## `summary` (type: `string`):

No description

## `message` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

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

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("afanasenko/instagram-carousel-analyzer").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("afanasenko/instagram-carousel-analyzer").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 '{}' |
apify call afanasenko/instagram-carousel-analyzer --silent --output-dataset

```

## MCP server setup

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

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/5uTjNLycChhTi7IKq/builds/77zVwH8so54AIvcca/openapi.json
