# Instagram Reels Keyword Search: AND, OR, NOT (`deepmine/instagram-reels-keyword-search`) Actor

Instagram reels keyword search scraper with Boolean queries like (pilates OR yoga) AND NOT giveaway: every reel's caption, hashtags or creator matches your query, with plays, likes, comments, date, sound, hashtags, creator followers and the words it matched. No login.

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

## Pricing

from $0.50 / 1,000 reels

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 Reels Keyword Search: AND, OR, NOT

Instagram reels keyword search with Boolean queries: type `(pilates OR yoga) AND NOT giveaway` and get reels whose caption, hashtags or creator match the whole query, with plays, likes, comments, post date, sound, the creator's follower count and the words each reel matched.

| 👤 Creator | 📝 Caption | ▶️ Plays | ❤️ Likes | 🎯 Matched | 🔍 Keyword |
|---|---|---|---|---|---|
| samandanabel | This boy doesn’t know how much happiness he has … | 28,104,261 | 3,505,601 | dog training | "dog training" -giveaway |
| debparna_goswami | Face Yoga for glowing skin 🥰 #flexigirldebparna … | 8,421,387 | 228,933 | yoga | (pilates OR yoga) AND NOT giveaway |
| vermontdogtrainer | 🛑 Following Up From Yesterday’s Post 🛑 So many m… | 16,189,644 | 175,059 | dog training | "dog training" -giveaway |

<sub>Collected 2026-10-07 with the prefilled input: a Boolean pilates/yoga query and "dog training" -giveaway, 50 reels each.</sub>

**$0.65 per 1,000 reels** on the Starter plan ($0.75 Free, $0.55 Scale, $0.50 Business). The prefilled run (100 reels) costs about $0.07. No start fee, no minimum.

### Boolean keyword search

Write operators in capitals: `AND`, `OR`, `NOT`, `"quoted phrases"`, parentheses and `-word`; a space means AND. Each OR branch is searched as its own Instagram topic, and a reel becomes a row only when its caption (hashtags included) or creator's username matches the whole query, word by word. The **🎯 Matches** view shows the words each reel matched (`matchedTerms`) and the search it came from. Plain keywords work too. Same engine as [Instagram Reels Search](https://apify.com/deepmine/instagram-reels-search).

### What you get

- **Reels about your keyword.** By default every reel's caption, hashtags or creator name contains your keyword (cosplay matches #cosplaygirl; filler words like tips, ideas or routine aren't required), in Instagram's own order for the keyword's search, then its related searches (for home workout: home leg workout routines for women, home workout plan for a week, ...). Related searches that drop your keyword are skipped. Turn "Only reels that mention the keyword" off to get everything Instagram groups under the search, loosely related reels included. One keyword can give hundreds of reels.
- **Or recent reels first.** "Sort by: Newest first" reads the keyword's search and its related searches until they hold enough reels from the last 90 days for your limit and delivers them newest first (big asks go out in a few batches, each newest first).
- **Numbers on almost every reel**: plays, likes, comments, post date and length, plus the caption, its hashtags and mentions, the cover image, and the creator's username, profile link and verified check.
- **The details Instagram shows logged-out visitors, at no extra cost**: the video's view count, the song name, artist and sound id (or "Original audio" and whose it is), the tagged location with coordinates, tagged users, collab co-authors and paid partnership where creators set them, the creator's name, picture and follower count, the video's size, and whether comments are off or likes hidden. No share counts: Instagram shows those only to logged-in viewers. Turn "Add reel details" off for the fastest runs.
- **Filters that cost nothing**: minimum plays, likes and comments, posted in the last N days. Reels the filters leave out aren't charged.
- **Boolean keywords**: `("home workout" OR pilates) AND NOT giveaway`. Each OR branch is searched, and every row's caption or creator matches the whole expression; `matchedTerms` lists the words it holds.
- **Reels only**: the occasional photo or carousel post a topic page lists is left out and never charged, with "Add reel details" on or off. OUTPUT counts them as `notReels`.
- **Video file links (optional)**: turn on "Include video file link" to get each reel's MP4 link for downloading.
- **No login, no cookies, no account of yours involved.** The Actor reads Instagram's public topic pages (instagram.com/popular/...), the same ones anyone can open without an account.

Typical uses: content research for a niche, finding creators who get views on a topic right now, and a scheduled run with "Posted in the last N days" to see what's new.

### Input

```json
{
  "keywords": ["(pilates OR yoga) AND NOT giveaway", "\"dog training\" -giveaway"],
  "maxResultsPerKeyword": 50,
  "includeRelatedTopics": true,
  "minPlays": 100000
}
```

