Powerful Instagram Private API โ anti-detection, async, Pydantic models
Project description
๐ธ InstaHarvest v2
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
Installation
pip install instaharvest-v2
With 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] # everything
Quick Start
With cookies (.env file)
from 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 too
With login
ig = Instagram()
ig.login("username", "password")
ig.auth.save_session("session.json") # save for next time
Load saved session
ig = Instagram()
ig.auth.load_session("session.json") # no re-login needed
Async mode (50x faster for bulk)
import 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())
Challenge auto-resolver
ig = Instagram(
challenge_callback=lambda ctx: input(f"Code sent to {ctx.contact_point}: ")
)
# Email/SMS challenges resolved automatically!
Anonymous (no login)
ig = Instagram.anonymous()
profile = ig.public.get_profile("cristiano")
posts = ig.public.get_posts("cristiano", max_count=12)
๐ฌ Reel / Post Scraping (no login, no cookies!)
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_media
๐ค AI Agent
from 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")
.env Format
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=optional
API Reference
๐ค Users
user = 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) # โ BioParsed
๐ท Media
media = 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)
๐ฐ Feed
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()
๐ Stories
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, "๐ฅ")
๐ค Friendships
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)
๐ฌ Direct Messages
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, "โค๏ธ")
๐ค Upload
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)
๐ฅ Download
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/")
๐ Search
ig.search.top_search("query")
users = ig.search.search_users("cristiano") # โ List[UserShort]
ig.search.search_hashtags("fashion")
ig.search.search_places("New York")
โ๏ธ Account
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()
๐ Auth
ig.login("username", "password")
ig.auth.save_session("session.json")
ig.auth.load_session("session.json")
ig.auth.validate_session()
ig.auth.logout()
More Core Modules
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 collections
๐ ๏ธ Advanced Tools
๐ Analytics
report = 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"])
๐ค Export (CSV / JSON)
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)
๐ฑ Growth Engine
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"])
๐ค Automation
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")
๐ Scheduler
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 worker
๐๏ธ Account Monitor
watcher = 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 min
๐ฅ Bulk Download
ig.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")
๐ฌ Hashtag Research
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"])
๐๏ธ Data Pipeline (SQLite / JSONL)
ig.pipeline.to_sqlite("cristiano", "data.db", include_posts=True, include_followers=True)
ig.pipeline.to_jsonl("cristiano", "data.jsonl", max_posts=100)
๐ง AI Hashtag Suggester
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)
๐ฅ Audience Finder
lookalike = ig.audience.find_lookalike("competitor", count=50)
overlap = ig.audience.overlap("account_a", "account_b")
insights = ig.audience.insights("my_account")
๐ฌ Comment Manager
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)
๐งช A/B Testing
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']}")
Pydantic Models
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
Features
| 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 |
Speed Modes (Async)
# ๐ข 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: ...
Testing & Quality
# Run all tests
pytest tests/ -v
# Run with coverage
pytest tests/ --cov=instaharvest_v2 --cov-report=term-missing
Current status:
- โ 475 tests passed
- ๐ 35.3% code coverage
Project Structure
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
CI/CD
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 |
โ ๏ธ Legal Disclaimer
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.
License
MIT License. See LICENSE for details.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file instaharvest_v2-1.0.12.tar.gz.
File metadata
- Download URL: instaharvest_v2-1.0.12.tar.gz
- Upload date:
- Size: 428.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a4afdaac271f78c47deac004b535f5ff617041c068b170808082225b61762b53
|
|
| MD5 |
9df86a320d0c9d9a5b81d0a3819e34a7
|
|
| BLAKE2b-256 |
8df1d4bd87b42cac2e94bd8f5fe328040dbf876aba27c459ff805262782a5d44
|
File details
Details for the file instaharvest_v2-1.0.12-py3-none-any.whl.
File metadata
- Download URL: instaharvest_v2-1.0.12-py3-none-any.whl
- Upload date:
- Size: 463.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
140e922c57b072e0e6baa393d221e81c6539deffe146a93913e8eb7a7ac008b0
|
|
| MD5 |
850f4dae25644a1db52ccc42bad0ef90
|
|
| BLAKE2b-256 |
8f6c452bcf3402971497a72a80f03c6be106f742b6012be823c81a6889ee76c1
|