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
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.
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
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
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
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.
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.
The key fields per page type. Names are snake_case across every site; the full contract is in the API reference.
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. |
Everything comes from what Instagram shows a logged-out visitor. That sets these limits.
null because Instagram doesn't show them logged out: video_play_count, business category, and paid-partnership flags./ai/fields extracts the fields you describe in plain language from any public page, and /html returns the rendered HTML for your own parser.
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, including pay-as-you-go credits.
400, not charged.500, not charged.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.webscraping-ai has a data command; pass - to read URLs from stdin, one per line.
webscraping-ai data 'https://www.instagram.com/nasa/'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.
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.
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.
One API key, one request format, the same response envelope.
Get started with 2,000 free API credits. No credit card required.