Osintgram

Does Osintgram work on private Instagram accounts?

No. Against a private profile that your logged-in account does not follow, Osintgram refuses 18 of its 21 data commands before fetching anything. The one documented exception, written into the project's own README, is a private account you already follow.

17 min readOsintgram team

The short answer

No. Point Osintgram at a private Instagram account that the profile you logged in with does not follow, and 18 of its 21 data commands refuse to run before they fetch a single record. That is not a version problem, a rate limit, or something a fork fixes. It is a deliberate check that runs before every one of those commands.

The project states it in its own documentation. Question 1 of the FAQ in the Osintgram README reads, verbatim: "No, you cannot get information on private profiles. You can only get information from a public profile or a profile you follow. The tools that claim to be successful are scams!"

That middle clause is the whole article. "A profile you follow" is a real, checkable exception, and it is not a partial unlock. If your logged-in account already follows the private target, every gated command behaves exactly as it would against a public profile.

Osintgram cannot read a private Instagram account. The exception is narrow and documented: a private account that the Instagram account you authenticated with already follows, in which case nothing is gated at all. Everything else stops at one function, check_private_profile(), which returns early whenever the target is private and you are not a follower. No fork, flag, mod or paid service changes that condition, because the condition is Instagram's.

The gate, read straight from the source

Nineteen methods in src/Osintgram.py open with the same two lines: call check_private_profile(), and if it returns true, return. Here is that function, dedented out of the class body but otherwise unchanged.

def check_private_profile(self):
    if self.is_private and not self.following:
        pc.printout("Impossible to execute command: user has private profile\n", pc.RED)
        send = input("Do you want send a follow request? [Y/N]: ")
        if send.lower() == "y":
            self.api.friendships_create(self.target_id)
            print("Sent a follow request to target. Use this command after target accepting the request.")

        return True
    return False
src/Osintgram.py, lines 1169-1178 on the master branch.

Two attributes decide everything. self.is_private is set in setTarget() from the target lookup, which returns only the numeric ID and the private flag. self.following is set immediately after by check_following(), which reads friendship_status.following out of the response to Instagram's own users/{user_id}/full_detail_info/ endpoint. The tool is not inferring your relationship with the target; it asks Instagram and believes the answer.

The condition is an AND. Private on its own does not block. Not following on its own does not block. Only the pair does. That is why the answer is a conditional no, and why the condition is useless to anyone hoping for a bypass: it resolves to "the account already let you in".

You see the state before typing anything. The banner prints as the session opens, and every gated command prints the same red line.

Logged as <you>. Target: <target> [1234567890] [PRIVATE PROFILE] [NOT FOLLOWING]

Run a command: followers
Impossible to execute command: user has private profile
Do you want send a follow request? [Y/N]:
Every line here is a literal string from main.py or src/Osintgram.py, reconstructed from the code. It is not a captured session.

That follow-request prompt is a real action

Answering Y calls friendships_create(self.target_id). It sends an actual follow request, from whatever account is sitting in config/credentials.ini, to the person you are researching, and they see it. On a real engagement that is a disclosure. If the plan is to get it accepted with a persona that is not yours, you have left public-source research entirely.

Follow detection is the tool's most-reported bug

People who genuinely do follow the private target are still shown [NOT FOLLOWING] and still get blocked. See issue #174, "Can't check private account even if followed", and issue #1031. Neither has a documented resolution. If you are inside the documented exception and the tool disagrees with you, that is a known defect, not a hidden lock.

Which commands still run against a private target

Of the 21 data commands main.py dispatches, 18 sit behind the gate: addrs, captions, comments, commentdata, followers, followings, fwersemail, fwingsemail, fwersnumber, fwingsnumber, hashtags, likes, mediatype, photodes, photos, stories, wcommented and wtagged. Against a private, non-followed target, every one of them prints the block message and returns. (The nineteenth call site is an internal method the command table never reaches.)

Three commands have no guard: info, propic and tagged. The first two read users/{user_id}/full_detail_info/ directly, which is the same endpoint the follow check uses. That endpoint answers for private targets, which is precisely why check_following() works at all. The profile document is served; the content behind it is not.

tagged is a quirk rather than a hole. get_people_tagged_by_user() skips the check, then calls __get_feed__(), which pages the target's own post feed. That is exactly the data the follow wall covers. The guard is missing; what it would have guarded is still behind the wall. A missing guard is not access.

There is a second backend, and it is stricter. If config/credentials.ini carries a hikerapi_token, or HIKERAPI_TOKEN is set in the environment, main.py builds HikerCLI from src/hikercli.py instead. That class ships its own copy of the gate, minus the follow clause.

def check_private_profile(self):
    if self.is_private:
        pc.printout(
            "Impossible to execute command: user has private profile\n", pc.RED
        )
        return True
    return False
