Instagram Scraper: Extract Public Profiles and Posts Without a Login

Supply a list of Instagram handles and get back structured JSON for each one: bio, follower and following counts, verification status, business category, external website, and up to 12 recent posts with captions and engagement metrics. HTTP-only, no browser, no login, no Instagram API key. About $5 per 1,000 profiles.

Apify dataset view showing Instagram profile records with fields for username, follower count, biography, verification status, and recent posts
One row per handle: profile stats, bio, and recent posts in one structured record.
Difficulty: Beginner
Time: 5 minutes
Cost: ~$5 per 1,000 profiles ($0.005 per profile + $0.001 to start)
Tools: Apify, NanoScrape Instagram Scraper
Open the actor on Apify View on Apify Console

In this tutorial

  1. What you get
  2. Prerequisites
  3. Step 1: Open the actor
  4. Step 2: Set your input
  5. Step 3: Run and download results
  6. Output field reference
  7. Private accounts and auth walls
  8. Use with n8n, Make, or Zapier
  9. Use with AI agents via MCP
  10. What it costs
  11. FAQ

What you get

For every public Instagram handle you submit, the actor returns one structured record containing:

Private accounts return the profile row (stats and bio) but no post details. Non-existent handles are logged and skipped so your dataset stays clean. The actor is HTTP-only and runs at roughly 128 MB RAM, so it starts in seconds and costs very little at scale.

Prerequisites

No Instagram login or API key needed. The actor reads publicly available data over HTTP. You do not need a personal Instagram account, a Meta developer app, or any special credentials beyond your free Apify account.
STEP 1

Open the actor on Apify

  1. Open the NanoScrape Instagram Scraper on Apify.
  2. Click Try for free. Sign up with Google or email if you do not have an account. It takes about a minute.
  3. Apify redirects you to the actor input page in Apify Console.
NanoScrape Instagram Scraper actor page on Apify showing the description, pricing, and Try for free button
The Instagram Scraper actor page on Apify. Click Try for free to open the input editor.
STEP 2

Set your input

In Apify Console, the actor's Input tab shows a JSON editor. Paste your handles in the usernames array. You can use bare handles, @handle format, or full profile URLs. The actor normalizes them all.

{
  "usernames": [
    "natgeo",
    "@nasa",
    "https://www.instagram.com/bbcnews/"
  ],
  "maxPostsPerProfile": 12,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}

The three fields that matter most:

Apify Console input editor for the Instagram Scraper showing the usernames array and maxPostsPerProfile field
The input editor in Apify Console. Paste your handles into the usernames array.
Tip: set maxPostsPerProfile to 0 when you only care about follower counts, bios, and profile signals. The run finishes faster and costs the same per profile.
STEP 3

Run and download results

  1. Click Start at the bottom of the input page.
  2. Apify shows a live run log. For a batch of up to 100 handles, the run typically finishes in under two minutes.
  3. When the status changes to Succeeded, click Results in the top tab bar to open the dataset.
  4. Use the Export button to download as JSON, JSONL, CSV, or XLSX. You can also read the dataset programmatically via the Apify API or an automation tool like n8n.
Apify Console dataset view after a successful run showing rows for each scraped Instagram profile
The dataset after a run. One row per handle. Export to JSON, CSV, or XLSX.

