The error#
Profile {username} is private but not followed.
Private but not followed.
Profile {username}: private but not followed.PrivateProfileNotFollowedException is a subclass of InstaloaderException. The first line is what the profile object raises. The shorter lines come from the CLI download path.
Posts of a private profile when you are not logged in are a different exception: LoginRequiredException with Login required to access the posts of private profile {username}.
What triggers it#
The profile is marked private, a session exists, and that session does not follow the account. Anonymous access does not take this branch. It asks you to log in first.
How to confirm#
Print the exception class. PrivateProfileNotFollowedException means the session is valid and the account is private. LoginRequiredException mentioning private profile means there was no session.
Fixes#
Follow the account from the user you pass to --login, then retry. instaloader will not download that profile's posts until the follow exists. Logging in as the account itself is a different check (Login as {username} required for saved posts).
There is no flag in these messages that turns a private profile into a public one.
SocialScrape#
Instagram profile is GET /v1/instagram/profile. A private account comes back with is_private true. Posts are GET /v1/instagram/profile/posts, and one post is GET /v1/instagram/post.
Failed requests cost 0 credits. New accounts get 100 credits on signup, no card. Codes are on errors.