src/hikercli.py: the HikerAPI backend gates on is_private alone.

On that path a private profile is refused whether you follow it or not, because you are not the one making the request. A third-party API is, and it has no relationship with the target. Its banner drops the [FOLLOWING] tag entirely for the same reason. Since that backend is the path still designed to work, the documented exception is narrowing: does Osintgram still work covers why the password login broke.

The capability matrix

This is what each of the three situations yields. The middle column is the one people are actually asking about.

Data pointPublicPrivate, not followedPrivate, you follow it
Username, ID, full name, bio (info)YesYesYes
Follower and following counts (info)YesYesYes
Public business email and phone (info)YesYesYes
Profile picture (propic)YesUngated by designYes
Posts and captions (photos, captions)YesNoYes
Stories (stories)YesNoYes
Follower and following listsYesNoYes
Like and comment totalsYesNoYes
Follower emails and phone numbersYesNoYes
Geotags (addrs) and hashtagsYesNoYes
Users tagged by target (tagged)YesUngated, reads the post feedYes
Users who tagged target (wtagged)YesNoYes
Command coverage by target type, derived from the privacy gate in src/Osintgram.py. Every "Yes" assumes the backend authenticates at all.

Two caveats. propic is ungated in the source, but whether Instagram still returns the full-resolution hd_profile_pic_url_info for a private, non-followed target in 2026 is untested here: Osintgram codes a fallback for when that key is missing, and instaloader users report it going absent. Read that cell as "by design", not as a guarantee. The third column also assumes you can log in at all. What each command returns on an ungated target is in every Osintgram command, explained.

There is no bypass section in this article

If you came looking for a fork, a flag, a patched build or a paid API that reads a private grid, this page does not have one. The reason is structural, not editorial: the gate is a server-side decision at Instagram, and Osintgram only reports it back. Everything claiming otherwise is selling something else, which is the next section.

What Instagram publishes about a private account anyway

"Private" on Instagram means private content, not a private account. A private profile still serves a substantial metadata document to a request carrying no login and no cookies. The fields below come from a logged-out lookup run on 8 August 2026 against a private account, which is not named here.

curl -s \
"https://www.instagram.com/api/v1/users/web_profile_info/?username=USERNAME" \
-H "x-ig-app-id: 936619743392459"
Logged-out profile lookup. Returned HTTP 200 with roughly 69 profile fields.
Public fieldWhat it holdsWhy it matters
username, id, full_nameIdentity plus a stable numeric IDThe ID survives username changes
biography, bio_links, external_urlFree text and outbound linksThe richest public field, and a cross-platform pivot
edge_owner_to_timeline_media.countThe real post count, not maskedPoll it over time for posting cadence
edge_followed_by, edge_followFollower and following countsGrowth, purges and activity gaps
profile_pic_url_hd320x320 image, despite the nameReverse image search input
is_private, is_verified, category_nameAccount status flagsConfirms what you are dealing with
edge_mutual_followed_byShared followers, viewer-dependentA partial follower graph, no follow request
edge_owner_to_timeline_media.edgesEmpty for a private accountThe content itself does not come out
Logged-out web_profile_info fields for a private profile, tested 8 August 2026.

Two of those surprise people. The post count is not masked; the true number is served to anyone who asks. And profile_pic_url_hd is a misnomer: every account checked, public and private, capped at 320 by 320 pixels, with profile_pic_url at 150. Genuine full resolution lives behind the authenticated mobile endpoint, which is the one place propic could beat a browser.

The same data reaches crawlers through plain HTML. A request with a Googlebot user agent gets a server-rendered page title, an OpenGraph description carrying all three counts in one string, and the bio in the description meta tag. That is why private profiles still show up in Google, and why pasting one into Slack or Discord unfurls a preview with the person's name and bio.

None of this is an API you can lean on. After roughly 20 sequential logged-out lookups the endpoint starts answering with "message":"Please wait a few minutes before you try again." and "require_login":true. That flag is the tell: the anonymous path is a grace allowance, not a supported interface.

Why "private viewer" sites are scams

The README calls them scams and the mechanics are documented. A MalwareTips teardown of one such site, published 19 February 2026, describes the standard funnel: you enter a username, watch fake progress bars labeled "Fetching profile" and "Decrypting", and are then told that human verification is required. In the teardown's words, "This isn't verification. It's monetization," and "Each completed offer can generate a payout."

What the offers collect: email addresses and phone numbers for resale, browser notification permissions for persistent adware, card details for auto-renewing trials, and in the app-install variants, device access through a sideloaded APK. The loop is deliberate; the site reports that verification failed so it can push another offer. No profile data is ever fetched.

