Powerful Instagram Private API β async, anti-detection, Pydantic models, AI Agent
32 sync + 32 async modules β’ 230+ functions β’ Pydantic models β’ AI Agent β’ CI/CD β’ 475 tests passed
π Documentation: mpython77.github.io/instaharvest_v2
pip install instaharvest-v2With extras:
pip install instaharvest-v2[dev] # pytest, pytest-cov, pytest-asyncio
pip install instaharvest-v2[agent] # AI providers (Gemini, OpenAI, Claude)
pip install instaharvest-v2[web] # FastAPI web playground
pip install instaharvest-v2[all] # everythingfrom instaharvest_v2 import Instagram
ig = Instagram.from_env(".env")
user = ig.users.get_by_username("cristiano")
print(user.username) # cristiano
print(user.followers) # 650000000
print(user["bio"]) # dict-like access works tooig = Instagram()
ig.login("username", "password")
ig.auth.save_session("session.json") # save for next timeig = Instagram()
ig.auth.load_session("session.json") # no re-login neededimport asyncio
from instaharvest_v2 import AsyncInstagram
async def main():
async with AsyncInstagram.from_env(mode="fast") as ig:
# Parallel β all at once!
tasks = [ig.users.get_by_username(u) for u in usernames]
profiles = await asyncio.gather(*tasks)
asyncio.run(main())ig = Instagram(
challenge_callback=lambda ctx: input(f"Code sent to {ctx.contact_point}: ")
)
# Email/SMS challenges resolved automatically!ig = Instagram.anonymous()
profile = ig.public.get_profile("cristiano")
posts = ig.public.get_posts("cristiano", max_count=12)ig = Instagram()
# By shortcode (from URL: instagram.com/reel/ABC123/)
post = ig.public.get_post_by_shortcode("ABC123")
print(post["likes"]) # 69603
print(post["video_url"]) # full video download URL
print(post["audio"]) # {'title': 'Original audio', 'artist': '...'}
# By full URL
post = ig.public.get_post_by_url("https://instagram.com/reel/ABC123/")
# Works for ALL types: Reels, Photos, Carousels, Videos
# Returns: video_url, display_url, likes, views, comments, audio, owner, carousel_mediafrom instaharvest_v2 import Instagram
from instaharvest_v2.agent import InstaAgent, Permission
ig = Instagram.from_env(".env")
agent = InstaAgent(
ig=ig,
provider="gemini", # 13 AI providers
permission=Permission.FULL_ACCESS,
memory=True,
)
agent.ask("Get @cristiano's last 10 posts and save to CSV")
agent.ask("Compare @nike and @adidas engagement rates")
agent.ask("Find the best posting time for my account")SESSION_ID=your_session_id
CSRF_TOKEN=your_csrf_token
DS_USER_ID=your_user_id
MID=optional
IG_DID=optional
DATR=optional
USER_AGENT=optionaluser = ig.users.get_by_username("cristiano") # β User model
user = ig.users.get_by_id(123456789) # β User model
users = ig.users.search("cristiano") # β List[UserShort]
profile = ig.users.get_full_profile("cristiano") # merged User
bio = ig.users.parse_bio(user) # β BioParsedmedia = ig.media.get_info(media_pk) # β Media model
media = ig.media.get_by_shortcode("ABC123") # β Media model
likers = ig.media.get_likers(media_pk) # β List[UserShort]
comments = ig.media.get_comments_parsed(pk) # β List[Comment]
ig.media.like(media_pk)
ig.media.comment(media_pk, "Nice! π₯")
ig.media.save(media_pk)
ig.media.edit_caption(media_pk, "New caption")
ig.media.pin_comment(media_pk, comment_pk)ig.feed.get_user_feed(user_pk)
posts = ig.feed.get_all_posts(user_pk, max_posts=100)
ig.feed.get_liked()
ig.feed.get_saved()
ig.feed.get_tag_feed("fashion")
ig.feed.get_location_feed(location_pk)
ig.feed.get_timeline()
ig.feed.get_reels_feed()ig.stories.get_tray()
ig.stories.get_user_stories(user_pk)
ig.stories.mark_seen(story_pks)
ig.stories.get_highlights_tray(user_pk)
ig.stories.create_highlight("My Highlight", story_pks)
ig.stories.react_to_story(story_pk, "π₯")ig.friendships.follow(user_pk)
ig.friendships.unfollow(user_pk)
followers = ig.friendships.get_all_followers(user_pk) # β List[UserShort]
following = ig.friendships.get_all_following(user_pk) # β List[UserShort]
ig.friendships.block(user_pk)
ig.friendships.remove_follower(user_pk)
ig.friendships.mute(user_pk)
ig.friendships.restrict(user_pk)
ig.friendships.add_close_friend(user_pk)
ig.friendships.get_mutual_followers(user_pk)ig.direct.get_inbox()
ig.direct.send_text(thread_id, "Hello!")
ig.direct.send_media(thread_id, media_pk)
ig.direct.create_thread([user_pk1, user_pk2])
ig.direct.send_link(thread_id, "https://example.com")
ig.direct.send_reaction(thread_id, item_id, "β€οΈ")ig.upload.post_photo("photo.jpg", caption="My post")
ig.upload.post_video("video.mp4", caption="My reel")
ig.upload.post_story_photo("story.jpg")
ig.upload.post_reel("reel.mp4", caption="Trending")
ig.upload.post_carousel(["img1.jpg", "img2.jpg"], caption="Album")
ig.upload.delete_media(media_pk)ig.download.download_media(media_pk)
ig.download.download_stories(user_pk)
ig.download.download_highlights(user_pk)
ig.download.download_profile_pic(username="cristiano")
ig.download.download_user_posts(user_pk, max_posts=50)
ig.download.download_by_url("https://instagram.com/p/ABC123/")ig.search.top_search("query")
users = ig.search.search_users("cristiano") # β List[UserShort]
ig.search.search_hashtags("fashion")
ig.search.search_places("New York")ig.account.get_current_user()
ig.account.edit_profile(full_name="New Name")
ig.account.set_private()
ig.account.set_public()
ig.account.get_blocked_users()
ig.account.get_login_activity()ig.login("username", "password")
ig.auth.save_session("session.json")
ig.auth.load_session("session.json")
ig.auth.validate_session()
ig.auth.logout()ig.hashtags.get_info("fashion") # Hashtag info
ig.insights.get_account_insights() # Analytics
ig.notifications.get_activity_feed() # Notifications
ig.graphql.get_followers(user_pk) # GraphQL queries
ig.location.search("New York") # Location search
ig.collections.get_list() # Saved collectionsreport = ig.analytics.engagement_rate("cristiano")
times = ig.analytics.best_posting_times("nike")
analysis = ig.analytics.content_analysis("adidas")
summary = ig.analytics.profile_summary("messi")
result = ig.analytics.compare(["nike", "adidas", "puma"])ig.export.followers_to_csv("nike", "followers.csv", max_count=5000)
ig.export.following_to_csv("nike", "following.csv")
ig.export.post_likers("media_pk", "likers.csv")
ig.export.to_json("cristiano", "profile.json", include_posts=True)ig.growth.follow_users_of("competitor", count=20)
ig.growth.unfollow_non_followers(max_count=50)
non_followers = ig.growth.get_non_followers()
fans = ig.growth.get_fans()
ig.growth.add_whitelist(["friend1", "friend2"])ig.automation.comment_on_hashtag("fashion", templates=["Nice! π₯", "Love it! β€οΈ"])
ig.automation.auto_like_feed(count=20)
ig.automation.auto_like_hashtag("travel", count=30)
ig.automation.watch_stories("target_user")ig.scheduler.post_at("2026-03-01 09:00", photo="post.jpg", caption="Scheduled!")
ig.scheduler.story_at("2026-03-01 12:00", photo="story.jpg")
ig.scheduler.reel_at("2026-03-01 18:00", video="reel.mp4", caption="Reel time!")
ig.scheduler.start() # Background workerwatcher = ig.monitor.watch("cristiano")
watcher.on_new_post(lambda data: print("New post!"))
watcher.on_follower_change(lambda old, new: print(f"{old} β {new}"))
watcher.on_bio_change(lambda old, new: print(f"Bio changed!"))
ig.monitor.start(interval=300) # Check every 5 minig.bulk_download.all_posts("cristiano", output_dir="./downloads")
ig.bulk_download.all_stories("cristiano", output_dir="./downloads")
ig.bulk_download.everything("cristiano", output_dir="./downloads")analysis = ig.hashtag_research.analyze("python")
related = ig.hashtag_research.related("python", count=30)
suggestions = ig.hashtag_research.suggest("coding", count=20, mix="balanced")
comparison = ig.hashtag_research.compare(["python", "javascript", "rust"])ig.pipeline.to_sqlite("cristiano", "data.db", include_posts=True, include_followers=True)
ig.pipeline.to_jsonl("cristiano", "data.jsonl", max_posts=100)result = ig.ai_suggest.hashtags_from_caption("Beautiful sunset at the beach")
profile_tags = ig.ai_suggest.hashtags_for_profile("cristiano")
captions = ig.ai_suggest.caption_ideas("travel", style="casual", count=5)lookalike = ig.audience.find_lookalike("competitor", count=50)
overlap = ig.audience.overlap("account_a", "account_b")
insights = ig.audience.insights("my_account")comments = ig.comment_manager.get_comments(media_pk, sort="top")
ig.comment_manager.auto_reply(media_pk, keyword="price?", reply="DM us!")
ig.comment_manager.delete_spam(media_pk)
sentiment = ig.comment_manager.sentiment(media_pk)test = ig.ab_test.create("Caption Test", variants={
"A": {"caption": "Short and sweet"},
"B": {"caption": "Long detailed caption with hashtags #test"},
})
ig.ab_test.record(test["id"], "A", likes=100, comments=20)
ig.ab_test.record(test["id"], "B", likes=150, comments=30)
result = ig.ab_test.results(test["id"])
print(f"Winner: {result['winner']}")All API methods return typed Pydantic models with dict-like access:
user = ig.users.get_by_username("cristiano")
# Typed attributes
print(user.username) # "cristiano"
print(user.follower_count) # 650000000
# Dict-like access (backward compatible)
print(user["username"]) # "cristiano"
# Convert to dict
data = user.to_dict()
# Extra fields preserved (API changes won't break)
print(user.some_new_field) # works!Available models: User, UserShort, Media, Comment, Story, Highlight, DirectThread, DirectMessage, Location, Hashtag, Notification
| Feature | Description |
|---|---|
| π‘οΈ Anti-detection | Browser fingerprint rotation, Gaussian delays, escalation |
| π Multi-account | Automatic session rotation |
| π Proxy support | SOCKS5/HTTP, weighted rotation, health checking |
| β±οΈ Rate limiting | Per-endpoint sliding window limits |
| π Login | NaCl encrypted password, 2FA, checkpoint handling |
| πΎ Session persistence | Save/load sessions, no re-login needed |
| π§© Challenge handler | Auto-resolve email/SMS/consent challenges |
| β‘ Full async parity | 32 sync + 32 async modules β complete feature match |
| π¦ Pydantic models | Typed returns, dict-like access, backward compatible |
| π€ AI Agent | 13 providers, natural language control, memory, webhooks |
| π 12 Advanced tools | Analytics, Export, Growth, Automation, Monitor, Pipeline, etc. |
| β CI/CD | GitHub Actions β lint, test (3 Python versions), security, build |
| π§ͺ 475 tests | 35% coverage, pytest-cov, comprehensive unit & integration tests |
# π’ SAFE β 5 concurrent, human delays
async with AsyncInstagram.from_env(mode="safe") as ig: ...
# β‘ FAST β 15 concurrent, moderate delays
async with AsyncInstagram.from_env(mode="fast") as ig: ...
# π TURBO β 50 concurrent, minimal delays (proxy required)
async with AsyncInstagram.from_env(mode="turbo") as ig: ...# Run all tests
pytest tests/ -v
# Run with coverage
pytest tests/ --cov=instaharvest_v2 --cov-report=term-missingCurrent status:
- β 475 tests passed
- π 35.3% code coverage
instaharvest_v2/
βββ instagram.py # Main class (sync)
βββ async_instagram.py # Main class (async)
βββ client.py # HTTP client (curl_cffi)
βββ async_client.py # Async HTTP client
βββ challenge.py # Challenge auto-resolver
βββ anti_detect.py # Anti-detection system
βββ session_manager.py # Session auto-refresh
βββ proxy_manager.py # Proxy rotation
βββ rate_limiter.py # Rate limiting
βββ multi_account.py # Multi-account manager
βββ exceptions.py # Error classes
βββ models/ # Pydantic models
β βββ user.py # User, UserShort, BioParsed
β βββ media.py # Media, Caption
β βββ comment.py # Comment
β βββ story.py # Story, Highlight
β βββ direct.py # DirectThread, DirectMessage
β βββ location.py # Location
β βββ notification.py # Notification models
β βββ public_data.py # PublicProfile, PublicPost
βββ api/ # API modules (33 sync + 33 async)
β βββ users.py # User profiles
β βββ media.py # Post interactions
β βββ feed.py # User feeds
β βββ friendships.py # Follow/unfollow
β βββ search.py # Search
β βββ stories.py # Stories & highlights
β βββ direct.py # Direct messages
β βββ upload.py # Photo/video upload
β βββ download.py # Media downloads
β βββ auth.py # Login/logout
β βββ analytics.py # Engagement analytics
β βββ export.py # CSV/JSON export
β βββ growth.py # Smart follow/unfollow
β βββ automation.py # Bot framework
β βββ scheduler.py # Post scheduling
β βββ monitor.py # Account monitoring
β βββ bulk_download.py # Bulk media download
β βββ hashtag_research.py # Hashtag analysis
β βββ pipeline.py # Data pipeline (SQLite/JSONL)
β βββ ai_suggest.py # AI hashtag/caption
β βββ audience.py # Lookalike audience
β βββ comment_manager.py # Comment management
β βββ ab_test.py # A/B testing
β βββ public_data.py # Public data analytics
β βββ discover.py # Similar user discovery
β βββ async_*.py # All 33 async mirrors
βββ agent/ # AI Agent system
β βββ core.py # InstaAgent main class
β βββ providers/ # AI providers (Gemini, OpenAI, Claude, etc.)
β βββ tools.py # 10 built-in tools
β βββ memory.py # Conversation memory
β βββ templates.py # 10 task templates
β βββ tui.py # Terminal UI (Rich)
β βββ web.py # Web UI (FastAPI)
β βββ webhook.py # Notifications (Telegram, Discord)
β βββ cost_tracker.py # Token usage & pricing
β βββ vision.py # Multimodal image analysis
tests/ # 475 tests
docs/ # MkDocs documentation
.github/workflows/ # CI/CD pipeline
GitHub Actions pipeline (.github/workflows/ci.yml):
| Job | Description |
|---|---|
| Lint | flake8 + mypy |
| Test | Python 3.10, 3.11, 3.12 + coverage |
| Security | bandit + safety |
| Build | Package + twine check |
This library is an unofficial, third-party tool designed for educational and research purposes only. It is not affiliated with, authorized, maintained, sponsored, or endorsed by Instagram or Meta Platforms, Inc.
By using this software, you agree that:
- You are solely responsible for any actions you take using this library.
- The authors and maintainers are NOT responsible or liable for any bans, blocks, suspensions, or other penalties applied to your Instagram accounts or IP addresses.
- You will use this tool in compliance with Instagram's Terms of Service and all applicable local laws.
Use at your own risk. The software is provided "AS IS", without warranty of any kind.
MIT License. See LICENSE for details.