All platforms

Instagram scraper API

Public Instagram profiles, posts, reels, stories, highlights, search, and transcripts over REST — one API key, shared envelope.

Why teams use Social Fetch for Instagram

Instagram enrichment starts with a username or numeric id. `GET /v1/instagram/profiles/{handle}` resolves a public account; `GET /v1/instagram/profiles/{userId}/basic` does a lighter lookup by numeric `platformUserId`. `GET /v1/instagram/profiles/{handle}/posts` pages the mixed feed; `GET /v1/instagram/profiles/{handle}/reels` pages the Reels tab with `playCount`. Both paginate via `data.page.nextCursor`.

`GET /v1/instagram/posts` hydrates one post or Reel with optional `downloadMedia=true` for hosted CDN copies. `GET /v1/instagram/posts/comments` lists top-level comments; `GET /v1/instagram/posts/transcript` returns spoken text (multi-row for carousels; HTTP 400 for clips too long). Highlights: `GET /v1/instagram/profiles/{handle}/highlights` lists albums; `GET /v1/instagram/highlights/{highlightId}` opens one album.

Discovery: `GET /v1/instagram/search/profiles`, `.../search/hashtags`, `.../search/reels`, and `GET /v1/instagram/reels/trending` (no params, fresh sample batch). Thirteen operations, one `{ data, meta }` envelope, one API key.

What Instagram data can you get?

  • Profile lookup by handle (`/v1/instagram/profiles/{handle}`) or numeric user id (`.../basic`) — bio, avatar, verification, follower/following/post counts.
  • Profile feed posts (`.../posts`) with `mediaType` (image, video, sidecar) and per-item like/comment counts, cursor-paginated.
  • Profile Reels tab (`.../reels`) with `playCount`, video URLs, and owner fields, cursor-paginated separately from the mixed feed.
  • Single post or Reel detail by URL (`/v1/instagram/posts`) with an optional `downloadMedia` surcharge for hosted CDN copies.
  • Top-level comment threads on a post or Reel (`/v1/instagram/posts/comments`), cursor-paginated.
  • Post and Reel transcripts (`/v1/instagram/posts/transcript`) as plain-text rows, including multi-row carousels.
  • Story highlight albums (`/v1/instagram/profiles/{handle}/highlights`) and the items inside one album by id (`/v1/instagram/highlights/{highlightId}`).
  • Discovery: profile search, hashtag search, Reel keyword search, and a trending-Reels sample with no query params.

How to call the Instagram API

  1. 1. Create an API key

    Sign up at Social Fetch and copy a key (`sfk_…`). New accounts get 100 free credits — enough to resolve a profile, page a few posts, and run one transcript against live data.

  2. 2. Call an Instagram route

    Start with `GET /v1/instagram/profiles/{handle}` for the profile card, then feed the handle into `.../posts`, `.../reels`, or `.../highlights`. Pass `x-api-key` on every request. Use the playground for one-off checks; use curl or the TypeScript SDK for scheduled jobs.

  3. 3. Read the shared envelope

    Branch on `data.lookupStatus` before writing rows — outcomes and their exact set of values differ slightly by route (some use `found`/`private`/`not_found`, others collapse private into `not_found`). Log `meta.requestId` for support. Bill from `meta.creditsCharged`, not a spreadsheet estimate.

How much does the Instagram API cost?

Every Instagram operation in the OpenAPI registry — profile lookups, posts, reels, highlights, comments, transcript, and all four discovery routes — is a flat 1 credit per completed lookup, with paginated list routes billing per page. The one exception is `GET /v1/instagram/posts`: passing `downloadMedia=true` adds a 10-credit hosted-download surcharge (11 credits total for that call). Credits never expire on pay-as-you-go packs. Always confirm the actual charge with `meta.creditsCharged` on the response.

See credit packs

Social Fetch vs the official Instagram API

Meta Instagram Graph API manages accounts you own — publishing, moderation, insights — after Meta App Review and Facebook Page linkage. It won't return a competitor's follower count, Reels tab, or hashtag search. Social Fetch covers public-web lookups for any public handle, post URL, or hashtag with a Social Fetch API key — no app review, no Business account, no OAuth.

Instagram API FAQ

Is there an Instagram scraper API that doesn't need Graph API access?

Yes. Social Fetch's Instagram routes read public profile, post, Reel, highlight, and search data over REST. You authenticate with a Social Fetch API key only — no Meta App Review, no linked Business or Creator account, no Facebook Page, and no OAuth consent screen for the account you're looking up.

What Instagram data can I pull with Social Fetch?

Thirteen operations: profile by handle or by numeric user id, profile posts and profile Reels (separate cursor-paginated lists), a single post/Reel by URL, comments on a post/Reel, a post/Reel transcript, profile highlight albums plus one album's story items by id, and four discovery routes — profile search, hashtag search, Reel keyword search, and a trending-Reels sample. Exact paths, params, and response fields are on this hub's endpoint list and under /docs/api.

How do I look up an Instagram profile by handle or user id?

Use `GET /v1/instagram/profiles/{handle}` when you have a username (with or without the leading `@`) — it returns the full profile card and uses `found` / `private` / `not_found` on `data.lookupStatus`. Use `GET /v1/instagram/profiles/{userId}/basic` when you already store Instagram's numeric `platformUserId` and want a lighter card without a username round-trip.

What's the difference between profile posts and profile Reels?

`GET /v1/instagram/profiles/{handle}/posts` pages the mixed public grid — images, carousels (`mediaType: "sidecar"`), and in-feed video, each with like/comment counts. `GET /v1/instagram/profiles/{handle}/reels` pages the Reels tab only, adding `playCount` per clip. They paginate independently with their own `cursor`/`nextCursor`, and that Reels route collapses private accounts into `not_found` rather than a separate `private` status.

Does Social Fetch return Instagram Stories and highlights?

It returns saved story highlight albums, not the ephemeral 24-hour Stories tray. `GET /v1/instagram/profiles/{handle}/highlights` lists a profile's public albums (title, cover thumbnail) in one response — no cursor, `hasMore` is always false. `GET /v1/instagram/highlights/{highlightId}` opens one album by its numeric id into the story items inside it: media URLs, timestamps, link stickers when present.

Can I get comments on an Instagram post or Reel?

Yes. `GET /v1/instagram/posts/comments` takes a public post or Reel `url` and returns top-level comments — text, author handle, likeCount, replyCount — paginated with an opaque `cursor` while `data.page.hasMore` is true. It does not return threaded replies below a top-level comment.

How do I get a transcript for an Instagram Reel or post?

Call `GET /v1/instagram/posts/transcript` with a public `/p/`, `/reel/`, or `/tv/` URL — there is no separate Reel-only transcript path. `data.transcripts` is an array of `{ id, shortcode, text }` rows; a carousel with multiple video children can return more than one row, and any row's `text` can be null even when the lookup itself succeeds. Clips that exceed the supported length fail with HTTP 400 `video_too_long_for_transcription` instead of a null row.

How do I discover accounts, hashtags, or trending Reels without a known handle?

`GET /v1/instagram/search/profiles` finds accounts by keyword (each hit reports whether the match came from the profile or a caption via `matchedFrom`). `GET /v1/instagram/search/hashtags` lists posts under a tag with optional `datePosted` and `mediaType` filters. `GET /v1/instagram/search/reels` runs a keyword search scoped to Reels with page-based pagination (`page` / `nextPage`, not a cursor). `GET /v1/instagram/reels/trending` takes no query params and returns one fresh sample batch — call it again for another.

How much does the Instagram API cost?

Every Instagram operation is a flat 1 credit per completed lookup, including each page of a paginated list. The single exception is `GET /v1/instagram/posts` with `downloadMedia=true`, which adds a 10-credit surcharge (11 total). Signup includes 100 free credits and pay-as-you-go packs don't expire. Confirm every call with `meta.creditsCharged`.

What happens for private or missing Instagram accounts, and is this legal?

Behavior differs slightly by route: profile and profile-posts lookups return a distinct `private` value on `data.lookupStatus`, while profile Reels and post detail collapse restricted access into `not_found` or `restricted`. None of these routes invent placeholder data for content that isn't public. Social Fetch only returns publicly visible Instagram data; you're responsible for using it in line with Instagram's terms and applicable law, and we don't provide legal advice.

Start with Instagram data

Create an account, spend the 100 free credits on live Instagram routes, then buy a pack when the JSON fits your pipeline. Credits do not expire on pay-as-you-go packs.