Instagram Related Profiles Scraper avatar

Instagram Related Profiles Scraper

Pricing

from $0.60 / 1,000 results

Go to Apify Store
Instagram Related Profiles Scraper

Instagram Related Profiles Scraper

Scrape Instagram profile data, profile statistics, and recursive related-profile discovery from public Instagram pages

Pricing

from $0.60 / 1,000 results

Rating

0.0

(0)

Developer

Instagram Scraper

Instagram Scraper

Maintained by Community

Actor stats

4

Bookmarked

1.2K

Total users

167

Monthly active users

a day ago

Last modified

Share

Actor Stats

A powerful scraper built for recursive profile discovery and data mining. Start with a single Instagram username or URL and automatically traverse "related profiles" to map out interconnected networks, discover influencers, and find niche communities.

Focused exclusively on profiles, this actor traverses up to your desired scrapeDepth and extracts comprehensive profile data—returning normalized profile fields (identity, stats, and account flags), raw metadata, and optional previews like latest_posts and related_profiles for every discovered account.


What this actor can do

  • Scrape Instagram profile stats: followers, following, number of posts
  • Get key profile attributes: verified/private/business flags, profile pictures, bio, external links (if available)
  • Keep additional raw profile metadata from Instagram, including viewer/account capability flags and business/category fields when available
  • Optionally scrape a linked Facebook profile into fb_profile when scrapeFacebookProfile is enabled
  • Optionally return lightweight latest posts metadata (caption, engagement, publishing/status flags, and media fields when available) for quick previews when skipLatestPosts is turned off
  • Return a list of related profiles (useful for discovery and recursive expansion)
  • Expand related profiles up to a configurable scrapeDepth
  • Accept both usernames and profile URLs

Want to get other details from Instagram?

This actor is optimized for profiles (not full post feeds). If you want to scrape other Instagram data, use a dedicated scraper for that specific data type.

Related actors:

ActorDescriptionStats
Instagram Profile FinderFind relevant Instagram profiles by keyword or topicInstagram Profile Finder Actor Stats
Instagram Profile ScraperScrape Instagram profile data and profile statistics from public Instagram pagesInstagram Profile Scraper Actor Stats
Fast Instagram Profile Posts ScraperScrape post data from Instagram profile pagesFast Instagram Profile Posts Scraper Actor Stats
Instagram Profile Posts ScraperExtract profile post details such as hashtags, counts, media, and shortcodeInstagram Profile Posts Scraper Actor Stats
Fast Instagram Profile Reels ScraperScrape public Instagram Reels from profile pagesFast Instagram Profile Reels Scraper Actor Stats
Instagram Posts & Reels ScraperScrape Instagram posts and Reels dataInstagram Posts & Reels Scraper Actor Stats
Instagram Hashtags Posts ScraperScrape public Instagram hashtag pagesInstagram Hashtags Posts Scraper Actor Stats

What data can I scrape from Instagram profiles?

Using this Instagram Related Profiles API, you can extract both normalized fields and additional Instagram profile metadata (when available on the public profile):

