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

Search public Instagram accounts by keyword for $0.40 per 1,000 saved accounts plus $0.002 per successfully fetched page. Optional public profile enrichment. No login, cookies, browser, or proxy setup.

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

## Pricing

from $0.40 / 1,000 account 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 Account Search | $0.4/1K Accounts + $0.002 per Page

Search Instagram's current ranked public accounts by keyword. Get normalized account identity, username, name, profile URL, privacy and verification flags, query provenance, and deterministic rank. Optionally enrich results with current public profile counts, biography, links, category, business details, and available public contact fields.

Run one or more queries, follow ranked results across bounded pages, and export clean rows to JSON, CSV, Excel, XML, or API workflows. No Instagram login, cookies, browser, or proxy setup.

### What this Actor does

- Searches current Instagram account results for free-text keywords and phrases
- Returns up to 20 ranked account candidates from each valid provider page
- Supports 1–10 queries and up to 10 pages per query for paying users
- Removes duplicate account IDs across pages of the same query
- Optionally enriches accounts with current public profile counts, biography, links, category, business fields, and available public contact fields
- Preserves deterministic query, page, and result ranks
- Exports normalized rows to JSON, CSV, Excel, XML, and API workflows

Use it for account discovery, creator research, local-business research, brand mapping, recruiting research, and building public-profile lists for downstream workflows.

### Quick start

Basic account search:

```json
{
  "queries": ["coffee roaster", "travel photographer"],
  "maxPagesPerQuery": 1,
  "enrichProfiles": false
}
```

Search with profile enrichment:

```json
{
  "queries": ["vegan bakery london"],
  "maxPagesPerQuery": 1,
  "enrichProfiles": true
}
```

`enrichProfiles` is disabled by default and is available to paying users only.

### Basic versus enriched output

| Capability | Basic (`enrichProfiles=false`) | Enriched (`enrichProfiles=true`) |
|---|---|---|
| ID, username, full name, profile URL | Included | Included |
| Search rank and search context | Included | Included |
| Privacy and verification flags | Included | Included and refreshed when available |
| Profile counts and biography | `null` | Current public values when available |
| Website and bio links | Empty/`null` | Current public values when available |
| Category and business flags | `null` | Current public values when available |
| Public email, phone, and address fields | `null` | Included only when the account publicly exposes them |
| Recent posts or Reels | Not included | Not included |
| Enrichment event | Never | Only for a successful identity-matching profile |

Every row has an `enrichment_status`:

- `not_requested` — basic mode
- `succeeded` — a matching profile was mapped and charged
- `not_available` — the profile lookup returned no available profile
- `failed` — the lookup, validation, or identity check failed safely

Unavailable and failed enrichments preserve the basic account row and do not create an enrichment charge.

### Input

| Field | Rules |
|---|---|
| `queries` | Required array of free-text account searches. Whitespace is trimmed; equivalent Unicode/case variants are deduplicated while first occurrence order is retained. The schema accepts up to 10 unique queries; plan-specific effective 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 result guarantee. |
| `enrichProfiles` | Optional boolean; default `false`. Paying users only. Enables one bounded profile-by-ID lookup for each first-seen account candidate that fits within the remaining spending capacity. |

Unknown properties, empty queries, control or formatting characters, invalid types, and out-of-range values are rejected before credentials or network work.

### Dataset rows

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

Example enriched row:

```json
{
  "query": "coffee roaster",
  "query_index": 0,
  "page_number": 1,
  "page_rank": 1,
  "rank": 1,
  "id": "1234567890",
  "username": "example.roaster",
  "full_name": "Example Coffee Roaster",
  "profile_url": "https://www.instagram.com/example.roaster/",
  "is_private": false,
  "is_verified": false,
  "profile_pic_url": "https://cdn.example/profile.jpg",
  "search_serp_type": 1,
  "is_verified_search_boosted": false,
  "search_social_context": null,
  "enrichment_status": "succeeded",
  "follower_count": 12500,
  "following_count": 420,
  "media_count": 680,
  "biography": "Small-batch coffee roasted weekly.",
  "external_url": "https://example.com",
  "bio_links": [{"title": "Shop", "url": "https://example.com/shop"}],
  "account_type": 2,
  "category": "Coffee shop",
  "is_business": true,
  "is_professional_account": true,
  "public_email": "hello@example.com",
  "public_phone_number": null,
  "business_contact_method": "EMAIL",
  "address_street": null,
  "city_name": "Portland",
  "profile_pic_url_hd": "https://cdn.example/profile-hd.jpg"
}
```

The example is illustrative. Optional fields are returned as `null` or an empty list when Instagram does not expose a valid value. Profile image and external-link URLs can change or expire.

### Pricing

**$0.40 per 1,000 saved unique accounts + $0.002 per successfully fetched page. Profile enrichment adds $5.50 per 1,000 successfully enriched accounts.**