- **Keywords**: phrases, #hashtags or instagram.com/popular/ topic URLs. A #hashtag is searched as a phrase (#latteart finds the topic "latteart"), not as the hashtag's own feed. Specific phrases work best ("skincare routine", "dog training", "b2b saas marketing"). Instagram has no topic page for some single broad words ("fitness", "cosplay"); the Actor then tries a close variant ("fitness ideas") and says so, or reports the keyword as having no topic.
- **Boolean keywords**: operators in capitals (`AND`, `OR`, `NOT`), `"quoted phrases"`, parentheses and `-word` (= NOT word); a space means AND. Each OR branch is searched as its own Instagram topic (positive words only), and a reel becomes a row only when its caption (hashtags included) or its creator's username matches the whole expression, word by word (a plural s/es counts as the same word; a phrase also matches as one hashtag: "home workout" matches #homeworkout). Lowercase and/or/not are plain words, so "mac and cheese" stays a normal keyword. Up to 32 OR branches. Reels the expression leaves out aren't charged.
- **Max reels per keyword**: caps each keyword (default 100; the prefilled form asks 50). **Max results** (Advanced) caps the whole run.
- **Sort by**: Most relevant (default: Instagram's ranking for the keyword's search, then its related searches) or Newest first. With Newest first, a keyword whose searches hold fewer recent reels than you ask for is topped up with older ones, still newest first; add "Posted in the last N days" to get only recent ones.
- **Only reels that mention the keyword**: on by default; off = every reel of the keyword's search and its related searches, as Instagram groups them. Reels left out aren't charged.
- **Continue with related searches**: on by default; off = only the keyword's own topic (about 45 reels).
- **Add reel details**: on by default and free; adds the video's views, the creator's name, picture and follower count, the sound, location, tagged users, collaborators, partnership and sponsor fields and the video's size (all keys below marked *details*).
- **Include video file link**: adds `videoUrl`.
- **Filters**: Min plays, Min likes (reels whose creator hides likes are left out), Min comments, Posted in the last N days.

### Output

One row per reel, in the dataset's **📊 Overview** view. **👤 Creators** shows who made each reel with hashtags and mentions; **📈 Stats** shows only the numbers. The run's OUTPUT record (🧾 Run summary) lists each keyword's status, the Instagram topic it used and counts.

#### Output fields

- `cover`: the reel's cover image. Instagram signs media links; they stop working after a few days.
- `caption`: full caption.
- `captionSnippet`: first 50 characters of the caption.
- `authorUsername`: the creator's username, without @.
- `authorFullName`: the creator's display name (*details*).
- `reelUrl`: https://www.instagram.com/reel/<shortcode>/.
- `authorVerified`: the creator has the blue check.
- `authorFollowers`: the creator's follower count (*details*).
- `plays`: play count.
- `views`: the video's view count, a separate counter from plays (often a quarter to a half of them), as Instagram's public embed widget shows it; null when the creator hides counts or turned off embedding (*details*).
- `likes`: like count (null when the creator hides it).
- `comments`: comment count.
- `fbLikeCount`: likes on the reel's Facebook cross-post, when the creator shares reels to Facebook (*details*).
- `durationSeconds`: length in seconds.
- `mediaType`: `reel` (a Reels post) or `video` (a feed video Instagram lists with reels). Photos and carousels are never rows.
- `postedAt`: when it was posted (UTC).
- `rank`: position in Instagram's list for the row's `topic` (1 = first). With Newest first, rows come in date order, so ranks jump.
- `audioTitle`: the reel's sound: a song name, or Original audio (*details*).
- `audioArtist`: the sound's artist, or the account whose original audio it is.
- `isOriginalAudio`: true when the sound is the creator's own audio, false for a song (*details*).
- `locationName`: the place tagged on the reel; about 1 in 7 to 4 in 10 reels have one, depending on the topic (*details*).
- `taggedUsers`: accounts tagged in the reel, each as `{username, fullName, id, profilePicUrl, isVerified}` (*details*).
- `collaborators`: collab co-authors shown next to the creator, in the same shape (*details*).
- `isPaidPartnership`: marked as a paid partnership (*details*).
- `sponsors`: brands named in the paid partnership label, in the same shape (*details*); Instagram usually hides them from visitors who aren't logged in, so this is mostly null even when `isPaidPartnership` is true.
- `hashtags`: hashtags in the caption, lower case, without #.
- `mentions`: accounts mentioned in the caption, without @.
- `hasHiddenLikes`: the creator hides the like count (`likes` is then null) (*details*).
- `isCommentsDisabled`: comments are turned off (*details*).
- `latitude`: the tagged place's latitude (*details*).
- `longitude`: its longitude (*details*).
- `videoWidth`: the video's width in pixels (*details*).
- `videoHeight`: its height (*details*).
- `videoUrl`: direct MP4 link, only with "Include video file link" on (signed; expires after a few days).
- `authorAvatar`: the creator's profile picture (signed; expires after a few days) (*details*).
- `authorProfileUrl`: the creator's profile.
- `keyword`: your keyword this reel was found for.
- `topic`: the Instagram search it came from: your keyword, or a related search Instagram lists for it.
- `matchedTerms`: for a Boolean keyword, the words and phrases of it the reel's caption or creator holds (null for a plain keyword).
- `shortCode`: the reel's shortcode.
- `reelId`: Instagram's numeric media id.
- `audioId`: Instagram's id of the sound; reels with the same id use the same sound (*details*).
- `locationId`: Instagram's id of the tagged place (*details*).
- `authorId`: the creator's numeric user id.
- `scrapedAt`: when the run collected it (UTC).