CategoryFieldsWhat you get
Core profile IDspk, pk_id, id, username, full_name, urlInstagram profile identifiers plus the canonical profile URL.
Profile media & linksprofile_pic_url, profile_pic_url_hd, profile_pic_id, profile_pic_genai_tool_info[], has_profile_pic, biography, contact_email, bio_links[], external_url, external_url_linkshimmed, pronouns[]Profile pictures, bio text, extracted contact email, bio links, and Instagram link-wrapper URLs when present. bio_links[] keeps Instagram's current nested link shape, including keys such as image_url, is_pinned, link_type, lynx_url, media_type, and creation_source.
Facebook enrichmentfb_profile, linked_fb_infoOptional Facebook lookup output from one detected profile URL when scrapeFacebookProfile is enabled, plus raw Instagram-linked Facebook metadata when Instagram exposes it.
Counts & activityfollowers, following, post_count, total_clips_count, latest_reel_mediaHigh-level profile counts and reel activity metadata when available. post_count may be approximate because Instagram displays abbreviated counts such as 14K or 1.2M. If the count is unavailable, post_count is emitted as null.
Account state & flagsaccount_type, category, is_verified, is_private, is_business, is_professional_account, is_memorialized, is_unpublished, is_embeds_disabled, has_any_clips, has_story_archive, is_active_on_text_post_app, hide_creator_marketplace_badge, is_regulated_c18, is_coppa_enforced, is_cannesVisibility, category, and account-state flags from Instagram's current profile payload.
Transparency & contextshould_show_category, show_account_transparency_details, show_text_post_app_badge, text_post_app_badge_label, transparency_label, transparency_product, live_broadcast_visibility, live_broadcast_id, supervision_info, mutual_followers_count, profile_context_links_with_user_ids, profile_context_facepile_users, show_ring_award, is_ring_creator, account_badges[]Additional transparency, broadcast, supervision, and context metadata when Instagram includes it.
Public location hintsaddress_street, city_name, zipPublic location/contact-adjacent profile metadata when exposed by Instagram.
Latest posts (preview)latest_posts[]Recent post previews when available. Items keep Instagram's current post payload shape, including fields such as pk, id, code, user, image_versions2, carousel_media, sharing_friction_info, clips_metadata, and engagement counters. The actor normalizes caption, hashtags, mentions, tagged_user, taken_at_timestamp, taken_at, and url, and adds shortcode, is_video, image, video_url, dimensions, and post-level crawled_at.
Related profilesrelated_profiles[]Suggested accounts used for discovery and recursive expansion. Each item currently includes id, username, full_name, profile_pic_url, is_private, and is_verified when present in Instagram's response.
Traversal & scrape metadatadepth, source_username, ig_status, message (not-found items), crawled_atdepth is 0 for an input username and increases by one for each related-profile hop. source_username is null at the root and otherwise points to the parent username. ig_status is ok, not_found, or invalid_input.

Notes:

  • Field availability depends on what Instagram returns for a given profile (especially for private accounts).
  • Some fields are normalized by the actor (followers, following), while others are passed through from Instagram's profile payload.
  • Raw Instagram metadata can change over time, so downstream consumers should treat optional pass-through fields as non-guaranteed.
  • post_count is available to all users. Instagram may display abbreviated counts (for example, 14K Posts), so values should be treated as approximate. If the count is unavailable, post_count is emitted as null.
  • If an input username or profile URL is invalid, the actor emits a dataset row with ig_status = "invalid_input" instead of silently dropping that value.
  • contact_email is extracted from biography or full_name when an email address is present on a found profile, and is null otherwise.
  • fb_profile is null when the toggle is disabled or no Facebook profile URL is found. If Facebook profile parsing still fails after retries, the actor keeps fb_profile as null instead of throwing. Other lookup failures can still surface as fb_profile.status = "error" or fb_profile.status = "not_found".
  • latest_posts provides one batch of recent post previews for all users and keeps every valid item available in that batch, without an output cap or automatic pagination. related_profiles contains Instagram's suggested accounts for the profile.
  • For stable downstream parsing, missing optional scalars remain null and known list fields remain arrays. For example, pronouns, hashtags, mentions, and tagged_user are emitted as [] when no values are present.
  • The filter fields only decide whether a profile is written to the dataset. They do not stop related profiles from being fetched.

Typical use cases

  • Influencer discovery and enrichment (profile stats, verification, business account)
  • Competitor monitoring (track follower growth over time)
  • Lead enrichment for sales/marketing (public business profiles)
  • Content research (quick look at latest post captions/engagement)

Input

Configure these fields in the Actor’s Input tab in the Apify Console:

instagramUsernames (required)

A list of Instagram usernames or profile URLs you want to scrape.

Examples:

  • google
  • https://www.instagram.com/google/

scrapeFacebookProfile (optional)

When enabled, the actor looks for one Facebook profile URL in this order: external_url, bio_links, biography, then full_name.

The nested fb_profile payload includes url, status, message, bio, profile_name, page_id, counts, and category/profile-type fields when available.

skipLatestPosts (optional)