| Example | Charge |
|---|---:|
| 1 valid empty page | $0.0020 |
| 1 basic page with 5 saved accounts | $0.0040 |
| 1 basic page with 20 saved accounts | $0.0100 |
| 1 enriched page with 20 successful enrichments | $0.1200 |

Only saved unique accounts are billed. Duplicate or malformed accounts are not. A valid empty or duplicate-only page costs `$0.002`; failed pages are not billed. Profile enrichment is billed only when a matching public profile is successfully enriched and saved. The minimum run spending limit is `$0.0024`, enough for one page and one saved account.

A requested page costs at most `$0.010` in basic mode or `$0.120` with 20 successful enrichments. The largest allowed paid input therefore has a maximum event charge of `$1.00` basic or `$12.00` fully enriched before a lower Apify run spending limit is applied.

#### 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 unique query, uses exactly one search page, and cannot enable profile enrichment, while returning the same dataset fields and page/result billing semantics as paid runs. 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. Paid Apify users are not subject to these demo limits.

### Run summary and audit

The default key-value store contains:

- **`OUTPUT`** — run status, prices, maximum and actual event charge, delivered and charged totals, and sanitized per-query outcomes
- **`AUDIT`** — aggregate non-query request, retry, byte, mapping, duplicate, enrichment, storage, timing, and exact charge-reconciliation metrics

Overall status is one of `SUCCEEDED`, `PARTIAL`, `FAILED`, or `CHARGE_LIMIT_REACHED`. A run can be partial when one query fails while another succeeds. Authentication, provider-balance, spending-capacity, or charged-storage failures stop later work safely.

Admitted FREE runs include a `freeTier` object in `OUTPUT` and `AUDIT` 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. Profile requests for a selected page use bounded concurrency of five, then rows are restored to rank order before storage.

For each query, extraction stops when:

- `maxPagesPerQuery` is reached;
- Instagram reports no more pages;
- the next page token is absent;
- the first continuation page contributes zero new valid account IDs;
- the remaining spending capacity cannot cover the next required event bundle;
- the query encounters a terminal failure.

Instagram search is ranked and query-dependent. This Actor does not promise exhaustive results, stable ordering, fixed page sizes, a minimum row count, or repeatable pagination. A provider page can contain more than 20 raw objects; only the first 20 are eligible for this product contract.

### Limitations and data quality

This Actor:

- returns a current ranked Instagram account-search snapshot, not an exhaustive directory;
- cannot guarantee stable ordering, fixed page size, complete coverage, or a requested number of unique accounts;
- does not search private content or bypass access controls;
- does not include posts, Reels, stories, followers, following lists, engagement rates, email verification, website crawling, or historical tracking;
- does not expose continuation tokens, custom filters, provider fields outside the documented schema, or arbitrary raw responses;
- does not require or accept customer Instagram credentials, cookies, sessions, or proxy configuration.

Public email, phone, website, and address fields are sparse. They appear only when Instagram exposes them on the public profile, are not independently verified, can be outdated, and are never guaranteed. Do not describe a missing value as a lookup failure when `enrichment_status` is `succeeded`.

### API and CLI use

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

```bash
apify actors call publicsignallabs/instagram-account-search \
  --input '{"queries":["coffee roaster"],"maxPagesPerQuery":1,"enrichProfiles":false}' \
  --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, anti-spam requirements, and applicable data-protection law. Minimize retained data, secure exports, honor deletion obligations, and do not use unverified contact fields for unlawful or deceptive outreach.

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, input shape with private values removed, expected result, and observed result. Never include API tokens, cookies, credentials, personal contact values, or other private data.

# Actor input Schema

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

Free-text account searches. The schema accepts up to 10 unique queries; plan-specific effective limits are detailed in Store Pricing.

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

Maximum successful search pages for each query. Each valid page costs $0.002, plus $0.40 per 1,000 saved unique accounts. Later pages may repeat earlier accounts; duplicates are removed. Plan-specific effective limits are detailed in Store Pricing.

## `enrichProfiles` (type: `boolean`):

Fetch current profile counts, biography, links, category, business fields, and available public contacts. Adds $5.50 per 1,000 successfully enriched accounts. Recent posts and contact verification are not included. Paying users only.

## Actor input object example

```json
{
  "queries": [
    "coffee roaster"
  ],
  "maxPagesPerQuery": 1,
  "enrichProfiles": false
}
```

# Actor output Schema

## `accounts` (type: `string`):

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

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

Run status, FREE policy outcome, page/result/enrichment billing, delivered totals, and sanitized per-query outcomes.

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

Non-PII aggregate request, retry, mapping, duplicate, storage, enrichment, charge reconciliation, and FREE policy outcome metrics.

# 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-account-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-account-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-account-search --silent --output-dataset

```

## MCP server setup

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