# Instagram Reels Search Scraper (`khadinakbar/instagram-reels-search-scraper`) Actor

Search public Instagram Reels by keyword or hashtag. Returns reel URL, caption, plays, likes, author, music, and engagement per Reel. Provider-backed (ScrapeCreators primary, SociaVault fallback), cookieless, no login. MCP-ready.

- **URL**: https://apify.com/khadinakbar/instagram-reels-search-scraper.md
- **Developed by:** [Khadin Akbar](https://apify.com/khadinakbar) (community)
- **Categories:** Social media, MCP servers, Videos
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 reel founds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

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

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Instagram Reels Search Scraper

Search public Instagram Reels by **keyword, hashtag, or handle intent** and export structured data: reel URL, caption, plays, likes, comments, engagement rate, author metadata, music info, and run diagnostics — with no Instagram login required.

**Provider-backed:** ScrapeCreators is the primary data source; SociaVault is a best-effort fallback route. The actor resolves keywords to public profile handles, then fetches public Reels for those handles. Provider order is configurable via `providerOrder` input and all fallbacks are recorded in `RUN_SUMMARY`.

### What you get

| Field | Notes |
|---|---|
| `keyword` | The search query that produced this Reel |
| `reel_url` | Canonical `/reel/` URL |
| `caption` | Full caption text |
| `caption_hashtags` | Hashtags parsed from caption |
| `like_count`, `comment_count` | Public engagement counts |
| `play_count` | Video plays (when provider exposes) |
| `engagement_rate` | (likes + comments) / followers × 100 |
| `posted_at` | ISO 8601 timestamp |
| `author_username`, `author_follower_count`, `author_is_verified` | Author metadata |
| `music_title`, `music_artist` | Audio attribution |
| `source_provider` | `scrapecreators` or `sociavault` |

### Who uses this

- **Content marketers** benchmarking competitor Reels in a niche
- **Influencer agencies** finding high-engagement creators by topic
- **Brand managers** monitoring brand mentions in Reel captions
- **AI agents** that need structured Reel data from a keyword (MCP-ready)

### Quick start

```json
{
  "keywords": ["nasa", "#space"],
  "maxResultsPerKeyword": 20,
  "outputMode": "compact"
}
```

### Input reference

| Parameter | Type | Default | Description |
|---|---|---|---|
| `keywords` | string\[] | `["nasa"]` | Keywords, hashtags, or direct handles (e.g. `"nasa"`, `"#fitness"`, `"@nasa"`) |
| `maxResultsPerKeyword` | integer | `20` | Max Reels to save per keyword (1–500) |
| `maxProviderPages` | integer | `5` | Max provider pages per keyword (1–60) |
| `minimumLikes` | integer | `0` | Filter: skip Reels with fewer likes |
| `minPlayCount` | integer | `0` | Filter: skip Reels with fewer plays |
| `onlyReelsNewerThan` | ISO date | — | Filter: skip Reels posted before this date |
| `outputMode` | `full`/`compact` | `full` | Field set returned per row |
| `providerOrder` | enum | `scrapecreators-first` | Provider priority and fallback behavior |
| `startCursor` | string | — | Resume pagination from a previous run cursor |

### Output example (compact mode)

```json
{
  "keyword": "nasa",
  "reel_url": "https://www.instagram.com/reel/ABC123xyz/",
  "caption": "Golden hour in Santorini ✨ #travel #reels",
  "caption_hashtags": ["travel", "reels"],
  "like_count": 3840,
  "comment_count": 47,
  "play_count": 91200,
  "is_reel": true,
  "posted_at": "2024-06-15T10:22:00.000Z",
  "author_username": "wanderlust_creator",
  "author_follower_count": 128000,
  "author_is_verified": false,
  "engagement_count": 3887,
  "engagement_rate": 3.04,
  "source_provider": "scrapecreators",
  "scraped_at": "2026-08-18T07:00:00.000Z"
}
```

### Provider fallback

The `providerOrder` input controls which provider is tried first:

- `scrapecreators-first` *(default)*: tries ScrapeCreators, falls back to SociaVault on failure
- `sociavault-first`: reverses the order
- `scrapecreators-only` / `sociavault-only`: disables the other provider

If the primary provider fails, `fallbacksUsed` in `RUN_SUMMARY` increments and a warning records which keyword triggered the fallback. The row's `source_provider` field always tells you which provider served it.

### Pricing

**$0.0015 per Reel** saved to the dataset + platform usage costs.

- 1,000 Reels = ~$1.50 in data events
- 10,000 Reels = ~$15.00 in data events
- Platform compute and proxy usage are additional (see Apify Console → Pricing tab)

### Run outcomes

| Outcome | Meaning |
|---|---|
| `COMPLETE` | All Reels saved successfully |
| `PARTIAL` | Some Reels saved; provider errors or filters skipped others |
| `VALID_EMPTY` | No Reels matched the request (try broader keywords or remove filters) |
| `INVALID_INPUT` | Missing or malformed input |
| `CONFIG_ERROR` | Both provider API keys missing or invalid |
| `UPSTREAM_FAILED` | Provider failed on every keyword before any Reels were saved |

The `OUTPUT` key-value entry and `RUN_SUMMARY` are always written, even on failure.

### API / MCP usage

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

const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('khadinakbar/instagram-reels-search-scraper').call({
  keywords: ['coffee reels', '#barista'],
  maxResultsPerKeyword: 50,
  outputMode: 'compact',
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

### Builder's note

Instagram's hashtag feed is served from Google-indexed public data, not a complete native feed. Results are best-effort: recent Reels may be sparse for niche topics, and very viral content may be over-represented. If you need a deeper or more complete feed, try the [`instagram-hashtag-scraper`](https://apify.com/khadinakbar/instagram-hashtag-scraper) sibling actor.

### Related actors

- [`instagram-hashtag-scraper`](https://apify.com/khadinakbar/instagram-hashtag-scraper) — hashtag posts (not keyword search)
- [`instagram-reels-scraper`](https://apify.com/khadinakbar/instagram-reels-scraper) — Reels from specific profiles
- [`instagram-posts-scraper`](https://apify.com/khadinakbar/instagram-posts-scraper) — feed posts from profiles
- [`instagram-profile-scraper`](https://apify.com/khadinakbar/instagram-profile-scraper) — profile metadata

### Legal disclaimer

This actor scrapes only publicly visible Instagram Reels data. It does not access private accounts, bypass login walls, or use Instagram credentials. Use responsibly and in compliance with Instagram's Terms of Service and applicable data protection laws.

# Actor input Schema

## `keywords` (type: `array`):

Use this when you want to search Instagram Reels by topic or profile intent. Enter plain keywords (e.g. 'nasa', 'travel creators'), hashtags with or without # (e.g. '#fitness', 'cooking'), or direct handles (e.g. '@nasa'). Each entry is one independent search. The actor resolves keywords to matching public profiles, then scrapes public Reels from those profiles.

## `maxResultsPerKeyword` (type: `integer`):

Use this to cap the number of saved Reels and billable default-dataset events per keyword. Enter an integer from 1 to 500; default is 20. The actor stops saving once this limit is reached for a keyword. This is a per-keyword limit, not a total limit across all keywords.

## `maxProviderPages` (type: `integer`):

Use this advanced control to restrict the number of provider page requests per keyword. Enter an integer from 1 to 60; default is 5. Lower values are useful for low-cost canaries and controlled tests. This limits provider pages fetched, not the number of Reels saved directly.

## `minimumLikes` (type: `integer`):

Use this to skip Reels with fewer than this many public likes. Enter a whole number such as 100; default is 0 (keep all). Reels below this value are filtered before any dataset event is charged. This is not a minimum engagement-rate filter.

## `minPlayCount` (type: `integer`):

Use this to skip Reels with fewer than this many plays. Enter a whole number such as 5000; default is 0 (keep all). Reels below this value are filtered before any dataset event is charged. This requires the provider to expose play counts for the result.

## `onlyReelsNewerThan` (type: `string`):

Use this to filter out Reels posted before a specific date. Enter an ISO 8601 date such as 2024-01-01 or 2024-06-15T00:00:00Z. Default is empty (no date filter). Reels without a parseable timestamp are kept. This filter requires the provider to return posted\_at for each Reel.

## `outputMode` (type: `string`):

Use this to choose between concise agent-friendly rows and richer research rows. Choose compact for the most important Reel and author fields, or full for all fields including media URLs, music metadata, cursor provenance, and engagement rates. Default is full.

## `providerOrder` (type: `string`):

Use this advanced setting to choose which data provider is tried first. scrapecreators-first tries ScrapeCreators then falls back to SociaVault on failure. sociavault-first reverses the order. scrapecreators-only or sociavault-only skips the other entirely. Default is scrapecreators-first.

## `startCursor` (type: `string`):

Use this when continuing a single keyword from a previous run. Paste the cursor from a previous RUN\_SUMMARY keywordSummaries\[].nextCursor. Leave blank to start from the first provider page. This is one shared continuation cursor; if you have multiple keywords only the first keyword continues from this cursor.

## Actor input object example

```json
{
  "keywords": [
    "nasa"
  ],
  "maxResultsPerKeyword": 20,
  "maxProviderPages": 5,
  "minimumLikes": 0,
  "minPlayCount": 0,
  "outputMode": "full",
  "providerOrder": "scrapecreators-first"
}
```

# Actor output Schema

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

Dataset items containing Reel URLs, captions, engagement metrics, author metadata, music info, provider provenance, and scrape timestamps.

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

Compact terminal outcome with itemsPushed, itemsFailed, invalidRecords, warnings, and observed default-dataset event counts.

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

Detailed terminal diagnostics with truthful outcome, provider attempts, fallbacks, pagination, filter counts, warnings, and observed default-dataset event counts.

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

// Run the Actor and wait for it to finish
const run = await client.actor("khadinakbar/instagram-reels-search-scraper").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 = { "keywords": ["nasa"] }

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

```

## MCP server setup

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

```

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/RTZ49WzKHXmfCUttt/builds/Q78B93PCZczJ2kilR/openapi.json
