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.

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 -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}, ...],
#     ...
#   }
# }
# 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}, ...],
#     ...
#   }
# }
// 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
// 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}, ...],
//     ...
//   }
// }
# 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 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}, ...],
//     ...
//   }
// }
// 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}, ...],
//     ...
//   }
// }
// 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.

type: "profile"

FieldWhat it holds
id, username, full_name, url, biographyIdentity and bio.
external_url, external_urlsThe first bio link, and all of them as {title, url, link_type}.
followers_count, follows_count, posts_countAccount counts.
is_verified, is_private, is_memorialized, pronounsAccount flags.
profile_pic_url, highlights, highlight_reel_countProfile picture and story highlights (id, title, cover_url).
latest_postsThe latest 12 posts with short_code, url, type, caption, display_url, child_posts_count.

type: "post / reel"

FieldWhat it holds
id, short_code, url, type, product_typetype is Image, Video or Sidecar (carousel); product_type tells reels apart.
caption, hashtags, mentions, timestampCaption text with its hashtags and @mentions, and the post time.
likes_count, likes_hidden, comments_countEngagement. likes_count is -1 when the owner hid likes.
owner_username, owner_full_name, owner_is_verified, owner_followers_countThe 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_postsThe 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_infoVideo 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_namePeople and place, plus location_id and coordinates when set.
latest_comments, first_commentAbout 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 extracts the fields you describe in plain language from any public page, and /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.

PlanPriceCreditsPages
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, 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 has a data command; pass - to read URLs from stdin, one per line.

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 (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 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 TikTok Scraper API Twitter (X) Scraper API LinkedIn Scraper API Reddit Scraper API Google SERP API

Get Instagram data as JSON today

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

Icon