Meta's own litigation is the court-documented version of the same pattern. Suing Octopus over scraping-for-hire software in July 2022, Meta stated that "After paying for access to the scraping software, customers self-compromised their Facebook and Instagram accounts by providing their authentication information to Octopus" (actions against scraping-for-hire). The same round covered clone sites republishing profiles without authorization, affecting over 350,000 Instagram users. In January 2023 Meta sued Voyager Labs, which had run roughly 38,000 fake accounts to collect data only visible to logged-in viewers.

There is also no legitimate API left to claim. Meta deprecated the Instagram Basic Display API on 4 December 2024, and its replacement serves Business and Creator accounts only. Any 2026 product advertising API-level access to a personal account, private or public, is advertising an API that no longer exists. Osintgram and instaloader are not using an API either; they impersonate the mobile and web clients, which is why they inherit the follow wall instead of routing around it.

The strongest evidence that this is Instagram behavior rather than an Osintgram limitation is that a separate project encodes the identical rule. Instaloader repeats one sentence across its post, follower and following methods, "To use this, one needs to be logged in and private profiles has to be followed", ships a dedicated PrivateProfileNotFollowedException, and states on its troubleshooting page that you have to follow a private account to access most of its information.

US case law has converged on a metaphor that fits Instagram unusually well. In Van Buren v. United States (Supreme Court, June 2021) the court held that "exceeds authorized access" under the CFAA does not cover those who "have improper motives for obtaining information that is otherwise available to them". The Ninth Circuit applied that in hiQ Labs v. LinkedIn (April 2022): the "without authorization" inquiry "presupposes that there first be the equivalent of a gate that restricts access".

A private Instagram account is the gate. Public profile metadata is gates-up: collect it, record where it came from, move on. Getting behind the follow wall with stolen credentials, a borrowed logged-in session, a deceptive follow request or a purchased scraper session is gates-down, and no research purpose converts one into the other.

A second exposure attaches to Osintgram specifically. In Meta Platforms v. Bright Data (N.D. Cal., January 2024) the terms-of-service claim turned on whether the scraping happened while logged into a Meta account. Osintgram's classic backend authenticates with a real Instagram account, which puts it squarely inside the terms-bound category. Instagram's answer in practice is account-level rather than legal, in the form of challenges and lockouts, which is why the README warns you not to use your primary account.

None of that is globally settled. Van Buren, hiQ and Bright Data are US authority and decide nothing in the UK or the EU. In the UK, section 1 of the Computer Misuse Act 1990 makes knowingly unauthorized access to computer material a criminal offense carrying up to 12 months on summary conviction and two years on indictment. In the EU, publicly available personal data is still personal data: EDPB Guidelines 1/2024 set a three-part legitimate-interest test, and purpose limitation, data minimization and transparency still apply to anything collected from a public page.

What authorized research does around a private account

Refusing the bypass does not leave you with nothing. A private account sits inside a public graph, and the graph is fair game.

  • The counts are a time series. Post, follower and following counts are served for private accounts. Recorded weekly, they give you posting cadence, follower growth or purges, and activity gaps, without you ever seeing a post.
  • The bio is the richest public field. It routinely carries an external URL, a link aggregator, an employer, a city or an email address. It is the standard cross-platform pivot, and Instagram offers no setting that hides it.
  • Mutual followers surface to a logged-in viewer. Instagram renders a "Followed by" line above the blocked grid, and there is no toggle to suppress it. That is a partial, viewer-dependent slice of the follower graph obtained without sending any follow request.
  • Other people's posts are other people's posts. Content that tags or co-authors a private user is served under the owning account's privacy setting, not the private user's. That is the honest basis for the whole "tagged by others" category of technique.
  • Reverse image search the profile picture, carefully. With a 320-pixel ceiling you are in the degraded band for face matching. Treat it as "where else has this exact image been posted" rather than identification. Yandex is the strongest on faces and crops; TinEye only finds near-exact copies.

Skip the archive step for the profile URL

Standard OSINT advice says to check the Wayback Machine. For instagram.com profile URLs specifically it mostly does not work: snapshots exist, but they resolve to a JavaScript shell with no meta tags, no bio and no counts, checked 8 August 2026. Google retired its public page cache in February 2024. Archives are still worth the time for third-party reposts and news coverage that embedded the content.

None of this gets you content, and that is the point. The deliverable of authorized research around a private account is a documented public footprint plus an explicit, labeled gap, not a reconstruction of what sits behind the wall. If the content genuinely is the requirement, the remaining routes go through a person: the account holder, a platform request, or legal process. There is no tool answer to that question.

If the account you are working on is public, the gate never comes up. If you have not got Osintgram running yet, start with the install guide, but read does Osintgram still work first: the login layer fails long before the privacy gate does.

Frequently asked questions

Osintgram is an independent OSINT tool and is not affiliated with Instagram or Meta. These guides describe publicly documented open-source software and public-data research only. Use OSINT techniques lawfully, on subjects you are authorized to investigate, and never to harass or surveil private individuals.