# Instagram Reels Search Scraper – Keyword Search (`scrapingmonkey/instagram-reels-search`) Actor

Search public Instagram Reels by keyword with pagination. Export Reel URLs, captions, play counts, thumbnails, video links, author data, and media variants.

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

## Pricing

from $1.00 / 1,000 results

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

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

## What's an Apify Actor?

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

## How to integrate an Actor?

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

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

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

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

# README

Search public Instagram Reels by keyword and export structured video results at scale. **Instagram Reels Search Scraper** accepts ordinary search phrases, paginates the public Reels results, and returns one clean dataset row per unique Reel.

Use it for trend monitoring, creator discovery, content research, campaign planning, and keyword-based video datasets without supplying an Instagram login or cookies.

| At a glance | Details |
|---|---|
| 📥 Input | One or more non-empty keywords plus pages per keyword |
| 📤 Output | Reel URL, caption, play count, thumbnail, video URL, author, and video variants |
| 📄 Pagination | Initial page plus requested continuation pages; up to 12 results per page |
| 🔐 Login required | No |
| ⚡ Processing | Up to 5 keyword requests concurrently with automatic retries |
| 💾 Delivery | Apify dataset exportable as JSON, CSV, Excel, XML, and more |

### What the Instagram Reels search scraper collects 🔎

The Actor searches the public Reels surface for each keyword and normalizes the response into rows suited to spreadsheets, APIs, and data pipelines.

Each successful row includes:

- Search keyword and search URL
- Canonical Instagram Reel URL, ID, PK, and shortcode
- Caption and play count when exposed
- Thumbnail and direct video URL when available
- Author identity, profile URL, picture, privacy, and verification status
- Available video variants with resolution and media type

Results are deduplicated within a run. Search ranking is controlled by Instagram, so the Actor returns the public results currently exposed rather than guaranteeing a fixed catalog.

### How to search Instagram Reels by keyword 🚀

1. Add one or more search phrases.
2. Choose `pagesPerKeyword` based on the amount of data required.
3. Start the Actor.
4. Review `success` and `failed` rows in the dataset.
5. Export the results or consume them through the API.

```json
{
  "inputList": [
    "cats",
    "running shoes",
    "space exploration"
  ],
  "pagesPerKeyword": 2
}
```

Spaces inside a phrase are preserved and URL-encoded correctly. The Actor does not merge `running shoes` into `runningshoes`.

### Reels search output fields 📦

| Field | Type | Meaning |
|---|---|---|
| `input` | string | Original submitted keyword |
| `status` | string | `success` or `failed` |
| `keyword` | string or null | Normalized search phrase |
| `search_url` | string or null | Public Instagram search URL |
| `url` | string or null | Canonical Reel URL |
| `id` | string or null | Reel media ID |
| `pk` | string or null | Reel primary key |
| `code` | string or null | Instagram shortcode |
| `type` | string or null | Result type, normally `reel` |
| `caption` | string or null | Reel caption |
| `play_count` | integer or null | Public play count when available |
| `thumbnail_url` | string or null | Preview image URL |
| `video_url` | string or null | Direct video media URL when exposed |
| `author` | object or null | Author profile data |
| `video_versions` | array or null | Available video encodings and resolutions |

Complete successful dataset item:

```json
{
  "input": "space exploration",
  "status": "success",
  "keyword": "space exploration",
  "search_url": "https://www.instagram.com/explore/search/keyword/?q=space%20exploration",
  "url": "https://www.instagram.com/reel/EXAMPLE123/",
  "id": "1234567890123456789",
  "pk": "1234567890123456789",
  "code": "EXAMPLE123",
  "type": "reel",
  "caption": "A new view of space",
  "play_count": 125000,
  "thumbnail_url": "https://instagram.example/reel-thumbnail.jpg",
  "video_url": "https://instagram.example/reel-video.mp4",
  "author": {
    "id": "528817151",
    "pk": "528817151",
    "username": "nasa",
    "name": "NASA",
    "profile_url": "https://www.instagram.com/nasa/",
    "profile_picture_url": "https://instagram.example/author-picture.jpg",
    "is_verified": true,
    "is_private": false
  },
  "video_versions": [
    {
      "url": "https://instagram.example/reel-video-1080.mp4",
      "width": 1080,
      "height": 1920,
      "type": 101
    }
  ]
}
```

Complete failed dataset item:

```json
{
  "input": "   ",
  "status": "failed",
  "keyword": null,
  "search_url": null,
  "url": null,
  "id": null,
  "pk": null,
  "code": null,
  "type": null,
  "caption": null,
  "play_count": null,
  "thumbnail_url": null,
  "video_url": null,
  "author": null,
  "video_versions": null
}
```

Direct Instagram CDN URLs may expire. Download media promptly when long-term retention is required.

### Input and pagination settings ⚙️