Controls whether the actor includes recent post previews in latest_posts.

  • Default: true
  • true: skip recent post previews and return latest_posts: []
  • false: fetch and return the available latest_posts preview items

Latest-post preview fields

code is preserved and shortcode contains the same value. If both upstream fields are present, a valid shortcode takes precedence. Missing shortcodes are null. Caption hashtags and mentions are deduplicated in their original order and omit # and @. Top-level taken_at is UTC ISO 8601; taken_at_timestamp uses seconds.

Media previews expose is_video, image, video_url, dimensions, and video_duration alongside the original image/video structures. tagged_user[] keeps its existing fields and adds is_private and profile_pic_id. Each top-level post has a crawled_at timestamp shared by that batch; carousel children do not.

Known optional scalars and objects use null; known empty lists use []. Unavailable engagement counts remain null, and play_count, view_count, and video_view_count retain their separate meanings. Carousel children preserve existing caption objects and numeric timestamps. Instagram may provide fewer preview children than carousel_media_count; the actor keeps those previews without fetching extra media or filling missing children. Upstream user, owner, engagement, and music details can be absent.

Latest-post scope and limits

  • latest_posts is a lightweight profile preview, not a complete post-feed scraper. The preview targets 12 recent posts, preserves Instagram's returned order, and does not paginate. Instagram may return fewer items, and pinned or otherwise ranked items may affect which posts appear.
  • The actor keeps every valid item available in the preview. It does not include missing carousel children, comments, likers, insights, or additional media. Unavailable fields remain absent or use the documented defaults.
  • Private, restricted, unavailable, or partially visible profiles can produce an empty or incomplete preview. An empty latest_posts array can also mean that skipLatestPosts is enabled; it does not by itself prove that the profile has no posts.
  • Pass-through fields depend on Instagram's current response and may be absent or change over time. The normalized fields described above keep stable null and empty-array defaults where the actor knows the field shape.
  • Image and video URLs come from Instagram and may expire. Download or process media promptly if your workflow needs durable copies.

skipPostCount (optional)

Controls whether the actor collects post_count.

  • Default: false
  • true: skip collecting post_count when post-count filters are not in use
  • false: collect post_count for all users when available

The minPosts and maxPosts filters require collecting post_count even when skipPostCount is true.

scrapeDepth (optional)

Controls how many additional related-profile layers are expanded.

  • 0: store the input profile and its direct related profiles
  • 1: also expand the related profiles of those related profiles
  • 10 is the maximum accepted value

maxResultsPerProfile (optional)

Limits the number of saved profiles per input account, including the input account itself and related profiles discovered at any depth.

  • Minimum value: 10
  • Default: no limit (omit the field or set it to null)
  • Each input account has its own limit; duplicate profiles are saved only once.
  • Actual results may be lower depending on profile availability, filters, and the run's maximum charge.

Filter fields (optional)

These fields are grouped under a Filters section in the Apify Console and are top-level JSON inputs. In the console they render as Yes / No dropdowns. In raw JSON, use lowercase yes / no; leave a field empty or set it to null to disable that filter.

{
"minFollowers": 1000,
"maxFollowers": 1000000,
"minPosts": 10,
"maxPosts": 5000,
"isVerified": "yes",
"isPrivate": "no",
"isBusinessAccount": "yes"
}

Leave any field empty or null to disable that specific filter.

Profiles that are filtered out still count as processed work and may trigger the filtered-out billing event even though they do not appear in the dataset.