A few reels come with plays but without likes and date, or the other way round (Instagram's two lists for a topic overlap almost but not quite); those fields are null. Key names match our TikTok Video Search Actor where both have the field, so the two go into one sheet.

Example row (video file link on):

```json
{
  "cover": "https://scontent-dfw6-2.cdninstagram.com/v/t51.82787-15/670413347_18580142578021312_365793381181611000_n.jpg?...",
  "caption": "20 Minutes Full body at home. \nBodyweight \n.\n.\n.\n.\n.\n#homeworkout #fitness #bodyweight #coach",
  "captionSnippet": "20 Minutes Full body at home. Bodyweight . . . . .…",
  "authorUsername": "summers.coach",
  "authorFullName": "Jake Summers",
  "reelUrl": "https://www.instagram.com/reel/DXNQ7uYjqDZ/",
  "authorVerified": false,
  "authorFollowers": 32523,
  "plays": 5200127,
  "views": 1997955,
  "likes": 88963,
  "comments": 230,
  "fbLikeCount": null,
  "durationSeconds": 30.2,
  "mediaType": "reel",
  "postedAt": "2026-04-16T21:15:29Z",
  "rank": 1,
  "audioTitle": "Original audio",
  "audioArtist": "summers.coach",
  "isOriginalAudio": true,
  "locationName": "Jersey City, New Jersey",
  "taggedUsers": null,
  "collaborators": null,
  "isPaidPartnership": false,
  "sponsors": null,
  "hashtags": [
    "homeworkout",
    "fitness",
    "bodyweight",
    "coach"
  ],
  "mentions": null,
  "hasHiddenLikes": false,
  "isCommentsDisabled": false,
  "latitude": 40.7114,
  "longitude": -74.0647,
  "videoWidth": 1080,
  "videoHeight": 1920,
  "videoUrl": "https://scontent-dfw5-1.cdninstagram.com/o1/v/t2/f2/m86/AQNx2IgBQoNh5hbZHfw778XtIOOqGwCpbKobfg4fl7eRoev1hgDQnM_l255_Zmj8eZV90cBSjlagRfh8xTrWwqGRU5peXFxngWcU1so.mp4?...",
  "authorAvatar": "https://scontent-ord5-2.cdninstagram.com/v/t51.82787-19/587876241_18543930538021312_1279283131141608788_n.jpg?...",
  "authorProfileUrl": "https://www.instagram.com/summers.coach/",
  "keyword": "home workout",
  "topic": "home workout",
  "matchedTerms": null,
  "shortCode": "DXNQ7uYjqDZ",
  "reelId": "3876829327233294553",
  "audioId": "26462446580048508",
  "locationId": "213196090",
  "authorId": "194197311",
  "scrapedAt": "2026-10-01T00:30:48Z"
}
```

### Pricing

Pay per result: you pay for reels delivered, never for keywords without reels or for reels your filters leave out.

| Plan | Per 1,000 reels |
|---|---|
| Free | $0.75 |
| Starter | $0.65 |
| Scale | $0.55 |
| Business | $0.50 |

Set a maximum cost on the run and the Actor stops at or before it. Proxies are included: the Actor uses Apify Proxy and switches to residential IPs on its own if Instagram keeps refusing datacenter ones.

### Good to know

- **Instagram's topic lists, not its logged-in search.** Instagram's keyword search (instagram.com/explore/search/keyword/) and its app search only answer logged-in accounts, and this Actor never uses one; the reels here come from the public search pages Instagram shows every visitor (about 45 reels each), ranked its way, plus their related searches. The keyword filter keeps those on your keyword. Suggestive or restricted keywords have small or no public pages, so they give few reels (e.g. 6-9 for "blonde bikini"). Newest first sorts what those pages hold by date; it can't reach reels Instagram puts on no public page.
- **Reel details** come from each reel's public post page data, its public embed widget (the views: Instagram's own video view counter, a separate one from plays) and its creator's public profile (read once per creator); when Instagram doesn't answer one of them, the others fill in what they can, and a reel still without the follower count is counted in the run summary. Instagram shows share counts only to logged-in app users, so rows have no shares.
- **Results change over time** as Instagram re-ranks its topic pages.
- If Instagram ever refuses the topic pages to every IP, the run fails with a clear message instead of finishing empty.
- **Big runs**: the Actor stops a little before the run's timeout and keeps every reel it delivered; raise the timeout in the run options for very large runs (about 5 reels a second).