Each row is one profile record. Here is an example based on the output format documented in the actor README (no live run was performed; the structure is taken directly from the actor's documented output schema):

{
  "username": "example_handle",
  "user_id": "1234567890",
  "full_name": "Example Company",
  "biography": "Example bio for a public Instagram profile.",
  "website": "https://example.com",
  "follower_count": 125000,
  "following_count": 420,
  "post_count": 1830,
  "is_verified": true,
  "is_private": false,
  "is_business_account": true,
  "category_name": "Retail Company",
  "profile_pic_url": "https://scontent.cdninstagram.com/example.jpg",
  "posts": [
    {
      "shortcode": "CxAmpleAbc",
      "caption": "Example post caption.",
      "like_count": 1200,
      "comment_count": 34,
      "media_type": "image",
      "media_url": "https://scontent.cdninstagram.com/example_media.jpg",
      "posted_at": "2026-07-01T12:00:00Z",
      "post_url": "https://www.instagram.com/p/CxAmpleAbc/"
    }
  ],
  "profile_url": "https://www.instagram.com/example_handle/",
  "scraped_at": "2026-07-24T09:00:00Z"
}
Source note: the example output above is taken from the actor's documented output schema in its README, not from a live run. Field names and structure are accurate; values are illustrative.

Output field reference

Every profile record in the dataset contains these fields:

Each entry in posts contains: shortcode, caption, like_count, comment_count, media_type (image, video, or carousel), media_url, posted_at, and post_url.

Private accounts and auth walls

The actor can only scrape publicly available data. Two edge cases to be aware of:

Non-existent handles are not written to the dataset. The actor logs a warning per skipped handle so you can identify typos in your input list.

Use with n8n, Make, or Zapier

You can call the Instagram Scraper from any automation tool that supports the Apify API or the official Apify nodes. The approach is the same whether you are using n8n, Make, or Zapier.

n8n

Install the Apify n8n node (pre-installed on n8n Cloud; available via Community Nodes on self-hosted). Add a Run an Actor and get dataset node, enter your Apify credential, set the Actor ID to santamaria-automations/instagram-scraper, and paste the input JSON. The node waits for the run to finish and returns the dataset items as an array you can pipe into a Google Sheets Append node, a database node, or an HTTP Request.

Prefer a no-code trigger? Swap the Manual Trigger for a Schedule Trigger and n8n will run the scrape on a schedule, keeping your dataset up to date automatically. Use an n8n Cloud account if you want a managed, always-on instance with no maintenance overhead.

Make (formerly Integromat)

Use the HTTP module to call the Apify REST API directly. POST to https://api.apify.com/v2/acts/santamaria-automations~instagram-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN with your input JSON as the request body. Make returns the full dataset as a parsed JSON array in one step.

Zapier

Use a Webhooks by Zapier POST action to call the same Apify run-sync endpoint. The JSON response body contains the dataset items, which you can route to a Google Sheet or any other Zap action.

Tip for large batches in automation tools: the run-sync-get-dataset-items endpoint blocks until the run finishes, which works well for batches up to a few hundred handles. For larger batches, use the async /runs endpoint to start the actor, then poll /datasets/{datasetId}/items once the run status is SUCCEEDED.

Use with AI agents via MCP

The actor is available as an MCP tool for AI clients that support the Model Context Protocol: Claude Desktop, Claude.ai, Cursor, VS Code, LangChain, LlamaIndex, and others. Connect it by adding this server URL to your MCP configuration:

https://mcp.apify.com?tools=santamaria-automations/instagram-scraper

Once connected, you can ask your AI agent things like:

Clients that support dynamic tool discovery (Claude.ai, VS Code) receive the full input schema automatically via add-actor, so you do not need to configure anything beyond the server URL.

What it costs

Pricing is pay-per-event with no monthly minimum. For 1,000 profiles in one run, you pay roughly $0.001 (start) + 1,000 x $0.005 (results) = $5.001. For 100 profiles per day over a month, that works out to about $15 per month.

Pricing source: these figures are taken from the actor's live pricing configuration (effective 2026-07-18). Apify pricing can change. Always verify on the actor page before budgeting a large run.

FAQ

Do I need an Instagram account or API key to use this scraper?

No. The actor reads publicly available Instagram data over HTTP. You do not need a personal Instagram login, a Meta developer app, or any Instagram-issued credentials. A free Apify account is all you need.

Can I scrape private Instagram accounts?

No. Private accounts are accessible only to approved followers. The actor returns the profile row (follower count, bio, verification) for private accounts but cannot retrieve post details. The is_private field in the output will be true.

How many posts per profile can I get?

Up to 12 recent posts per profile, controlled by the maxPostsPerProfile input field (accepts 0 to 12). Set it to 0 if you only need profile-level stats and want to skip posts.

What happens if a handle does not exist?

The actor logs a warning for that handle and continues processing the rest of the batch. Non-existent handles are not written to the dataset, so your output stays clean.

What if Instagram shows an auth wall during a run?

If Instagram temporarily requires login for unauthenticated traffic, the actor stops immediately and logs an escalation message. It does not silently return empty data. Try splitting your batch into smaller runs, or wait a few hours and retry.

Is scraping public Instagram data legal?

Scraping publicly available data is generally permitted in most jurisdictions. The hiQ Labs v. LinkedIn ruling in the US established that scraping public data does not violate the Computer Fraud and Abuse Act. That said, Meta's Terms of Service restrict automated scraping, and the legal picture varies by country and use case. If you plan to use the data commercially or at high volume, consult a lawyer.

Can I run this on a schedule?

Yes. In Apify Console, open the actor and click the Schedules tab to set up a recurring run. From n8n, replace the Manual Trigger with a Schedule Trigger. The scraper treats duplicate handles in the input the same way every run, so you can re-scrape the same list each day to track changes over time.

How do I use the output with Google Sheets?

In n8n, wire an Append to Google Sheet node after the Apify Run an Actor and get dataset node. The dataset items flow directly into it. Alternatively, download the dataset as CSV from the Apify Console and import it into Sheets manually.

Related resources

Open the actor on Apify View on Apify Console