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.
/user-profile Accounts https://api.fetchlayer.dev/instagram/user-profile 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/..."
}
]
}
}