### Related Actors

- **The same engine, every option in one form:** [Instagram Reels Search](https://apify.com/deepmine/instagram-reels-search) has the full form; the rows are identical.
- **Also need Threads data?** [Threads Scraper](https://apify.com/deepmine/threads-scraper) searches Meta Threads by keyword or hashtag and returns posts, replies and profiles with likes and view counts, with no login.

### Feedback

Found a bug or missing a field? Open an issue in the Issues tab. If the Actor saves you time, a short review on its Store page helps others find it.

# Actor input Schema

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

What to search for, one per line: a phrase (home workout), a #hashtag or an instagram.com/popular/ topic URL. Specific phrases work best; some single broad words have no Instagram topic. Boolean searches work too: ("home workout" OR pilates) AND NOT giveaway (operators in capitals). You pay per reel delivered.

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

Reels per keyword. A topic has about 45 reels; with related searches on, more come from the searches Instagram lists next to it. You pay per reel, so this caps the cost per keyword. Default 100.

## `requireKeywordMatch` (type: `boolean`):

On (default): every reel's caption, hashtags or creator name contains the keyword (cosplay matches #cosplaygirl; filler words like tips, ideas or routine aren't required), and related searches that drop the keyword are skipped. Off: every reel Instagram groups under the keyword's search and its related searches, including loosely related ones. Reels left out aren't charged.

## `sortBy` (type: `string`):

Most relevant (default): Instagram's own order for the keyword's search, then its related searches. Newest first: the Actor reads the keyword's search and its related searches until they hold enough reels from the last 90 days (or from your 'Posted in the last N days'), then delivers the newest first.

## `includeRelatedTopics` (type: `boolean`):

When a keyword's own reels run out, go on with the related searches Instagram suggests for it (for home workout: home workout for women, home leg workout, ...) until the limit above. Each row says which search it came from.

## `minPlays` (type: `integer`):

Keep only reels with at least this many plays. Reels left out aren't charged.

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

Keep only reels with at least this many likes (reels whose creator hides likes are left out). Reels left out aren't charged.

## `minComments` (type: `integer`):

Keep only reels with at least this many comments. Reels left out aren't charged.

## `maxAgeDays` (type: `integer`):

Keep only reels posted in the last N days (e.g. 30). Reels left out aren't charged.

## `maxResults` (type: `integer`):

Stop after this many reels in total. You pay per reel, so this caps the run's cost. Reels come in the order of your keywords.

## `includeDetails` (type: `boolean`):

Adds the video's views, the creator's name, picture and follower count, the sound (song, artist, sound id), the tagged location and coordinates, tagged users, collaborators, paid partnership and sponsors, and the video's size, from three more requests per reel. Free: no extra charge. Turn off for the fastest runs.

## `includeVideoUrl` (type: `boolean`):

Adds videoUrl, a direct link to each reel's MP4 file (for downloading). Instagram signs it; it stops working after a few days. Free: no extra charge.

## `proxyConfiguration` (type: `object`):

Apify Proxy (datacenter) is the default. If Instagram keeps refusing datacenter IPs, the Actor switches to Apify residential on its own, at no extra cost to you. Picking Residential here works the same way (its country applies to those residential tries).

## Actor input object example

```json
{
  "keywords": [
    "(pilates OR yoga) AND NOT giveaway",
    "\"dog training\" -giveaway"
  ],
  "maxResultsPerKeyword": 50,
  "requireKeywordMatch": true,
  "sortBy": "relevance",
  "includeRelatedTopics": true,
  "maxResults": 10000,
  "includeDetails": true,
  "includeVideoUrl": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "keywords": [
        "(pilates OR yoga) AND NOT giveaway",
        "\"dog training\" -giveaway"
    ],
    "maxResultsPerKeyword": 50,
    "sortBy": "relevance",
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("deepmine/instagram-reels-keyword-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 = {
    "keywords": [
        "(pilates OR yoga) AND NOT giveaway",
        "\"dog training\" -giveaway",
    ],
    "maxResultsPerKeyword": 50,
    "sortBy": "relevance",
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("deepmine/instagram-reels-keyword-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 '{
  "keywords": [
    "(pilates OR yoga) AND NOT giveaway",
    "\\"dog training\\" -giveaway"
  ],
  "maxResultsPerKeyword": 50,
  "sortBy": "relevance",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call deepmine/instagram-reels-keyword-search --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,deepmine/instagram-reels-keyword-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/aTDOfbTGZTzysXjK7/builds/qg7bc6osvel7q9n0B/openapi.json
