Fast and effective Instagram Private API wrapper
Project description
instagrapi
⚠️ Telegram support group moved to aiograpi_support — the previous
@instagrapigroup has been restricted by Meta and is no longer maintained.
Fast and effective unofficial Instagram API wrapper for Python.
instagrapi combines public web and private mobile API flows, supports session persistence and challenge handling, and covers the main automation primitives for users, media, stories, direct messages, notes, locations, comments, insights, and uploads.
Private API automation is fragile in production because account trust, proxies, device state, challenges, and rate limits can change independently of the library. For account-owned business workflows, prefer official Instagram APIs where they cover your use case. For production private API infrastructure, a hosted provider such as HikerAPI may be a better fit than maintaining accounts, proxies, and challenge handling yourself.
The instagrapi project is best suited for testing, research, and controlled internal automation.
✨ aiograpi - Asynchronous Python library for Instagram Private API ✨
Support Python 3.10+
Python 3.9 support was dropped in 2.5.0. Upstream security patches for Pillow 12.x and pytest 9.x are not backported to Python 3.9, leaving conditional pins permanently exposed to known CVEs. Users who need Python 3.9 should pin to instagrapi==2.4.5.
Installation
pip install instagrapi
If your project uses uv, you can add the package with:
uv add instagrapi
Or install it into the active virtual environment:
uv pip install instagrapi
Quick Start
from instagrapi import Client
cl = Client()
cl.login(ACCOUNT_USERNAME, ACCOUNT_PASSWORD)
user_id = cl.user_id_from_username(ACCOUNT_USERNAME)
medias = cl.user_medias(user_id, 20)
Session Persistence
from instagrapi import Client
cl = Client()
cl.login(USERNAME, PASSWORD)
cl.dump_settings("session.json")
# reload later without entering credentials again
cl = Client()
cl.load_settings("session.json")
cl.login(USERNAME, PASSWORD)
If you want more explicit control over the loaded session object:
from instagrapi import Client
cl = Client()
cl.set_settings(cl.load_settings("session.json"))
cl.login(USERNAME, PASSWORD)
Login using a sessionid
from instagrapi import Client
cl = Client()
cl.login_by_sessionid("<your_sessionid>")
login_by_sessionid() is best treated as a lightweight compatibility path. For long-lived automation, prefer the normal
login() -> dump_settings() -> load_settings()/set_settings() session flow.
Typical Tasks
List and download another user's posts
from instagrapi import Client
cl = Client()
cl.login(USERNAME, PASSWORD)
target_id = cl.user_id_from_username("target_user")
posts = cl.user_medias(target_id, amount=10)
for media in posts:
# download photos to the current folder
cl.photo_download(media.pk)
See examples/session_login.py for a standalone script demonstrating these login methods.
Search locations by name or exact pk
from instagrapi import Client
cl = Client()
cl.login(USERNAME, PASSWORD)
places = cl.location_search_name("Times Square")
place = places[0]
same_place = cl.location_search_pk(place.pk)
print(same_place.name, same_place.pk)
Work with Notes
from instagrapi import Client
cl = Client()
cl.login(USERNAME, PASSWORD)
notes = cl.get_notes()
print(cl.get_note_text_by_user(notes, "instagram"))
note = cl.create_note("Hello from instagrapi", audience=0)
cl.delete_note(note.id)
Features
- Uses Web API and Mobile API flows where available
- Supports login by password, 2FA, and
sessionid - Includes email/SMS-based challenge resolver hooks
- Uploads and downloads photos, videos, albums, IGTV, reels, and stories
- Works with users, media, comments, locations, hashtags, collections, notes, direct messages, and insights
- Supports story building with mentions, hashtags, link stickers, and media stickers
- Includes helpers for current location search and notes flows
- App-side discovery surfaces:
chaining,fetch_suggestion_details,discover_recommended_accounts_for_category_v1,user_stream_*,user_web_profile_info_v1 - v2 search SERPs:
fbsearch_accounts_v2,fbsearch_reels_v2,fbsearch_topsearch_v2,fbsearch_typehead - Alternative media-info path (
media_info_v2) for ad-tagged / sponsored media that the canonical endpoint refuses
Anonymous/public web paths are best treated as opportunistic rather than guaranteed. Instagram can change or restrict them independently of the library, so production-grade workflows should prefer authenticated sessions.
Documentation And Support
API reference and full usage guide live at subzeroid.github.io/instagrapi:
- Documentation index
- Getting Started
- Usage Guide
- Interactions reference
- Best Practices for sessions, proxies, and anti-abuse handling
- Handle Exceptions for centralizing
429, challenge, and relogin logic - GitHub Discussions
- Support chat in Telegram: aiograpi_support — the previous
@instagrapigroup was restricted by Meta and is no longer maintained
For other languages, consider instagrapi-rest. For async Python, see aiograpi.
Tutorials
Hands-on guides for real instagrapi work — login flows, sessions, proxies, scraping, posting, error handling — live at instagrapi.com/guides:
- Instagram Private API in Python — pillar walkthrough: login, sessions, fetching, posting
- 2FA and
challenge_required - Session persistence: file, Redis, and Postgres patterns
- Configuring proxies (HTTP, SOCKS5, residential)
- Instagram scraper in Python: a working setup
- Upload a photo from Python
- Download Instagram stories
- Common errors reference —
bad_password,challenge_required,login_required,please_wait_a_few_minutes,feedback_required,proxy_address_is_blocked BadPassword: correct password rejected by Instagram — proxy/IP/device/session trust troubleshooting- Framework integrations — Django, FastAPI, Celery, Docker, AWS Lambda
Comparing instagrapi to other tools:
- instagrapi vs Instaloader — download-only vs authenticated automation
- instagrapi vs aiograpi — sync or async
- Instagram API libraries by language — what's actually maintained in 2026
Additional example
from instagrapi import Client
from instagrapi.types import StoryMention, StoryMedia, StoryLink, StoryHashtag
cl = Client()
cl.login(USERNAME, PASSWORD, verification_code="<2FA CODE HERE>")
media_pk = cl.media_pk_from_url('https://www.instagram.com/p/CGgDsi7JQdS/')
media_path = cl.video_download(media_pk)
subzeroid = cl.user_info_by_username('subzeroid')
hashtag = cl.hashtag_info('dhbastards')
cl.video_upload_to_story(
media_path,
"Credits @subzeroid",
mentions=[StoryMention(user=subzeroid, x=0.49892962, y=0.703125, width=0.8333333333333334, height=0.125)],
links=[StoryLink(webUri='https://github.com/subzeroid/instagrapi')],
hashtags=[StoryHashtag(hashtag=hashtag, x=0.23, y=0.32, width=0.5, height=0.22)],
medias=[StoryMedia(media_pk=media_pk, x=0.5, y=0.5, width=0.6, height=0.8)]
)
Related Projects
If you need async Python, use aiograpi.
For other languages, see instagrapi-rest. For hosted production Instagram API infrastructure, see HikerAPI.
Related services:
- Cloqly for premium rotating proxies and stable automation traffic
- DataLikers for Instagram MCP, Cache API, and datasets
- LamaTok for TikTok API access, automation, and data workflows
- InstaSurfBot for downloading Instagram media in Telegram
- OSINTagramBot for Instagram OSINT in Telegram
HikerAPI Affiliate Program
Refer users to HikerAPI and earn a percentage of their API spending:
| Plan | Commission |
|---|---|
| Start trial plan ($0.02/req) | 50% |
| Standard ($0.001/req) | 25% |
| Business ($0.00069/req) | 15% |
| Ultra ($0.0006/req) | 10% |
Extras: 2-level referral system, no caps, lifetime attribution
Payouts: USDT / USDC (TRC-20 or ERC-20), minimum 20 USDT, request anytime from the dashboard
Contributing
For local setup, tests, linting, and pull request expectations, see CONTRIBUTING.md and the development guide.
Maintainer release commands:
python -m build
twine upload dist/*
License
instagrapi is distributed under the MIT License.
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 instagrapi-2.5.16.tar.gz.
File metadata
- Download URL: instagrapi-2.5.16.tar.gz
- Upload date:
- Size: 139.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
85958d8e3af3e86d2aa619ac001b577fe5c493aef882af38dbdd3cc4a0c18add
|
|
| MD5 |
5a8892646bdca1261f03facb6edf68d2
|
|
| BLAKE2b-256 |
3d60a450a9949b7f0d7c3a6a1c19976aaf92ec795422644bfcf081debea40bfe
|
Provenance
The following attestation bundles were made for instagrapi-2.5.16.tar.gz:
Publisher:
publish.yml on subzeroid/instagrapi
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
instagrapi-2.5.16.tar.gz -
Subject digest:
85958d8e3af3e86d2aa619ac001b577fe5c493aef882af38dbdd3cc4a0c18add - Sigstore transparency entry: 1499491487
- Sigstore integration time:
-
Permalink:
subzeroid/instagrapi@18d165709653d923c7f1a4702846c368feb9dcf3 -
Branch / Tag:
refs/tags/2.5.16 - Owner: https://github.com/subzeroid
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@18d165709653d923c7f1a4702846c368feb9dcf3 -
Trigger Event:
push
-
Statement type:
File details
Details for the file instagrapi-2.5.16-py3-none-any.whl.
File metadata
- Download URL: instagrapi-2.5.16-py3-none-any.whl
- Upload date:
- Size: 154.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f71b82653d4a6900cb2567fc8c9a4df65af2b2447033b7778d44a5426a40545e
|
|
| MD5 |
d94c097f795505e1bc6e812509daddf4
|
|
| BLAKE2b-256 |
9047fccf22645ee8e87f4a15907f821e2db95fdc775ea956db479d8bcce2ee81
|
Provenance
The following attestation bundles were made for instagrapi-2.5.16-py3-none-any.whl:
Publisher:
publish.yml on subzeroid/instagrapi
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
instagrapi-2.5.16-py3-none-any.whl -
Subject digest:
f71b82653d4a6900cb2567fc8c9a4df65af2b2447033b7778d44a5426a40545e - Sigstore transparency entry: 1499491541
- Sigstore integration time:
-
Permalink:
subzeroid/instagrapi@18d165709653d923c7f1a4702846c368feb9dcf3 -
Branch / Tag:
refs/tags/2.5.16 - Owner: https://github.com/subzeroid
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@18d165709653d923c7f1a4702846c368feb9dcf3 -
Trigger Event:
push
-
Statement type: