Instagram Profile API — Account Data & Follower Counts

Get an Instagram account profile

One public Instagram account’s profile: name, bio and its links, avatar, verification, exact follower, following and post counts, whether a story is up, and the title and cover of every highlight. Use it to size up an account before reading its posts or stories. Pass a username or profile URL.

POST /user-profile Accounts
https://api.fetchlayer.dev/instagram/user-profile
OpenAPI JSON

Headers

Authorization string required

Bearer token — your FetchLayer API key.

Parameters

username string optional

A username with or without the @, or a profile URL. Give this or userId.

userId string optional

The account’s numeric id (profile.id), as a string of digits. Give this or username. An id names the account even after it changes its username; an id that belongs to no account is a 404. Name the account with exactly one of username and userId; both or neither is a 400.

include string[] optional

Optional extra fields. "country" fills profile.country and profile.dateJoined and adds about 1–2 seconds. "native" fills profile.native, the account’s full profile record under Instagram’s own field names; it adds about a second with username, and usually nothing with userId. Any other value is a 400.

format string optional

json or markdown, lowercase; any other value is a 400. Over MCP, markdown returns the result rendered as text; the REST API accepts it and returns JSON. (default: json)

timeoutMs integer optional

Time limit for the whole request, in milliseconds (1000–120000); a value outside that range is a 400. When it runs out, a paged request returns what it has with nextCursor, billed for the pages it returned; a request with nothing to return yet fails with a 503 you can retry, marked with the response header X-Timeout-Source: caller. Left out, the request runs as long as it needs.

Response Fields

user-profile

Get an Instagram account profile

transport string

The data source: always the platform id, "instagram".

notes string[]

Caveats you can act on — a ceiling Instagram imposes, a counter it withholds, a list that stopped early. Several real limits are reported only here, so read them. An empty result always comes with a note explaining it, never as an unexplained empty array.

pagesFetched number

Pages of results fetched, which is what the request costs: one credit per page. resolve-url reports 0 and is not billed.

restricted boolean

True for an account Instagram restricts — typically an age-restricted brand such as alcohol or cannabis — and false for every other. Such an account answers 200, not 404, with less detail. Its profile carries the name, avatar, follower, following and post counts, and the bio and bio links where available; verified, hasActiveStory and latestStoryAt are null.

minimumAge integer | null

The minimum age Instagram states for a restricted account, or null when it states none (and on every other account).

profile.id string

Instagram’s numeric account id.

profile.username string

The handle, without the @. Former usernames are not returned.

profile.url string

Canonical profile URL.

profile.fullName string | null

The display name.

profile.biography string | null

The bio text.

profile.profilePicUrl string | null

Avatar image. Pass it to GET /media to re-fetch it after Instagram’s signed link expires.

profile.verified boolean | null

Whether Instagram shows the verification badge. Null for a restricted account.

profile.privateAccount boolean | null

Whether the account is private. A private account still returns this profile; its posts are withheld.

profile.memorialized boolean | null

Whether the account is memorialised.

profile.pronouns string[]

The pronouns on the profile, where set.

profile.badges object[]

Badges Instagram shows on the profile.

profile.hasReels boolean | null

Whether the account publishes reels — i.e. whether user-reels will return anything.

profile.textAppUsername string | null

The linked Threads handle, or null.

profile.hasActiveStory boolean | null

true when the account has a story up now, false when it has none. Null when Instagram does not say, which is the case for private and restricted accounts.

profile.latestStoryAt string | null

ISO 8601 timestamp of the account’s latest story, or null in the same cases as hasActiveStory.

profile.country string | null

Where the account is based, as Instagram states it (e.g. "United States"). Null unless include lists "country", and the note says so; also null when the account does not show it, or when it is temporarily unavailable, and the note says which. A retry usually fills a temporarily unavailable one.

profile.dateJoined string | null

The month the account joined Instagram, as YYYY-MM (e.g. "2013-08"). Null unless include lists "country", and the note says so.

profile.native object | null

Only with include ["native"]: the account’s full profile record as Instagram publishes it, field for field under Instagram’s own field names — account_type (1 personal, 2 business, 3 creator), category, public_email, public_phone_number, the address fields, hd_profile_pic_url_info, bio_links with link_id, fbid_v2 and more, around 240 fields. Every id is an exact string; an empty string means the account has not published that detail. Null when not available this time (the note says so, and nativeUnavailableReason says why); absent without the include.

profile.nativeUnavailableReason object | null

Only with include ["native"]: null when native is present, otherwise {code, retryable} saying why it is null: time-limit (timeoutMs left too little time; allow more), temporarily-unavailable (asking again usually returns it). Naming the account by userId makes the record faster to get.

profile.stats.followerCount integer | null

Followers, as Instagram publishes it.

profile.stats.followingCount integer | null

Accounts this one follows.

profile.stats.postCount integer | null

The exact number of posts, private accounts included. Never rounded: null on the rare request where only a rounded figure is available, with the rounded figure in notes; a retry usually returns the exact one. It adds about a second to the call, and up to about five for an account with more than 10,000 posts.

profile.bioLinks object[]

title, url, linkType and pinned. Unwrapped to their real destinations rather than Instagram’s tracking links.

profile.highlights object[]

id, title and coverUrl for every story highlight on the profile. The contents of a highlight are not public.

Request

curl -X POST "https://api.fetchlayer.dev/instagram/user-profile" \
  -H "Authorization: Bearer ss-your-key" \
  -H "Content-Type: application/json" \
  -d '{"username":"@nasa","include":["country"]}'

Response

{
  "transport": "instagram",
  "notes": [],
  "pagesFetched": 1,
  "restricted": false,
  "minimumAge": null,
  "profile": {
    "id": "528817151",
    "username": "nasa",
    "url": "https://www.instagram.com/nasa/",
    "fullName": "NASA",
    "biography": "Making the seemingly impossible, possible. ✨",
    "profilePicUrl": "https://scontent-fra5-1.cdninstagram.com/v/t51.2885-19/...",
    "verified": true,
    "privateAccount": false,
    "memorialized": false,
    "pronouns": [],
    "badges": [],
    "hasReels": true,
    "textAppUsername": "nasa",
    "hasActiveStory": true,
    "latestStoryAt": "2026-10-12T21:47:37.000Z",
    "country": "United States",
    "dateJoined": "2013-08",
    "stats": {
      "followerCount": 104352683,
      "followingCount": 91,
      "postCount": 4963
    },
    "bioLinks": [
      {
        "title": "NASA.gov Homepage",
        "url": "https://www.nasa.gov",
        "linkType": "external",
        "pinned": false
      },
      {
        "title": "NASA Internships",
        "url": "http://intern.nasa.gov",
        "linkType": "external",
        "pinned": false
      }
    ],
    "highlights": [
      {
        "id": "18195781759377100",
        "title": "Roman",
        "coverUrl": "https://scontent-fra5-1.cdninstagram.com/v/t51.71878-15/..."
      },
      {
        "id": "18123023338592759",
        "title": "Wallpapers",
        "coverUrl": "https://scontent-fra5-1.cdninstagram.com/v/t51.71878-15/..."
      }
    ]
  }
}
Product overviewInstagram API: what it returns, pricing and use cases