---
title: "Instagram Scraper API - Profiles, Posts & Reels"
description: "Instagram scraper API: send a profile, post or reel URL, get followers, captions, likes, comments and media as JSON. No login. 15 credits per page, free tier."
url: https://webscraping.ai/instagram-scraper-api
markdown_index: https://webscraping.ai/llms.txt
---
STRUCTURED DATA API

# Instagram Scraper API

An Instagram scraper you call over HTTP: send a profile, post or reel URL to `/data` and get followers, captions, like and comment counts, media URLs and recent comments back as JSON. No Instagram login, session or Graph API app. Flat 15 credits per page.

[Start Free Trial](https://webscraping.ai/auth/sign_up)[View Documentation](https://webscraping.ai/docs#data)

2,000 free API credits · No credit card required

## Scrape Instagram profiles, posts and reels

Send the page's normal URL to `/data`. The page type is detected from the URL, and the response tells you which one it was in `request_parameters.type`.

### Profile

`type: "profile"`

Username, full name, bio and bio links, followers, following and post counts, verified and private flags, profile picture, highlights, and the latest 12 posts.

`instagram.com/username``instagram.com/username/reels`

### Post

`type: "post"`

Caption, hashtags and mentions, likes and comments counts, timestamp, owner, images or carousel items, tagged users, coauthors, location, and the latest comments.

`instagram.com/p/SHORTCODE``instagram.com/tv/SHORTCODE``instagram.com/username/p/SHORTCODE`

### Reel

`type: "reel"`

Everything a post has, plus the video URL, duration, view count, audio track and music info.

`instagram.com/reel/SHORTCODE``instagram.com/reels/SHORTCODE`

 These URLs return a `400` that isn't charged, with a message listing what is supported: stories, share links (`instagram.com/share/…`), and explore, hashtag and location pages. More page types and sites are added over time, so don't validate URLs on your side — send the URL and handle the 400.

## How to scrape Instagram with one API call

No selectors, proxies, or headless browser to run. The page-scraping options (`js`, `proxy`, `headers`…) don't apply; `country` picks the proxy country (default `us`).

**cURL**

```bash
curl -G "https://api.webscraping.ai/data" \
  --data-urlencode "api_key=YOUR_API_KEY" \
  --data-urlencode "url=https://www.instagram.com/nasa/"
# Response (excerpt):
# {
# "request_parameters": {"url": "https://www.instagram.com/nasa/",
# "provider": "instagram", "type": "profile"},
# "parse_status": "ok",
# "data": {
# "id": "528817151",
# "username": "nasa",
# "full_name": "NASA",
# "url": "https://www.instagram.com/nasa/",
# "biography": "...",
# "external_url": "https://www.nasa.gov",
# "followers_count": 104000000,
# "follows_count": 91,
# "posts_count": 4930,
# "is_verified": true,
# "is_private": false,
# "latest_posts": [{"short_code": "...", "url": "https://www.instagram.com/p/.../",
# "type": "Sidecar", "caption": "...", "child_posts_count": 4}, ...],
# ...
# }
# }
```

**Python**

```python
# pip install webscraping_ai
# https://pypi.org/project/webscraping-ai/
from webscraping_ai import Client

client = Client(api_key="YOUR_API_KEY")
result = client.data("https://www.instagram.com/nasa/")
print(result["request_parameters"]["provider"], result["parse_status"])
print(result["data"])
# Response (excerpt):
# {
# "request_parameters": {"url": "https://www.instagram.com/nasa/",
# "provider": "instagram", "type": "profile"},
# "parse_status": "ok",
# "data": {
# "id": "528817151",
# "username": "nasa",
# "full_name": "NASA",
# "url": "https://www.instagram.com/nasa/",
# "biography": "...",
# "external_url": "https://www.nasa.gov",
# "followers_count": 104000000,
# "follows_count": 91,
# "posts_count": 4930,
# "is_verified": true,
# "is_private": false,
# "latest_posts": [{"short_code": "...", "url": "https://www.instagram.com/p/.../",
# "type": "Sidecar", "caption": "...", "child_posts_count": 4}, ...],
# ...
# }
# }
```

**JavaScript**

```javascript
// npm install webscraping-ai
// https://www.npmjs.com/package/webscraping-ai
import { WebScrapingAI } from 'webscraping-ai';

const client = new WebScrapingAI({ apiKey: 'YOUR_API_KEY' });
const result = await client.data({ url: 'https://www.instagram.com/nasa/' });
console.log(result.request_parameters.provider, result.parse_status);
console.log(result.data);
// Response (excerpt):
// {
// "request_parameters": {"url": "https://www.instagram.com/nasa/",
// "provider": "instagram", "type": "profile"},
// "parse_status": "ok",
// "data": {
// "id": "528817151",
// "username": "nasa",
// "full_name": "NASA",
// "url": "https://www.instagram.com/nasa/",
// "biography": "...",
// "external_url": "https://www.nasa.gov",
// "followers_count": 104000000,
// "follows_count": 91,
// "posts_count": 4930,
// "is_verified": true,
// "is_private": false,
// "latest_posts": [{"short_code": "...", "url": "https://www.instagram.com/p/.../",
// "type": "Sidecar", "caption": "...", "child_posts_count": 4}, ...],
// ...
// }
// }
```

**PHP**

```php
<?php
// composer require webscraping-ai/webscraping-ai-php
// https://packagist.org/packages/webscraping-ai/webscraping-ai-php
require 'vendor/autoload.php';

use WebScrapingAI\Client;

$client = new Client('YOUR_API_KEY');
$result = $client->data(url: 'https://www.instagram.com/nasa/');
echo $result['request_parameters']['provider'], ' ', $result['parse_status'], "\n";
print_r($result['data']);
// Response (excerpt):
// {
// "request_parameters": {"url": "https://www.instagram.com/nasa/",
// "provider": "instagram", "type": "profile"},
// "parse_status": "ok",
// "data": {
// "id": "528817151",
// "username": "nasa",
// "full_name": "NASA",
// "url": "https://www.instagram.com/nasa/",
// "biography": "...",
// "external_url": "https://www.nasa.gov",
// "followers_count": 104000000,
// "follows_count": 91,
// "posts_count": 4930,
// "is_verified": true,
// "is_private": false,
// "latest_posts": [{"short_code": "...", "url": "https://www.instagram.com/p/.../",
// "type": "Sidecar", "caption": "...", "child_posts_count": 4}, ...],
// ...
// }
// }
```

**Ruby**

```ruby
# gem install webscraping_ai
# https://rubygems.org/gems/webscraping_ai
require 'webscraping_ai'

client = WebScrapingAI::Client.new(api_key: 'YOUR_API_KEY')
result = client.data('https://www.instagram.com/nasa/')
puts "#{result['request_parameters']['provider']} #{result['parse_status']}"
puts result['data'].inspect
# Response (excerpt):
# {
# "request_parameters": {"url": "https://www.instagram.com/nasa/",
# "provider": "instagram", "type": "profile"},
# "parse_status": "ok",
# "data": {
# "id": "528817151",
# "username": "nasa",
# "full_name": "NASA",
# "url": "https://www.instagram.com/nasa/",
# "biography": "...",
# "external_url": "https://www.nasa.gov",
# "followers_count": 104000000,
# "follows_count": 91,
# "posts_count": 4930,
# "is_verified": true,
# "is_private": false,
# "latest_posts": [{"short_code": "...", "url": "https://www.instagram.com/p/.../",
# "type": "Sidecar", "caption": "...", "child_posts_count": 4}, ...],
# ...
# }
# }
```

**Go**

```go
// go get github.com/webscraping-ai/webscraping-ai-go/v4
// https://pkg.go.dev/github.com/webscraping-ai/webscraping-ai-go/v4
package main

import (
    "context"
    "fmt"

    webscrapingai "github.com/webscraping-ai/webscraping-ai-go/v4"
)

func main() {
    client, _ := webscrapingai.NewClient(&webscrapingai.Config{APIKey: "YOUR_API_KEY"})
    res, _ := client.Data(context.Background(), &webscrapingai.DataOptions{
        URL: "https://www.instagram.com/nasa/",
    })
    fmt.Println(res.RequestParameters.Provider, res.ParseStatus)
    fmt.Println(string(res.Data)) // raw JSON; its shape depends on the provider and page type
}
// Response (excerpt):
// {
// "request_parameters": {"url": "https://www.instagram.com/nasa/",
// "provider": "instagram", "type": "profile"},
// "parse_status": "ok",
// "data": {
// "id": "528817151",
// "username": "nasa",
// "full_name": "NASA",
// "url": "https://www.instagram.com/nasa/",
// "biography": "...",
// "external_url": "https://www.nasa.gov",
// "followers_count": 104000000,
// "follows_count": 91,
// "posts_count": 4930,
// "is_verified": true,
// "is_private": false,
// "latest_posts": [{"short_code": "...", "url": "https://www.instagram.com/p/.../",
// "type": "Sidecar", "caption": "...", "child_posts_count": 4}, ...],
// ...
// }
// }
```

**Java**

```java
// Maven: ai.webscraping:webscraping-ai:4.2.0
// https://central.sonatype.com/artifact/ai.webscraping/webscraping-ai
import ai.webscraping.Client;
import ai.webscraping.Config;
import ai.webscraping.option.DataOptions;
import ai.webscraping.result.DataResult;

Client client = new Client(Config.builder().apiKey("YOUR_API_KEY").build());
DataResult result = client.data(DataOptions.builder()
    .url("https://www.instagram.com/nasa/")
    .build());
System.out.println(result.getRequestParameters().getProvider() + " " + result.getParseStatus());
System.out.println(result.getData());
// Response (excerpt):
// {
// "request_parameters": {"url": "https://www.instagram.com/nasa/",
// "provider": "instagram", "type": "profile"},
// "parse_status": "ok",
// "data": {
// "id": "528817151",
// "username": "nasa",
// "full_name": "NASA",
// "url": "https://www.instagram.com/nasa/",
// "biography": "...",
// "external_url": "https://www.nasa.gov",
// "followers_count": 104000000,
// "follows_count": 91,
// "posts_count": 4930,
// "is_verified": true,
// "is_private": false,
// "latest_posts": [{"short_code": "...", "url": "https://www.instagram.com/p/.../",
// "type": "Sidecar", "caption": "...", "child_posts_count": 4}, ...],
// ...
// }
// }
```

**C#**

```csharp
// dotnet add package WebScrapingAI
// https://www.nuget.org/packages/WebScrapingAI
using WebScrapingAI;

var client = new WebScrapingAIClient(new WebScrapingAIClientOptions { ApiKey = "YOUR_API_KEY" });
var result = await client.DataAsync(new DataRequest {
    Url = "https://www.instagram.com/nasa/",
});
Console.WriteLine($"{result.RequestParameters.Provider} {result.ParseStatus}");
Console.WriteLine(result.Data);
// Response (excerpt):
// {
// "request_parameters": {"url": "https://www.instagram.com/nasa/",
// "provider": "instagram", "type": "profile"},
// "parse_status": "ok",
// "data": {
// "id": "528817151",
// "username": "nasa",
// "full_name": "NASA",
// "url": "https://www.instagram.com/nasa/",
// "biography": "...",
// "external_url": "https://www.nasa.gov",
// "followers_count": 104000000,
// "follows_count": 91,
// "posts_count": 4930,
// "is_verified": true,
// "is_private": false,
// "latest_posts": [{"short_code": "...", "url": "https://www.instagram.com/p/.../",
// "type": "Sidecar", "caption": "...", "child_posts_count": 4}, ...],
// ...
// }
// }
```

Trimmed, and the counts are illustrative — they change constantly. Fields a page doesn't expose come back as `null`, though some flags come back `false` and lists come back empty. `data` can be `null` when `parse_status` is `parse_failed` or `not_found`, so check it before reading fields.

## What the Instagram scraper returns

The key fields per page type. Names are snake\_case across every site; the full contract is in the [API reference](https://webscraping.ai/docs#data).

### `type: "profile"`

| Field | What it holds |
| --- | --- |
| `id`, `username`, `full_name`, `url`, `biography` | Identity and bio. |
| `external_url`, `external_urls` | The first bio link, and all of them as `{title, url, link_type}`. |
| `followers_count`, `follows_count`, `posts_count` | Account counts. |
| `is_verified`, `is_private`, `is_memorialized`, `pronouns` | Account flags. |
| `profile_pic_url`, `highlights`, `highlight_reel_count` | Profile picture and story highlights (`id`, `title`, `cover_url`). |
| `latest_posts` | The latest 12 posts with `short_code`, `url`, `type`, `caption`, `display_url`, `child_posts_count`. |

### `type: "post / reel"`

| Field | What it holds |
| --- | --- |
| `id`, `short_code`, `url`, `type`, `product_type` | `type` is `Image`, `Video` or `Sidecar` (carousel); `product_type` tells reels apart. |
| `caption`, `hashtags`, `mentions`, `timestamp` | Caption text with its hashtags and @mentions, and the post time. |
| `likes_count`, `likes_hidden`, `comments_count` | Engagement. `likes_count` is `-1` when the owner hid likes. |
| `owner_username`, `owner_full_name`, `owner_is_verified`, `owner_followers_count` | The author. `owner_followers_count` is filled on a best-effort basis for video posts and reels (from one extra embed fetch, which can fail) and is otherwise `null`. |
| `display_url`, `images`, `child_posts` | The main image, all images, and each carousel item with its own media and tagged users. |
| `video_url`, `video_duration`, `video_view_count`, `audio_url`, `music_info` | Video posts and reels: media, duration, views, the audio track and song/artist. `video_view_count` and `music_info` come from the same best-effort embed fetch; views are `null` when the owner hid like and view counts. |
| `tagged_users`, `coauthor_producers`, `location_name` | People and place, plus `location_id` and coordinates when set. |
| `latest_comments`, `first_comment` | About the 15 most recent comments with author, text, likes and reply count. |

## What's not included

Everything comes from what Instagram shows a logged-out visitor. That sets these limits.

**Latest 12 posts on a profile** , without like counts or timestamps; send a post URL for its full details. Older posts need a logged-in session and aren't available.

**About 15 comments per post** , the most recent ones; not the full comment thread.

**Some fields stay `null`** because Instagram doesn't show them logged out: `video_play_count`, business category, and paid-partnership flags.

**No stories.** Stories and share links return the free 400.

**Need a page type or site that isn't supported?** [`/ai/fields`](https://webscraping.ai/docs#ai-fields) extracts the fields you describe in plain language from any public page, and [`/html`](https://webscraping.ai/docs#html) returns the rendered HTML for your own parser.

## Flat pricing: 15 credits per page

Every supported Instagram page type costs the same, with no extra charge for proxies or retries. That's about $1.74 per 1,000 pages on the $29 plan.

| Plan | Price | Credits | Pages |
| --- | --- | --- | --- |
| Free | $0 | 2,000 | up to 133 |
| Personal | $29/mo | 250,000 | up to 16,666 |
| Plus | $99/mo | 1,000,000 | up to 66,666 |
| Startup | $249/mo | 3,000,000 | up to 200,000 |

The free plan's 2,000 credits renew monthly. [All plans](https://webscraping.ai/#pricing), including pay-as-you-go credits.

### What's charged

**Unsupported URL or page type:** a `400`, not charged.

**Page couldn't be fetched:** a `500`, not charged.

**Charged even without data:** `parse_status` `parse_failed` (the page was fetched but couldn't be parsed) and `not_found` (the page doesn't exist) are successful requests and cost 15 credits, like `ok`.

## Also from the terminal, AI agents, and n8n

### CLI

[webscraping-ai](https://github.com/webscraping-ai/webscraping-ai-cli) has a `data` command; pass `-` to read URLs from stdin, one per line.

```bash
webscraping-ai data 'https://www.instagram.com/nasa/'
```

### MCP server

Claude, Cursor and other MCP clients get a `webscraping_ai_data` tool from the [hosted MCP server](https://webscraping.ai/integrations/mcp-server) (OAuth login, no API key to paste). Ask for a Instagram page's data in plain language and the agent calls it.

### n8n

The [WebScraping.AI n8n node](https://webscraping.ai/integrations/n8n) has a **Get Structured Data** operation: feed it URLs from a sheet or a trigger and route the JSON onward, no code.

## Frequently asked questions

Is it possible to scrape Instagram without logging in?

Yes, for public accounts. /data reads what Instagram shows logged-out visitors: a profile's bio, counts and latest 12 posts, or a post or reel with its caption, likes, comment count, media and about 15 recent comments.

Can I scrape Instagram followers?

Follower counts, yes: followers\_count and follows\_count come with every profile. Follower lists (who follows an account) aren't available, because Instagram only shows them to logged-in users.

Do I need an Instagram login or the Graph API?

No. /data reads what Instagram serves to logged-out visitors for the URL you send, so there's no account, session cookie or Graph API app involved, and it works for any public profile, not only accounts you manage.

Can I get all posts from a profile?

A profile returns its latest 12 posts. Instagram only pages further for logged-in users, so older posts aren't available; send individual post URLs for full details on each.

What about private accounts?

For a private profile, /data returns whatever details and counts Instagram shows logged-out visitors, with is\_private true and an empty latest\_posts list. The account's posts themselves aren't available logged out.

Is there a free Instagram scraper API?

Yes, for trying it out: the free plan includes 2,000 API credits every month, which covers 133 Instagram pages at 15 credits each. No credit card is needed. Paid plans start at $29/mo for 250,000 credits, or buy pay-as-you-go credits with no subscription from a $20 top-up (100,000 credits, about 6,666 pages).

How much does the Instagram Scraper API cost?

A flat 15 credits per page, for every supported Instagram page type. On the $29/mo plan (250,000 credits) that is up to 16,666 pages, or about $1.74 per 1,000. Unsupported URLs return a 400 and fetch failures a 500; neither is charged. parse\_failed and not\_found results are successful requests and are charged.

What happens if I send a URL you don't support?

You get a 400 that isn't charged, and its message lists what is supported. For pages /data doesn't cover, /ai/fields extracts the fields you describe from any public URL, and /html returns the rendered page for your own parser.

## Other sites on the same endpoint

One API key, one request format, the same response envelope.

[YouTube Scraper API](https://webscraping.ai/youtube-scraper-api)[TikTok Scraper API](https://webscraping.ai/tiktok-scraper-api)[Twitter (X) Scraper API](https://webscraping.ai/twitter-scraper-api)[LinkedIn Scraper API](https://webscraping.ai/linkedin-scraper-api)[Reddit Scraper API](https://webscraping.ai/reddit-scraper-api)[All social media sites](https://webscraping.ai/social-media-scraper-api)[Google SERP API](https://webscraping.ai/google-serp-api)

[Influencer analytics](https://webscraping.ai/use-cases/influencer-analytics): Followers and recent posts from profile URLs.

[Social media monitoring](https://webscraping.ai/use-cases/social-media-monitoring): Track posts across sites on one endpoint.

[Brand sentiment tracking](https://webscraping.ai/use-cases/brand-sentiment-tracking): Captions and comments for sentiment analysis.

## Get Instagram data as JSON today

Get started with 2,000 free API credits. No credit card required.

[Start Free Trial](https://webscraping.ai/auth/sign_up)[View API Documentation](https://webscraping.ai/docs#data)
