SocialGrid — Instagram Scraper
Pricing
Pay per usage
SocialGrid — Instagram Scraper
Unified-schema Instagram profile data via a residential proxy AND an authenticated session (Instagram requires both — logged-out GraphQL queries are rejected regardless of IP, see PLAN.md). Reduced-surface MVP: profile only; posts/comments/search/trending are deferred.
Pricing
Pay per usage
Rating
0.0
(0)
Developer
Giovanni
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
4 days ago
Last modified
Categories
Share
Unofficial community Actor. Not affiliated with, endorsed by, or sponsored by Instagram or Meta.
Unified-schema Instagram profile data — flat, agent-ready JSON extracted via a real Playwright browser session, never a raw GraphQL response dump. Requires both a residential proxy and an authenticated Instagram session (see Input below) — Instagram rejects logged-out profile queries outright, regardless of IP or browser fingerprint.
Why this vs. a raw-blob scraper
Instagram's web_profile_info/GraphQL response is a deeply nested internal object (edge_followed_by, hd_profile_pic_url_info, dozens of feature flags) built for Instagram's own web client, not for downstream consumption. This actor extracts the same Author shape used across SocialGrid's YouTube/TikTok/Instagram scrapers, so an LLM agent or analytics pipeline can treat every platform identically. Fields Instagram doesn't expose (e.g. total_likes — Instagram has no such aggregate) come back as null, never 0.
What it does — and honestly, what it doesn't (yet)
Implemented and live-verified:
| Mode | Description | Key input |
|---|---|---|
profile | Account profile: display name, bio, avatar, follower/following/post counts, verified, private flag, external links | handle |
Explicitly NOT implemented in this MVP — posts, comments, search, and trending are deferred, not attempted this pass. This actor is single-purpose (profile lookup) for now.
Why authentication is required (not just a proxy)
Modern Instagram no longer server-renders profile data into the page HTML at all — it's a client-side-only app shell. The real data lives behind an internal GraphQL/web_profile_info endpoint that returns "Unauthorized logged out query." for any request without a real, logged-in session — independent of proxy quality or browser fingerprint. There is no unauthenticated path to this data anymore.
This actor never automates Instagram's login form — that flow is far more bot-defended than viewing profiles and risks the account. Instead, you provide three cookies from your own real, manual browser login:
- Log in to instagram.com normally, in a real browser.
- Open DevTools → Application/Storage → Cookies →
https://www.instagram.com. - Copy the values of
sessionid,ds_user_id, andcsrftoken. - Pass them as
igSessionId,igDsUserId,igCsrfTokenin the actor input (marked as secret fields — they're never logged or echoed).
These cookies belong to a real Instagram account, so treat them like any other credential: expect them to expire or be invalidated by Instagram at any time (password change, suspicious-activity flag, manual logout elsewhere), at which point the actor starts failing with the same "Unauthorized logged out query" error and the cookies need refreshing from a fresh manual login.
Example output (mode: "profile")
{"success": true,"platform": "instagram","mode": "profile","data": {"platform": "instagram","id": "25025320","handle": "instagram","display_name": "Instagram","bio": "Discover what's new on Instagram 🔎✨","avatar_url": "https://scontent...cdninstagram.com/...","verified": true,"followers": 685839159,"following": 256,"post_count": 8522,"total_likes": null,"external_links": ["https://www.youtube.com/watch?v=H6G9PcvHjj4","https://open.spotify.com/episode/..."],"is_private": false}}
Input
mode(required):profile— the only implemented modehandle(required forprofile): account handle (instagram) or full profile URLproxyGroup(defaultRESIDENTIAL): Apify proxy group — Instagram requires a residential proxy to work at alligSessionId,igDsUserId,igCsrfToken(all required, secret): cookies from a real, human-completed login — see above
Usage
Apify CLI
apify actors call fulinlabs/socialgrid-instagram-scraper \--input '{"mode": "profile", "handle": "instagram", "igSessionId": "...", "igDsUserId": "...", "igCsrfToken": "..."}'
REST API
curl "https://api.apify.com/v2/acts/fulinlabs~socialgrid-instagram-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"mode": "profile", "handle": "instagram", "igSessionId": "...", "igDsUserId": "...", "igCsrfToken": "..."}'
Pricing
Benchmarked against comparable Store Instagram profile scrapers (Apify's official Instagram Profile Scraper at ~$1.60–2.60/1,000 profiles, third-party alternatives from $0.50–$20/1,000). Because this actor runs a full headless-Chromium session per call (heavier compute than a plain HTTP scraper) and depends on a maintained authenticated session, pricing sits at the higher end of that band:
profile: $2.00 per 1,000 results
Reliability & known risks
- Standing operational dependency: the Instagram account behind the session cookies is real and subject to Meta's ban/challenge risk for automation-adjacent activity. Session expiry requires a human to manually re-log-in and refresh the cookies — this is not a one-time setup cost.
- Runs on Apify's official
apify/actor-node-playwright-chrome:22base image with a real Chromium browser — slower and more resource-intensive per call than a plain HTTP-based scraper. - A 6-hour canary schedule re-runs the live test suite (
getProfileagainst a known fixture + a nonexistent-handle error case) and alerts on failure.