# How to Scrape Instagram in 2026: A Developer's Guide (https://www.socialcrawl.dev/blog/how-to-scrape-instagram-2026) > Scrape Instagram profiles, posts, and comments in 2026 without a browser: the official Graph API limits, the DIY realities, and a working API tutorial with real code and a real response. The quickest way to scrape Instagram in 2026 is a single GET request to a data API, no browser automation and no logged-in session. Here is the whole thing: ```bash curl "https://www.socialcrawl.dev/v1/instagram/profile?handle=nasa" \ -H "x-api-key: sc_your_api_key_here" ``` That returns a normalized profile: follower count, bio, verification, post count, and a computed `engagement_rate`, for 1 credit. The rest of this guide is the honest version of the question: what the official Instagram API does and does not allow, what building your own scraper actually costs you in maintenance and legal exposure, and how to pull profiles, posts, and comments through a real endpoint with runnable Python, Node, and curl. Instagram has no official API for reading arbitrary public profiles, so your three options are: the Graph API (only for accounts you own or manage, behind business verification and app review), a DIY scraper (a browser-automation maintenance treadmill against Instagram's anti-bot systems), or a third-party data API. The API route is one authenticated GET per resource: `GET /v1/instagram/profile` for profiles, plus profile-posts and post-comments endpoints that paginate with a cursor and cost 1 credit per page. **Stack:** Python 3.10+ or Node 18+ · `requests` / `fetch` · a [SocialCrawl API key](/docs/quickstart) (free tier: 100 credits, no card) --- ## Can you get Instagram data from the official API? Mostly no, and this is the part every honest guide has to lead with. Instagram's only official API is the [Graph API](https://developers.facebook.com/docs/instagram-platform), and it is built for managing accounts you already control, not for reading other people's. To use it you need an Instagram Business or Creator account, a linked Facebook Page, a Meta developer app, and, for most useful permissions, App Review, where Meta inspects your use case before granting access. Even then, the data is scoped to your own account and accounts that explicitly authorize your app. There is no official endpoint that takes an arbitrary username and returns that public profile's followers, posts, or comments. The older Basic Display API, which came closest to a personal-account read, was deprecated in December 2024. So if your job is competitor analysis, creator discovery, influencer vetting, or feeding public post data into a pipeline, the Graph API does not cover it. That is not a loophole you are missing. It is the stated scope of the product. ## Should you build your own Instagram scraper? The DIY route is real, and for some teams it is the right call. It is worth being clear-eyed about what it involves. **Anti-bot reality.** Instagram is a heavily defended single-page app. Scraping it yourself means driving a headless browser (Playwright or Selenium) or reverse-engineering the private GraphQL endpoints its web client calls. Both paths run into rate limiting, device and session fingerprinting, challenge screens, and login walls that trip the moment traffic looks automated. Residential proxies and rotating sessions push the success rate up but never to 100 percent, and every improvement Instagram ships to its defenses is a bug you now own. **Maintenance.** The private endpoints and the DOM change without notice. A scraper that works today can silently return empty results next week, so you also need monitoring to notice when it breaks. In practice a self-maintained Instagram scraper is a subscription paid in engineering hours rather than dollars. **Legal considerations.** Scraping publicly accessible data has repeatedly survived legal challenge in US courts, most notably the _hiQ Labs v. LinkedIn_ line of cases. That is not a blanket permission slip. Instagram's Terms of Use prohibit automated collection, so ToS exposure is real; and the data you collect (profiles, comments) is personal data, which brings GDPR and CCPA obligations depending on your jurisdiction and use case. A data API does not make any of this go away, and no tool can honestly promise it "gets around" Instagram's terms. What a good API does is handle the collection infrastructure and give you a stable contract, so the engineering problem shrinks to the legal and product questions that are actually yours to answer. Read the [legal and technical guide to social media scraping](/blog/social-media-scraping-legal-technical-guide) before shipping anything commercial. The rest of this guide takes the third route: a maintained data API that returns public Instagram data in a normalized shape, so you write against a schema instead of a moving target. ## Setting up: one key, one request Get an API key at [socialcrawl.dev](https://www.socialcrawl.dev), sign up, then open **Dashboard → API Keys**. Keys look like `sc_` followed by 32 random bytes and are shown in full once, so copy it immediately. New accounts get 100 free credits that never expire, and an Instagram profile call costs 1 credit, so the free tier covers 100 profile reads before you pay anything. Keep the key out of source control: ```bash ``` If you would rather see the response shape before writing any code, paste an Instagram URL into the [Visual Explorer](/explorer) and the unified schema renders instantly. ## Scraping an Instagram profile The endpoint is [`GET /v1/instagram/profile`](/platforms/instagram/profile). It takes one required parameter, `handle` (the username, no `@`), and returns the normalized author object plus computed fields. ```python API_KEY = os.environ["SOCIALCRAWL_API_KEY"] BASE = "https://www.socialcrawl.dev/v1" resp = requests.get( f"{BASE}/instagram/profile", params={"handle": "nasa"}, headers={"x-api-key": API_KEY}, timeout=30, ) profile = resp.json()["data"]["author"] print(profile["username"], profile["followers"], "followers") ``` The same call in Node: ```js const res = await fetch( "https://www.socialcrawl.dev/v1/instagram/profile?handle=nasa", { headers: { "x-api-key": process.env.SOCIALCRAWL_API_KEY } }, ); const { data } = await res.json(); console.log(data.author.username, data.author.followers, "followers"); ``` Here is a real, unmodified response captured with a live dev key in July 2026 (the avatar URL is truncated for readability): ```json { "success": true, "platform": "instagram", "endpoint": "/v1/instagram/profile", "data": { "author": { "id": "528817151", "username": "nasa", "display_name": "NASA", "avatar_url": "https://scontent-bos5-1.cdninstagram.com/...", "bio": "Making the seemingly impossible, possible. ✨", "verified": true, "followers": 104307024, "following": 91, "posts_count": 4853, "url": "https://www.nasa.gov/", "private": false }, "computed": { "engagement_rate": 0.001932, "language": "en", "content_category": "other" } }, "credits_used": 1, "credits_remaining": 184262, "request_id": "req-r39sVIBk8ddNwGBl" } ``` Two things worth noting. First, `computed.engagement_rate` is calculated server-side from recent posts, so you do not derive it from raw counts yourself. Second, the `author` field names here (`username`, `followers`, `verified`, `bio`) are identical across all 44 platforms, so the parser you write for Instagram works unchanged when you add TikTok or Twitter later. ## Scraping Instagram posts and comments Profiles are the front door. The two follow-on reads most projects need are a profile's posts and a post's comments, and both paginate with a cursor. [`GET /v1/instagram/profile/posts`](/platforms/instagram/profile-posts) lists a public account's posts. You pass `handle`, read `data.items`, and pass `data.next_cursor` back as `cursor` on the next request until it disappears: ```python def scrape_instagram_posts(handle: str, max_pages: int = 10) -> list[dict]: posts, cursor = [], None for _ in range(max_pages): params = {"handle": handle} if cursor: params["cursor"] = cursor # pass next_cursor back verbatim payload = requests.get( f"{BASE}/instagram/profile/posts", params=params, headers={"x-api-key": API_KEY}, timeout=30, ).json() if not payload.get("success"): raise RuntimeError(payload["error"]["message"]) posts.extend(payload["data"]["items"]) cursor = payload["data"].get("next_cursor") if not cursor: break return posts ``` To read the comments on a specific post, [`GET /v1/instagram/post/comments`](/platforms/instagram/post-comments) takes the post `url` and paginates the same way. Every comment arrives in the canonical comment shape (`text`, `author.username`, `engagement.likes`, `published_at`), the same object the TikTok, YouTube, and Reddit comment endpoints return, so the export code you write once transfers across platforms. The `max_pages` guard is not decoration. Each page is 1 credit, and a popular account can carry thousands of posts, so decide your per-account budget up front and encode it in the loop. ## Pagination, rate limits, and credits Three operational facts to build around, all from the live API: - **Pagination is a cursor contract.** The response field is always `data.next_cursor`; you pass it back as the `cursor` parameter, verbatim, with no decoding or arithmetic, and stop when it is `null`. The exact parameter name per endpoint is listed on the [pagination page](/docs/pagination). - **There is no requests-per-minute quota.** The only throughput ceiling is 50 concurrent requests per API key; exceed it and you get a `429 CONCURRENCY_LIMIT` envelope with no credits charged. A worker pool below 50 stays comfortably inside it. - **Failures refund credits.** Errors use the same envelope with `success: false` and a typed error object. Empty-upstream `404`s and transient `502`/`503`s automatically refund the credit, so a retry wrapper never double-spends. The full matrix is in the [error handling docs](/docs/errors). The credit math stays flat because Instagram profile, posts, and comments are all Standard-tier at 1 credit per page. A hundred profiles is 100 credits; the free tier covers it. Past that, [pricing](/pricing) is pay-as-you-go and credits never expire: £15 buys 2,500 credits, £49 buys 20,000. ## Where to go from here You now have Instagram profiles, posts, and comments coming back in one schema for 1 credit each, without maintaining a browser farm. Natural next steps: - **Browse the rest of the surface** on the [Instagram platform page](/platforms/instagram): reels, followers, hashtag search, stories, and media transcripts, all in the same envelope. - **Check a single account without integrating** using the free [Instagram engagement rate calculator](/tools/instagram-engagement-rate-calculator), or track who stopped following you with the [Instagram unfollower checker](/tools/instagram-unfollower-check). - **Compare the paid options** in the [best Instagram data APIs](/blog/best-instagram-data-apis-2026) roundup, or read the wider [Instagram scraping guide](/blog/instagram-scraping-2026) for the full technical picture. - **Start on the free tier**: [100 credits, no card](/pricing) is a hundred profile reads, enough to find out whether the data answers your question. ## Frequently asked questions ### Is it legal to scrape Instagram? Scraping publicly accessible data has repeatedly survived legal challenge in US courts (the _hiQ v. LinkedIn_ line of cases), but that is not blanket permission. Instagram's Terms of Use prohibit automated collection, so ToS exposure is real, and profile and comment data is personal data that brings GDPR and CCPA obligations depending on your jurisdiction and use case. No API can honestly claim to get around Instagram's terms. Read the [legal and technical guide](/blog/social-media-scraping-legal-technical-guide) before anything commercial, and talk to a lawyer if revenue depends on the answer. ### Can you scrape Instagram without logging in? Yes, if you use a data API. A third-party API operates its own collection infrastructure and returns public Instagram data through your API key, so you never handle Instagram login, cookies, or sessions. A DIY browser scraper, by contrast, increasingly hits login walls on public pages, which is one of the main reasons the API route is simpler. ### Is there an official Instagram API for scraping profiles? No. Instagram's Graph API only reads accounts you own or manage and requires a business or creator account plus Meta app review. There is no official endpoint that returns an arbitrary public profile's data, which is exactly why third-party data APIs exist for that use case. ### How do you scrape Instagram followers and comments? Through dedicated endpoints. Followers come from the Instagram followers endpoint and comments from `GET /v1/instagram/post/comments`, both paginating with the same cursor contract as profile posts. Each page costs 1 credit and returns a normalized list you can export to CSV without per-platform parsing. ### Do I need Instagram's approval to use an Instagram scraper API? No. The approval gate (business verification, app review) applies to Instagram's own Graph API. A third-party data API is a separate service you sign up for directly, so the key works in minutes rather than after a review process. ### What is the best language for scraping Instagram? Any language that can make an HTTP request. The endpoint is one authenticated GET, so Python with `requests`, Node with `fetch`, or a plain `curl` command all work identically. The response envelope and cursor pagination are the same regardless of language. ### How much does it cost to scrape Instagram? On SocialCrawl, Instagram profile, posts, and comments are 1 credit per page. The free tier is 100 credits (no card, never expires); after that £15 buys 2,500 credits and £49 buys 20,000, pay-as-you-go with no expiry. DIY scraping has no per-call fee but costs proxy subscriptions plus ongoing maintenance time.