Quick start (Apify Console)

  1. Add one or more values to instagramUsernames (either usernames like nypost or URLs like https://www.instagram.com/google/).
  2. Adjust scrapeDepth, the filter fields, or maxResultsPerProfile only if you need a deeper crawl or tighter result limits.
  3. Click Run → open the Dataset tab to view/export results (JSON, CSV, Excel, etc.).

This makes the actor usable as an Instagram profile scraping API, because datasets can be consumed programmatically via Apify’s API.


Example input

{
"instagramUsernames": ["kevinhart4real"],
"scrapeFacebookProfile": true,
"skipLatestPosts": false,
"scrapeDepth": 1,
"maxResultsPerProfile": 100,
"isVerified": "yes",
"isPrivate": "no"
}

Example output

This synthetic example shows one preview item so the output shape remains readable. Production runs keep all valid items available in the recent post preview; they are not limited to the one item shown below. Optional pass-through fields may differ between profiles and as Instagram changes its response.

{
"pk": "123",
"username": "example_profile",
"full_name": "Example Profile",
"is_private": false,
"is_verified": false,
"requested_by_viewer": false,
"business_email": null,
"profile_pic_url": "https://example.com/avatar.jpg",
"profile_pic_url_hd": "https://example.com/avatar-hd.jpg",
"biography": "Example public profile",
"external_url": null,
"post_count": 42,
"external_url_linkshimmed": null,
"id": "123",
"url": "https://www.instagram.com/example_profile/",
"contact_email": null,
"followers": 1000,
"following": 25,
"latest_posts": [
{
"filter_type": "default",
"video_codec": "avc1.64001F",
"video_subtitles_confidence": 0.98,
"video_subtitles_enabled": true,
"video_subtitles_status": "READY",
"video_subtitles_uri": "https://example.com/top.vtt",
"video_subtitles_locale": "en_US",
"id": "1",
"code": "SHORT",
"media_type": 2,
"taken_at": "2026-03-05T17:02:14Z",
"original_width": 640,
"original_height": 1137,
"image_versions2": {
"additional_candidates": {
"first_frame": {
"url": "https://example.com/top-first-frame.jpg",
"scans_profile": {
"profile": "top-profile"
}
},
"igtv_first_frame": {
"url": null
},
"smart_frame": null,
"url": null
},
"candidates": [
{
"url": "https://example.com/top-candidate.jpg"
}
]
},
"video_versions": [
{
"url": "https://example.com/top-video.mp4"
},
{
"url": "https://example.com/top-video-2.mp4"
}
],
"caption": "hello #news @caption_mention",
"carousel_media": [
{
"filter_type": "ranked",
"video_codec": "avc1.4D401F",
"video_subtitles_confidence": 0.85,
"video_subtitles_enabled": false,
"video_subtitles_status": "DISABLED",
"video_subtitles_uri": "https://example.com/child.vtt",
"video_subtitles_locale": "zh_TW",
"id": "child-1",
"code": "CHILD",
"media_type": 1,
"original_width": 320,
"original_height": 480,
"image_versions2": {
"additional_candidates": {
"first_frame": {
"url": "https://example.com/child-first-frame.jpg"
}
}
},
"tagged_user": [
{
"pk": "11",
"full_name": null,
"username": "child_user",
"profile_pic_url": null,
"is_verified": null,
"id": "11",
"is_private": null,
"profile_pic_id": null
}
],
"shortcode": "CHILD",
"taken_at_timestamp": null,
"url": "https://www.instagram.com/p/CHILD/",
"caption": null,
"hashtags": [],
"mentions": [],
"is_video": false,
"image": "https://example.com/child-first-frame.jpg",
"video_url": null,
"dimensions": {
"height": 480,
"width": 320
},
"accessibility_caption": null,
"carousel_parent_id": null,
"display_uri": null,
"has_liked": null,
"has_viewer_saved": null,
"inventory_source": null,
"is_dash_eligible": null,
"like_count": null,
"link": null,
"logging_info_token": null,
"media_overlay_info": null,
"number_of_qualities": null,
"pk": null,
"play_count": null,
"preview": null,
"previous_submitter": null,
"product_type": null,
"saved_collection_ids": null,
"sharing_friction_info": null,
"story_cta": null,
"taken_at": null,
"user": null,
"video_duration": null,
"carousel_media": [],
"video_versions": [],
"organic_tracking_token": "child-organic-token"
}
],
"clips_music_attribution_info": {
"artist_name": "Sample Artist",
"song_name": "Sample Song",
"uses_original_audio": false,
"should_mute_audio": false,
"should_mute_audio_reason": null,
"audio_id": "audio-1"
},
"timeline_pinned_user_ids": [
"123"
],
"tagged_user": [
{
"pk": "10",
"full_name": "Top User",
"username": "top_user",
"profile_pic_url": "https://example.com/u.jpg",
"is_verified": true,
"id": "10",
"is_private": true,
"profile_pic_id": "pic-10"
}
],
"shortcode": "SHORT",
"hashtags": [
"news"
],
"mentions": [
"caption_mention"
],
"taken_at_timestamp": 1772730134,
"url": "https://www.instagram.com/p/SHORT/",
"is_video": true,
"image": "https://example.com/top-candidate.jpg",
"video_url": "https://example.com/top-video.mp4",
"dimensions": {
"height": 1137,
"width": 640
},
"accessibility_caption": null,
"ad_id": null,
"affiliate_info": null,
"ai_interactive_embodiment_attachment_style_info": null,
"ai_label_info": null,
"audience": null,
"boost_unavailable_identifier": null,
"boost_unavailable_reason": null,
"boosted_status": null,
"can_reshare": null,
"can_see_insights_as_brand": null,
"can_viewer_reshare": null,
"caption_is_edited": null,
"carousel_media_count": null,
"carousel_parent_id": null,
"clips_attribution_info": null,
"clips_metadata": null,
"comment_count": null,
"commenting_disabled_for_viewer": null,
"comments_disabled": null,
"crosspost_metadata": null,
"display_uri": null,
"enable_media_notes_production": null,
"explore": null,
"fb_like_count": null,
"feed_demotion_control": null,
"feed_recs_demotion_control": null,
"follow_hashtag_info": null,
"group": null,
"has_audio": null,
"has_liked": null,
"has_viewer_saved": null,
"headline": null,
"hidden_likes_string_variant": null,
"ig_media_sharing_disabled": null,
"inventory_source": null,
"is_dash_eligible": null,
"is_paid_partnership": null,
"is_seen": null,
"is_shared_from_basel": null,
"like_and_view_counts_disabled": null,
"like_count": null,
"link": null,
"location": null,
"logging_info_token": null,
"main_feed_carousel_starting_media_id": null,
"media_cropping_info": null,
"media_notes": null,
"media_overlay_info": null,
"media_repost_count": null,
"number_of_qualities": null,
"open_carousel_submission_state": null,
"photo_of_you": null,
"pk": null,
"play_count": null,
"preview": null,
"previous_submitter": null,
"product_type": null,
"saved_collection_ids": null,
"sharing_friction_info": null,
"social_context": null,
"sponsor_tags": null,
"story_cta": null,
"thumbnails": null,
"title": null,
"upcoming_event": null,
"user": null,
"video_duration": null,
"view_count": null,
"wearable_attribution_info": null,
"all_previous_submitters": [],
"clips_tab_pinned_user_ids": [],
"coauthor_producers": [],
"facepile_top_likers": [],
"floating_context_items": [],
"invited_coauthor_producers": [],
"media_attributions_data": [],
"top_likers": [],
"crawled_at": "2026-09-27T00:00:00Z",
"organic_tracking_token": "top-organic-token"
}
],
"related_profiles": [],
"fb_profile": null,
"ig_status": "ok",
"crawled_at": "2026-09-27T00:00:00Z",
"depth": 0,
"source_username": null,
"is_business": null,
"is_professional_account": null,
"category": null,
"should_show_category": null
}

Example dataset item when a profile is not found:

{
"username": "11",
"depth": 0,
"source_username": null,
"ig_status": "not_found",
"message": "Profile not found or restricted",
"url": "https://www.instagram.com/11/",
"crawled_at": "2026-02-06T08:03:20.522Z"
}

Here, ig_status: "not_found" means Instagram did not return profile data for that username because the profile does not exist or access to it is restricted.


Tips & troubleshooting

Don’t overload the actor. If you need to scrape large lists, split inputs into batches.


You are responsible for ensuring your use of this actor complies with:

  • Instagram’s Terms of Service
  • Applicable laws and regulations (privacy, data protection, etc.)

Only scrape data you have the right to access, and avoid collecting personal data without a lawful basis.