# Instagram Reels Search | $0.4/1K Reels + $0.002 per Page (`publicsignallabs/instagram-reels-search`) Actor

Search public Instagram Reels by keyword for $0.40 per 1,000 saved Reels plus $0.002 per successfully fetched page. One page per query by default. No login, cookies, browser, or proxy setup.

- **URL**: https://apify.com/publicsignallabs/instagram-reels-search.md
- **Developed by:** [Public Signal Labs](https://apify.com/publicsignallabs) (community)
- **Categories:** Social media, Lead generation, Automation
- **Stats:** 4 total users, 3 monthly users, 95.5% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.40 / 1,000 reel results

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?

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 | $0.4/1K Reels + $0.002 per Page

Search current public Instagram Reels by keyword for **$0.40 per 1,000 saved Reels plus $0.002 per successfully fetched page**. One page per query is the default. No Instagram login, cookies, browser, or proxy setup.

### What this Actor does

- Searches Instagram's current ranked public Reel results for one or more free-text queries
- Fetches up to 10 pages separately for each paying query
- Removes duplicate Reel IDs across pages of the same query
- Preserves the same Reel separately when it appears under different queries
- Returns Reel, engagement, media, audio, and public creator fields
- Exports normalized rows to JSON, CSV, Excel, XML, and API workflows

Use it for public content discovery, trend research, creative analysis, campaign research, and repeatable keyword-monitoring workflows.

### Quick start

1. Enter one or more free-text searches.
2. Choose the maximum pages to fetch for each query.
3. Run the Actor, then open or export the default dataset.

```json
{
  "queries": ["home workout", "sourdough starter"],
  "maxPagesPerQuery": 1
}
```

### Input

| Field | Rules |
|---|---|
| `queries` | Required array of free-text searches. Leading/trailing whitespace is removed, equivalent Unicode/case variants are deduplicated, and first occurrence order is retained. Paying users may provide 1–10 unique queries; plan-specific limits are detailed in Pricing. Each query is limited to 100 Unicode code points. |
| `maxPagesPerQuery` | Optional integer from 1 through 10; default 1. Applied separately to each query. Plan-specific effective limits are detailed in Pricing. This is a maximum page count, not a row guarantee. |

Unknown input properties, empty queries, control characters, invalid types, and out-of-range values are rejected before extraction begins.

### Dataset rows

One row represents one charged, unique Reel for one submitted query. A Reel may appear once—and incur one result event—for each distinct query because its query provenance is meaningful. Duplicate Reel IDs from later pages of the same query are suppressed and are not charged again.

```json
{
  "query": "home workout",
  "query_index": 0,
  "page_number": 1,
  "page_rank": 1,
  "rank": 1,
  "id": "1234567890",
  "shortcode": "ExampleCode",
  "reel_url": "https://www.instagram.com/reel/ExampleCode/",
  "caption": "Example caption #fitness",
  "hashtags": ["fitness"],
  "mentions": [],
  "taken_at": "2026-01-01T12:00:00Z",
  "play_count": 1000,
  "like_count": 100,
  "comment_count": 10,
  "share_count": 5,
  "duration_seconds": 12.5,
  "thumbnail_url": "https://...",
  "video_url": "https://...",
  "width": 1080,
  "height": 1920,
  "author_id": "987654321",
  "author_username": "example_creator",
  "author_full_name": "Example Creator",
  "author_is_verified": false,
  "author_is_private": false,
  "audio_title": "Original audio",
  "audio_artist": "Example Creator"
}
```

| Field group | Meaning |
|---|---|
| `query`, `query_index` | Normalized submitted search and its zero-based order |
| `page_number`, `page_rank`, `rank` | First page/order where the Reel appeared and its unique query rank |
| `id`, `shortcode`, `reel_url` | Stable Reel identity and canonical public URL |
| `caption`, `hashtags`, `mentions`, `taken_at` | Current public caption metadata and publication time |
| `play_count`, `like_count`, `comment_count`, `share_count` | Current engagement values when exposed |
| `duration_seconds`, `thumbnail_url`, `video_url`, `width`, `height` | Current media metadata; external media URLs can expire |
| `author_*` | Current public creator identity and account flags |
| `audio_title`, `audio_artist` | Current audio/music attribution when exposed |

Nullable fields are returned as `null` when Instagram does not expose a valid value. The default dataset contains customer rows only; run summaries are not mixed into exports.

### Pricing

**$0.40 per 1,000 saved unique Reels + $0.002 per successfully fetched page.**

| Example | Charge |
|---|---:|
| 1 valid empty page | $0.0020 |
| 1 page with 12 saved Reels | $0.0068 |
| 2 pages with 20 saved Reels | $0.0120 |

Only saved unique Reels are billed. Duplicate or malformed Reels are not. A valid empty or duplicate-only page costs `$0.002`; failed pages are not billed. The minimum run spending limit is `$0.0024`, enough for one page and one saved Reel.

#### FREE demo limits

FREE Apify accounts can run this Actor up to 5 times per UTC calendar month. Each admitted FREE run accepts exactly one query and fetches at most one page per query; a larger submitted `maxPagesPerQuery` is reduced to one before extraction. Console, CLI, API, schedules, webhooks, MCP, and other Apify launch methods share the same account allowance. A run counts once admitted even when it is later aborted or unsuccessful, and resurrecting it does not start another extraction. Creating another task or API token does not reset the allowance. FREE runs use the same billing, dataset, and output contracts as paid runs. Paid Apify users are not subject to these demo limits.

### Run summary

The default key-value store contains:

- **`OUTPUT`** — overall status, Reel and page prices, maximum requested page charge, delivered/charged Reel totals, charged pages, and sanitized per-query outcomes
- **`AUDIT`** — aggregate request, retry, byte, mapping, duplicate, Reel/page-charge, storage, and timing reconciliation metrics

Per-query outcomes report requested/fetched/charged pages, raw/mapped/unique/skipped counts, duplicate suppression, whether more pages were reported, and a stable stop reason.

Overall status is one of:

- `SUCCEEDED`
- `PARTIAL`
- `FAILED`
- `CHARGE_LIMIT_REACHED`

A run can be `PARTIAL` when one query fails while another succeeds. Account-wide configuration or capacity failures stop later queries safely.

Admitted FREE runs include a `freeTier` object with the UTC month, claimed slot, remaining allowance, effective page limit, and policy version. Rejected FREE runs use stable reasons such as `free_monthly_limit`, `free_run_already_consumed`, or `free_quota_unavailable`. The record never contains an Apify user ID, API token, or internal quota-storage identifier.

Allowance exhaustion and replay complete the Apify run successfully, while `OUTPUT.status` remains `FAILED`; the stable `stopReason`/`freeTier.outcome` remains machine-readable, and identity/quota verification errors still fail the platform run.

### Pagination and stopping behavior

Queries and pages run sequentially so spending-limit checks, billing order, and query provenance remain deterministic.

For each query, extraction stops when:

- `maxPagesPerQuery` is reached;
- Instagram reports no more pages;
- either next-cursor component is absent;
- the run cannot charge another page or at least one Reel result within its spending limit;
- the query encounters a terminal failure.

A page that adds zero new Reels does not by itself stop pagination. A later page can still contain new Reel IDs.

Instagram can return the same cursor pair for consecutive pages while changing the ranked results. An unchanged cursor therefore remains eligible for another bounded page request. The strict 10-page maximum prevents unbounded loops.

This version intentionally does not expose continuation tokens. Start a new search run when you need a fresh ranked snapshot.

### Limitations

This Actor:

- returns Instagram's current ranked public Reel search snapshot, not an exhaustive index;
- cannot guarantee stable ordering, fixed page sizes, minimum row counts, or repeatable results;
- may return fewer unique rows on deeper pages because Instagram can repeat Reel IDs;
- does not search private content or bypass access controls;
- does not perform profile enrichment, hashtag-feed extraction, historical accumulation, or custom sorting;
- does not filter by date, language, engagement, or creator size;
- does not guarantee that external thumbnail or video URLs remain available;
- does not require or accept customer Instagram credentials, cookies, sessions, or proxy configuration.

### API and CLI use

Call the Actor through the standard Apify Actor Runs API. Read Reel rows from the default dataset and reconciliation metadata from the `OUTPUT` and `AUDIT` records.

```bash
apify actors call publicsignallabs/instagram-reels-search \
  --input '{"queries":["home workout"],"maxPagesPerQuery":1}' \
  --output-dataset
```

The Actor also works with the Apify JavaScript and Python clients, REST API, schedules, webhooks, and platform integrations.

### Responsible use

Collect and use public data only where you have a lawful purpose. Respect privacy, intellectual-property rights, platform rules, and applicable data-protection law. Minimize retained data, secure exports, and delete records when no longer needed.

This Actor is unofficial and is not affiliated with or endorsed by Instagram or Meta.

### Support

Use the **Issues** tab on this Actor's Apify page. Include the run ID, expected result, and observed result. Never include API tokens, cookies, credentials, or private data.

# Actor input Schema

## `queries` (type: `array`):

Free-text Reel searches. Paying users may submit up to 10 unique queries; plan-specific limits are detailed in Store Pricing.

## `maxPagesPerQuery` (type: `integer`):

Maximum successfully fetched pages for each query; default 1. Each valid page costs $0.002, plus $0.40 per 1,000 saved unique Reels. Later pages may repeat earlier Reels. Plan-specific effective limits are detailed in Store Pricing.

## Actor input object example

```json
{
  "queries": [
    "home workout"
  ],
  "maxPagesPerQuery": 1
}
```

# Actor output Schema

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

Unique current ranked Reel rows from the default dataset, ready for preview or export.

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

Run status, the non-sensitive FREE policy outcome, Reel and page billing, delivered totals, and sanitized per-query outcomes.

## `audit` (type: `string`):

Non-PII aggregate request, retry, mapping, duplicate, storage, charge, and timing reconciliation metrics, plus the same non-sensitive FREE policy outcome when applicable.

# 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("publicsignallabs/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 = {}

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,publicsignallabs/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/fjXYioUPm9SKK0blj/builds/nriS5Ezb8shT5CRXu/openapi.json
