# Instagram Profile Scraper (`w3crawler/instagram-profile-scraper`) Actor

Extract public Instagram profile metadata such as usernames, follower counts, biography, verification state, profile images, and external links.

- **URL**: https://apify.com/w3crawler/instagram-profile-scraper.md
- **Developed by:** [w3crawler](https://apify.com/w3crawler) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.99 / 1,000 profiles

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/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 Profile Scraper

Extract public Instagram profile metadata from anonymous browser-rendered profile pages: username, display name, biography, follower/following/post counts, verification and privacy flags, profile image, external links, bio links, story highlights, pronouns, category, and visible recent post links. The Actor never logs in, reuses private cookies, bypasses a challenge, or accesses private profiles.

### Get started

1. Open the [Actor Store page](https://apify.com/w3crawler/instagram-profile-scraper) and select **Try for free** or open the **Input** tab.
2. Enter public profile identifiers in `usernames` and/or canonical profile URLs in `profileUrls`. Both lists are merged and deduplicated.
3. Set `maxItems` and choose `browserMode`. Keep `maxItems` small for the first run.
4. Start the Actor, open the dataset, and export the profiles as JSON, CSV, or Excel. Open **Run summary** (`OUTPUT`) to check emitted and failure counts.

### Input

All fields are optional; with no targets the Actor uses the `instagram` username. Unsupported field names and out-of-range values are rejected before the browser starts.

| Field | Type | Required? | Default | Meaning |
| --- | --- | --- | --- | --- |
| `usernames` | string array | Optional | `["instagram"]` | Public usernames; a leading `@` is accepted. Usernames and profile URLs are merged and deduplicated, up to 100 each. |
| `profileUrls` | string array | Optional | Not supplied | Canonical `https://www.instagram.com/<username>/` URLs. Merged with `usernames`; media, login, challenge, and non-Instagram URLs are rejected. |
| `maxItems` | integer | Optional | `10` | Maximum profiles scraped, 1–100. It is also capped at the number of unique supplied profiles. |
| `browserMode` | string enum | Optional | `desktop` | Anonymous rendering profile: `desktop` or `mobile`, with matching user agent, viewport, locale, and timezone. |
| `requestTimeoutSecs` | integer | Optional | `20` | Per-profile navigation timeout, 5–60 seconds. |
| `maxRequestRetries` | integer | Optional | `2` | Additional browser navigation attempts, 0–3. |
| `requestDelayMs` | integer | Optional | `0` | Delay before each subsequent profile, 0–10,000 ms. |
| `proxyConfiguration` | object | Optional | `{"useApifyProxy":false}` | Optional Apify Proxy settings: `useApifyProxy`, `apifyProxyGroups`, and `apifyProxyCountry`. Direct access is the default. |

Example input using the default username and settings:

```json
{
  "usernames": [
    "instagram"
  ],
  "maxItems": 10,
  "browserMode": "desktop",
  "requestTimeoutSecs": 20,
  "maxRequestRetries": 2,
  "requestDelayMs": 0,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

If only one unique profile is supplied, the effective `maxItems` and the summary value are `1`, even when the input requests a higher limit.

### Output

The dataset contains one row per saved public profile. Optional values are omitted when Instagram does not expose them, and failures are reported in logs and `OUTPUT` instead of placeholder rows. Counts and links reflect what the public page returned during the run.

| Field | Type | Availability | Meaning |
| --- | --- | --- | --- |
| `url` | string | Always | Canonical public profile URL. |
| `searchUrl` | string | Always | Profile URL requested for extraction. |
| `id` | string | Always | Stable identifier in the form `instagram-profile:<username>`. |
| `recordType` | string enum | Always | Normal record type; always `instagram-profile`. |
| `targetType` | string enum | Always | Target type; always `profile`. |
| `profileUrl` | string | Always | Canonical public profile URL. |
| `sourceUrl` | string | Always | Public profile page used for extraction. |
| `canonicalUrl` | string | Always | Canonical profile URL. |
| `username` | string | Always | Public Instagram username. |
| `userId` | string | When published | Public numeric profile identifier as a string. |
| `fullName` | string | When published | Public display name. |
| `bio` | string | When published | Public biography text. |
| `followers` | integer | When published | Public follower count. Private or restricted pages may hide it. |
| `following` | integer | When published | Public following count. |
| `posts` | integer | When published | Public post count. |
| `isVerified` | boolean | When published | Public verification flag. |
| `isPrivate` | boolean | When published | Public private-account flag. |
| `profilePicUrl` | string | When published | Public profile image URL; CDN links are time-limited. |
| `externalUrl` | string | When published | First public external URL from the biography links. |
| `bioLinks` | object array | When published | Public biography links with `url` and, when displayed, `title`. |
| `highlights` | object array | When published | Public story highlights with `title` and `thumbnailUrl`. |
| `pronouns` | string array | When published | Public pronouns. |
| `category` | string | When published | Public account category. |
| `recentPosts` | object array | When a public non-private grid is rendered | Up to 12 visible post links with `url`, `thumbnailUrl`, and `alt`. Not a complete post catalog. |
| `scrapedAt` | string | Always | Time the record was emitted, in ISO UTC. |

Example of a real saved row from the 2026-10-25 run. The profile image and all seven highlights are included exactly as saved.

```json
{
  "id": "instagram-profile:instagram",
  "recordType": "instagram-profile",
  "targetType": "profile",
  "profileUrl": "https://www.instagram.com/instagram/",
  "sourceUrl": "https://www.instagram.com/instagram/",
  "canonicalUrl": "https://www.instagram.com/instagram/",
  "username": "instagram",
  "userId": "25025320",
  "fullName": "Instagram",
  "bio": "Discover what's new on Instagram 🔎✨",
  "followers": 686435702,
  "following": 158,
  "posts": 8624,
  "isVerified": true,
  "isPrivate": false,
  "profilePicUrl": "https://scontent-bos5-1.cdninstagram.com/v/t51.82787-19/550891366_18667771684001321_1383210656577177067_n.jpg?stp=dst-jpg_s150x150_tt6&_nc_cat=1&ccb=7-5&_nc_sid=f7ccc5&efg=eyJ2ZW5jb2RlX3RhZyI6InByb2ZpbGVfcGljLnd3dy4xMDgwLkMzIn0%3D&_nc_ohc=0JxmKDYmCiYQ7kNvwHiSmAD&_nc_oc=AdoFl79Z5KAUMUfDKNc-dNqorMD86eKtq_yrJ-pxwBpQYQpt3SIXYzIJLb38SgbX6COgdQmKBj-F3EUmD15dKEkc&_nc_zt=24&_nc_ht=scontent-bos5-1.cdninstagram.com&_nc_gid=Dbp8-d5uiRKBpmPDGLOvLQ&_nc_ss=79689&oh=00_AQNR7SAGSfS6XMyuRvIs7VspS2jtk_VRlkDb-KX717wZgQ&oe=6AE45927",
  "externalUrl": "http://help.instagram.com",
  "bioLinks": [
    {
      "url": "http://help.instagram.com"
    },
    {
      "title": "Close Friends Only with @kaicenat and @kaiyacenat | Spotify",
      "url": "https://open.spotify.com/episode/6B8XsGCYuHMYzSLvLMitS7?si=kXd6_Y6AQhueoC_McepSKg"
    },
    {
      "title": "Close Friends Only with @kaicenat and @kaiyacenat | YouTube",
      "url": "https://www.youtube.com/watch?v=z0X36mIbyCo"
    }
  ],
  "highlights": [
    {
      "title": "close friends",
      "thumbnailUrl": "https://scontent-bos5-1.cdninstagram.com/v/t51.71878-15/756700225_1653985762331725_8429300849500507026_n.jpg?stp=dst-jpg_s150x150_tt6&_nc_cat=1&ccb=7-5&_nc_sid=acbce5&_nc_ohc=NLBVWHHV_vYQ7kNvwGUxp6k&_nc_oc=Adrzem93E_YWyGDz3IxVbUuw6LyktoP3W5QChfx99DabTCrVmCUgvdOvYT8zt19Uk2Hej2tAaLxLVWuU57qctPxQ&_nc_zt=23&_nc_ht=scontent-bos5-1.cdninstagram.com&_nc_gid=Dbp8-d5uiRKBpmPDGLOvLQ&_nc_ss=79689&oh=00_AQM1esWCwEas45lAWteu4_gspQeu3SvYULKW9jXb8EYUew&oe=6AE4467E"
    },
    {
      "title": "🎤🎶🎸",
      "thumbnailUrl": "https://scontent-bos5-1.cdninstagram.com/v/t51.71878-15/755867844_1751720619182762_5430881549273743299_n.jpg?stp=dst-jpg_s150x150_tt6&_nc_cat=1&ccb=7-5&_nc_sid=acbce5&_nc_ohc=SmUVvSate6sQ7kNvwGANO9K&_nc_oc=AdpVxu3BzBTs6a_GfGE9VDs_WYTRo-nwnDP-uozLc8vDL62E4xepgghJiO1pZV6lUeKJiO6IeTEucX6-gMmabA3_&_nc_zt=23&_nc_ht=scontent-bos5-1.cdninstagram.com&_nc_gid=Dbp8-d5uiRKBpmPDGLOvLQ&_nc_ss=79689&oh=00_AQP1eEVXIodLnYta435VXc3_kqcoIRBMWQ3efmsvZL_41w&oe=6AE44AAF"
    },
    {
      "title": "what’s new",
      "thumbnailUrl": "https://scontent-bos5-1.cdninstagram.com/v/t51.71878-15/755331856_1609699020573638_4426177467586352650_n.jpg?stp=dst-jpg_s150x150_tt6&_nc_cat=1&ccb=7-5&_nc_sid=acbce5&_nc_ohc=xe_3WvMEa6UQ7kNvwGeyvp6&_nc_oc=AdrdztiK0HqKy6IaIwmT5ySpPdtOnv-pkzDrPAyT5yfRdpsk41JhBL0jQ6i3zAw9IWWC0HCPSPy3rma_gp4uN8i5&_nc_zt=23&_nc_ht=scontent-bos5-1.cdninstagram.com&_nc_gid=Dbp8-d5uiRKBpmPDGLOvLQ&_nc_ss=79689&oh=00_AQMb129lYCnfHYEz3iilRIoJnh9vHTPLrdvfKUE-JSDrrw&oe=6AE43EF3"
    },
    {
      "title": "creatives",
      "thumbnailUrl": "https://scontent-bos5-1.cdninstagram.com/v/t51.71878-15/756661521_3289512177887855_4009891805420027177_n.jpg?stp=dst-jpg_s150x150_tt6&_nc_cat=1&ccb=7-5&_nc_sid=acbce5&_nc_ohc=n9BPI8bE91EQ7kNvwG1t19u&_nc_oc=AdrvwbzMESqrioAHQpLIRRhZrWU4gVdwZkNxQSx5aUvh03MtvesPxHBXF3Wg74SU0QR-bkVSP-q1y_2cPEjErTh7&_nc_zt=23&_nc_ht=scontent-bos5-1.cdninstagram.com&_nc_gid=Dbp8-d5uiRKBpmPDGLOvLQ&_nc_ss=79689&oh=00_AQPlixkduukPPrO8SwBbIAZZ0_r1mgEgsj-GGSf7SjDSBA&oe=6AE449D7"
    },
    {
      "title": "🎾🏀⚽️",
      "thumbnailUrl": "https://scontent-bos5-1.cdninstagram.com/v/t51.82787-15/575724433_18680673526001321_5945490939444494882_n.jpg?stp=c0.5x0.5f_dst-jpg_e35_p150x150_tt6_u&_nc_cat=1&ccb=7-5&_nc_sid=18de74&efg=eyJlZmdfdGFnIjoiU1RPUlkuYmVzdF9pbWFnZV91cmxnZW4uQzMifQ%3D%3D&_nc_ohc=M_Lb7AxWwkEQ7kNvwGKOp61&_nc_oc=AdpfDAIO3JyCy3aFrbPAviryyrOGaBUGNHHZX_F0MXPSWk3wB1kUlJzT1AFJ3gBj4L7re2s_jZOAHjBvQ-9jDaSc&_nc_zt=23&_nc_ht=scontent-bos5-1.cdninstagram.com&_nc_gid=Dbp8-d5uiRKBpmPDGLOvLQ&_nc_ss=79689&oh=00_AQMjwXTa9pfWWIh7VvRD2ixBZIkQLbD-B9xGJuyV6_cmJA&oe=6AE45949"
    },
    {
      "title": "🚗🚗🚗",
      "thumbnailUrl": "https://scontent-bos5-1.cdninstagram.com/v/t51.71878-15/775233495_1033957092733525_6010470506239881158_n.jpg?stp=dst-jpg_s150x150_tt6&_nc_cat=105&ccb=7-5&_nc_sid=acbce5&_nc_ohc=mKmwR4NP00sQ7kNvwFI9PLq&_nc_oc=AdrkPmyyhhhcB5om1Mr_PJJEBCA9-86TtwPr1Cbqg2oNBOQoQQN2T6lL1-NIrrSdUS0aQLNRMO4fZjsxdgjt63m-&_nc_zt=23&_nc_ht=scontent-bos5-1.cdninstagram.com&_nc_gid=Dbp8-d5uiRKBpmPDGLOvLQ&_nc_ss=79689&oh=00_AQNTx07_31thCI85Igq-7Sh03kG_hCrw2T5v3-ZedTTfGg&oe=6AE446B9"
    },
    {
      "title": "🎥🌟🍿",
      "thumbnailUrl": "https://scontent-bos5-1.cdninstagram.com/v/t51.71878-15/755264526_1764587937905767_5811150211834945970_n.jpg?stp=dst-jpg_s150x150_tt6&_nc_cat=107&ccb=7-5&_nc_sid=acbce5&_nc_ohc=hq4jeuH5HHEQ7kNvwHmn08S&_nc_oc=Ado14PNCaGUZ1jan7-mqrKDnbANPqkKxRNPNNmhJShmAkCbs8q5T3ndcEbdTNUqeoYpL5i_zKexK33NWv1HFr8UW&_nc_zt=23&_nc_ht=scontent-bos5-1.cdninstagram.com&_nc_gid=Dbp8-d5uiRKBpmPDGLOvLQ&_nc_ss=79689&oh=00_AQMEJYAzjimA4ArmqDVpn7WKwFUfPswifLeUmFjzqNqvVA&oe=6AE421F9"
    }
  ],
  "scrapedAt": "2026-10-25T20:48:18.329Z",
  "url": "https://www.instagram.com/instagram/",
  "searchUrl": "https://www.instagram.com/instagram/"
}
```

### Run summary

**Run summary** is stored separately from the dataset in the run's key-value store under `OUTPUT`.

| Field | Meaning |
| --- | --- |
| `status` | Actor process outcome: `SUCCEEDED` or `FAILED`. |
| `runStatus` | Canonical run status; matches `status`. |
| `dataStatus` | Completeness of saved rows: `COMPLETE`, `PARTIAL`, `NO_RESULTS`, or `FAILED`. |
| `requestedProfileCount` | Profiles scheduled after deduplication and the effective `maxItems` cap. |
| `emittedCount` | Profile rows written to the dataset. |
| `profileCount` | Profile rows written; matches `emittedCount`. |
| `diagnosticCount` | Public page issues logged; diagnostics are not dataset rows. |
| `failureCount` | Navigation or extraction failures for scheduled profiles. |
| `optionalFailureCount` | Optional summary-write failures. |
| `maxItems` | Effective profile cap, reduced to the number of unique supplied profiles when smaller. |
| `browserMode` | `desktop` or `mobile` rendering profile used for the run. |
| `completedAt` | Time the summary was written, in ISO UTC. |

| Status | Data status | Meaning |
| --- | --- | --- |
| `SUCCEEDED` | `COMPLETE` | Rows were saved without diagnostics or failures. |
| `SUCCEEDED` | `PARTIAL` | Rows were saved, but at least one profile logged a diagnostic or failure. Saved rows remain available. |
| `SUCCEEDED` | `NO_RESULTS` | No row was saved, with no run error or counted failure. |
| `FAILED` | `FAILED` | No row was saved and the run hit an error or counted failure. |

Example `OUTPUT` from the 2026-10-25 run. The saved input asked for `maxItems: 1`; one profile was supplied.

```json
{
  "status": "SUCCEEDED",
  "runStatus": "SUCCEEDED",
  "dataStatus": "COMPLETE",
  "requestedProfileCount": 1,
  "emittedCount": 1,
  "profileCount": 1,
  "diagnosticCount": 0,
  "failureCount": 0,
  "optionalFailureCount": 0,
  "maxItems": 1,
  "browserMode": "desktop",
  "completedAt": "2026-10-25T20:48:18.684Z"
}
```

### Coverage and limitations

Each profile is opened in a headless Chromium browser using the selected `browserMode`. Extraction tries Instagram's embedded Relay user payload first, then legacy JSON, then DOM text, then Open Graph/meta tags; later layers expose fewer fields. `bioLinks`, `highlights`, pronouns, and category are richest in the Relay payload and may be absent when only fallback layers succeed. Recent post links are read from the rendered public grid only for non-private profiles and are capped at 12.

The Actor does not log in, use private cookies, bypass challenges or rate limits, access private profiles, download media or story bytes, collect follower lists, fetch comments, or provide historical counts. Private or restricted profiles can expose only a subset of fields, and missing counts are not inferred. Follower, following, and post counts are display-derived and can be rounded or abbreviated. Profile and CDN image URLs are time-limited.

`usernames` and `profileUrls` are merged and deduplicated; `maxItems` cannot exceed the number of unique supplied profiles. `browserMode` changes rendering but does not guarantee a different field set. Proxy routing is optional and does not bypass access controls. Diagnostics and navigation failures are reported in logs and `OUTPUT`, and can leave the run `PARTIAL` or `FAILED`.

### Usage and support

Cost is driven by browser compute time, the number of profiles, navigation retries, delay, and optional proxy use. Start with one or two profiles and a low `maxItems`, inspect the dataset and `OUTPUT`, then scale. See the Actor's Pricing tab for current account rates.

Use the [Actor Issues page](https://apify.com/w3crawler/instagram-profile-scraper/issues) to report a problem. Include the run ID, the input used, and the run summary; do not include tokens, cookies, or private data. This Actor is not affiliated with Instagram or Meta. Use it only for public data and in accordance with Instagram's terms, robots guidance, and applicable law. Public pages can contain personal information; use the output only for lawful purposes.

# Changelog

This Actor's version history is a separate document: https://apify.com/w3crawler/instagram-profile-scraper/changelog.md

# Actor input Schema

## `usernames` (type: `array`):

Public Instagram usernames; an optional leading @ is accepted.

## `profileUrls` (type: `array`):

Canonical public https://www.instagram.com/<username>/ URLs; merged with usernames and deduplicated.

## `maxItems` (type: `integer`):

Maximum number of normalized profiles to scrape.

## `browserMode` (type: `string`):

Anonymous public rendering profile.

## `requestTimeoutSecs` (type: `integer`):

Per-profile navigation timeout.

## `maxRequestRetries` (type: `integer`):

Additional browser navigation attempts.

## `requestDelayMs` (type: `integer`):

Optional delay before navigating to each subsequent profile.

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

Optional Apify Proxy configuration. Direct access is the default.

## Actor input object example

```json
{
  "usernames": [
    "instagram"
  ],
  "maxItems": 10,
  "browserMode": "desktop",
  "requestTimeoutSecs": 20,
  "maxRequestRetries": 2,
  "requestDelayMs": 0,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

## `keyValueStore` (type: `string`):

No description

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

Run status and counters stored by the Actor.

# 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 = {
    "usernames": [
        "instagram"
    ],
    "maxItems": 10,
    "browserMode": "desktop",
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("w3crawler/instagram-profile-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 = {
    "usernames": ["instagram"],
    "maxItems": 10,
    "browserMode": "desktop",
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("w3crawler/instagram-profile-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 '{
  "usernames": [
    "instagram"
  ],
  "maxItems": 10,
  "browserMode": "desktop",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call w3crawler/instagram-profile-scraper --silent --output-dataset

```

## MCP server setup

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