| Parameter | Type | Required | Default | Rules |
|---|---|---|---|---|
| `inputList` | array of strings | Yes | None | At least one non-empty keyword |
| `pagesPerKeyword` | integer | No | `1` | Minimum `1` |

The initial public search response counts as page 1. Continuation pages request up to 12 additional Reels per page when Instagram supplies a cursor. The actual row count can be lower because results may end, overlap, disappear, or be deduplicated.

Pagination requests are not a promise of exactly 12 rows. They tell the Actor how many result pages to attempt for each keyword.

### Reels search use cases 🎯

#### Trend and topic monitoring

Track the public Reels appearing for product categories, events, memes, destinations, or industry terms.

#### Creator discovery

Find accounts producing videos around a keyword, then qualify authors using their public profile fields.

#### Content ideation

Analyze captions, thumbnails, formats, and visible play counts to identify recurring creative patterns.

#### Campaign and brand research

Compare search results for branded terms, competitor names, campaign phrases, and adjacent topics.

#### Dataset creation

Export Reel URLs and metadata to JSON, CSV, or Excel for classification, moderation, analytics, or human review.

### Pricing and saved-result behavior 💰

See the Actor's **Pricing** tab for the current charging model and rate. No fixed amount is stated here because Store pricing can change.

Under dataset-item pricing:

- Every unique Reel saved as `success` is one result.
- An invalid keyword or a page that cannot produce usable results may create a `failed` row.
- Automatic retry attempts do not create extra dataset rows by themselves.
- More requested pages can produce more billable result rows.

For example, two fully populated pages can return up to about 24 unique Reels for one keyword, but the real total depends on Instagram's response and deduplication.

### Instagram Reels search API 🔌

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

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

You can trigger runs from schedules, webhooks, Apify client libraries, Make, Zapier, Google Sheets, cloud storage, or your own backend. For larger searches, start the run asynchronously and read the default dataset after completion.

### Reliability, retries, and limits ⚠️

The Actor uses controlled concurrency of up to five requests and automatically retries temporary connection errors, throttling, request timeouts, selected HTTP failures, and blocked redirects. A fresh proxy is selected for new requests.

Bad keyword entries fail without stopping valid entries. When a later pagination page repeatedly fails, the already saved successful rows remain in the dataset and the failure is recorded according to the Actor's page handling.

Search results are personalized and ranked by Instagram's public systems. Availability can vary by time, region, platform changes, safety filtering, and account state. This Actor does not guarantee exhaustive search coverage or stable ordering.

A whole run can fail for infrastructure-level reasons such as startup failure, dataset unavailability, or an unrecoverable error while saving a row.

### Frequently asked questions ❓

#### Does `/popular/` mean the Actor returns only Reels?

This Actor is specifically built around Instagram's public Reels search response and outputs Reel rows. It does not claim to provide general web results, accounts, or hashtags as separate result types.

#### Can a keyword contain spaces?

Yes. Phrases are preserved and encoded for the request.

#### Does it require an Instagram login?

No Instagram credentials or cookies are requested.

#### How many results does one page contain?

The source can return up to 12 Reels per page. Fewer may be returned, and duplicates are removed.

#### Why is `video_url` null?

Instagram does not expose every optional media field for every result. The row can still be useful through its canonical Reel URL and other metadata.

#### Can I download the videos?

When Instagram exposes a direct media URL, it is included. Respect rights and platform rules, and remember that CDN links may expire.

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

For a reproducible issue, provide the Actor support channel with the run ID, approximate run time, page setting, and a safe sample keyword. Never share API tokens or proxy credentials publicly.

Collect and use public data responsibly. Follow applicable privacy, copyright, data-protection, and platform requirements, especially before downloading media or using profile information for outreach.

# Actor input Schema

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

Add one non-empty search keyword such as cats per item. Enter the keyword as plain text, not an Instagram URL. Results come from Instagram's public popular search pages rather than its complete in-app search.

## `pagesPerKeyword` (type: `integer`):

The initial public page counts as page 1. Every additional page asks Instagram for up to 12 more Reels. Collection stops automatically when no more pages are available.

## Actor input object example

```json
{
  "inputList": [
    "cats"
  ],
  "pagesPerKeyword": 1
}
```

# Actor output Schema

## `reels` (type: `string`):

One Dataset row for every unique Reel found for a keyword, using only data exposed directly by Instagram search. Failed input or page rows keep the original input and use failed status.

# API

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

## JavaScript example

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

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

// Prepare Actor input
const input = {
    "inputList": [
        "cats"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapingmonkey/instagram-reels-search").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "inputList": ["cats"] }

# Run the Actor and wait for it to finish
run = client.actor("scrapingmonkey/instagram-reels-search").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "inputList": [
    "cats"
  ]
}' |
apify call scrapingmonkey/instagram-reels-search --silent --output-dataset

```

## MCP server setup

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

```

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/6tRLwy8aoxbBvHcap/builds/fSM14vPCjldBeR8qj/openapi.json
