Skip to main content

instagrapi

⚠️ Telegram support group moved to aiograpi_support — the previous @instagrapi group has been restricted by Meta and is no longer maintained.

PyPI Python License Package Docs

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

Private mobile requests use HTTP/2 through curl_cffi, included in the standard installation. Client() needs no transport argument, and login() uses CAA directly. The previous login remains available as login_legacy(). See the login migration guide.

Optional public web TLS impersonation is available as an extra:

pip install "instagrapi[curl]"

For public web endpoints that are sensitive to browser TLS fingerprints:

cl = Client(public_transport="curl", public_transport_impersonate="chrome136")

See the public transport guide for live comparison results and caveats.

Private mobile API requests use curl and HTTP/2 by default. See the private HTTP/2 transport guide for saved-session setup, requirements and limitations.

TLS certificate verification is enabled by default. For a trusted debugging MITM proxy, prefer Client(tls_verify="/path/to/proxy-ca.pem"); use Client(tls_verify=False) only for temporary local debugging because it allows session interception.

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

Video uploads can use a built-in MP4 metadata parser when you provide thumbnail=.... Automatic thumbnail generation, StoryBuilder, and video/audio composition still need the optional video dependencies, MoviePy 2.2.1, and executable ffmpeg:

pip install "instagrapi[video]"
pip install --no-deps "moviepy==2.2.1"

MoviePy 2.2.1 currently declares Pillow<12, but instagrapi keeps Pillow>=12.2.0 for security fixes; the --no-deps install keeps the safe Pillow version. If your project imports MoviePy directly, migrate any MoviePy 1.x code from moviepy.editor, set_*, resize, and subclip APIs to the MoviePy 2.x API before upgrading.

Android users should see Pydroid and ffmpeg and Termux.

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)

Runnable Examples

Practical scripts live in examples/README.md. They cover session login, public lookups, media downloads, feed uploads, Reels and Trial Reels, story uploads, Direct messages, proxies, challenge handling, and optional curl-backed public transport.

Session Persistence

from instagrapi import Client

cl = Client()
cl.login(USERNAME, PASSWORD)
cl.dump_settings("session.json")

# reload later; the saved session is validated before reuse
cl = Client()
cl.load_settings("session.json")
cl.login(USERNAME, PASSWORD)
cl.dump_settings("session.json")

login() reuses a valid saved session. If Instagram rejects that session with login_required, instagrapi clears the stale authorization and logs in again with the supplied credentials. Dump the settings after login so a refreshed session is persisted.

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)
cl.dump_settings("session.json")

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.

If a browser/web sessionid returns login_required or logs the browser out, Instagram rejected that session for the private mobile API. Use a stable password login once, save settings with dump_settings(), and reuse those settings instead of repeatedly importing browser cookies.

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)

Send and read Direct messages

from instagrapi import Client

cl = Client()
cl.login(USERNAME, PASSWORD)

target_id = cl.user_id_from_username("target_user")
sent = cl.direct_send("Hello from instagrapi", user_ids=[target_id])
print("sent", sent.id)

threads = cl.direct_threads(amount=5)
for thread in threads:
    last_message = thread.messages[0] if thread.messages else None
    print(thread.id, thread.thread_title, last_message.text if last_message else "")

Work with Direct messages over Realtime MQTT

Realtime MQTT support is experimental. It opens Instagram's private MQTToT connection after login, emits live callbacks, and uses the same Client.proxy settings as HTTP requests. The realtime client can receive Direct message sync events and publish lightweight Direct actions such as text, reactions, typing, and seen state. Use the regular direct_* methods for media sends and full thread management.

import json

from instagrapi import Client

cl = Client()
cl.login(USERNAME, PASSWORD)


def handle_direct_message(payload):
    print(json.dumps(payload, indent=2, ensure_ascii=False))


cl.realtime_on("message", handle_direct_message)

rt = cl.realtime_connect()
rt.direct_subscribe()

try:
    rt.ping()
    rt.direct_send_text(THREAD_ID, "Hello from MQTT")
    while True:
        rt.read_once()
finally:
    cl.realtime_disconnect()

See the full Realtime MQTT guide for lower-level subscriptions and event details.

Receive Direct push notifications over FBNS

FBNS uses Instagram's separate push MQTT connection and registers an Android push token for the logged-in session. It is useful when you need push payloads such as Direct notification callbacks.

import json

from instagrapi import Client

cl = Client()
cl.login(USERNAME, PASSWORD)


def handle_push(payload):
    print(json.dumps(payload, indent=2, ensure_ascii=False))


cl.fbns_on("push", handle_push)
fbns = cl.fbns_connect()

try:
    fbns.ping()
    while True:
        cl.fbns_read_once()
finally:
    cl.fbns_disconnect()

Features

  • Uses Web API and Mobile API flows where available
  • Supports login by password, 2FA, 8-digit backup codes, sessionid, and Bloks 2FA fallback/helpers for newer verification flows
  • 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
  • Exposes account notification setting helpers with typed notification categories
  • Supports story building with mentions, hashtags, link stickers, and media stickers
  • Includes helpers for current location search and Direct message workflows
  • Supports mobile follower sorting with date_followed_latest and date_followed_earliest
  • App-side discovery surfaces: chaining, fetch_suggestion_details, discover_recommended_accounts_for_category_v1, user_stream_*, user_web_profile_info_v1
  • v2 search SERPs: media_search, 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
  • Experimental Realtime MQTT helpers for live events, Direct message sync, lightweight Direct actions, and FBNS push callbacks

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:

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:

Comparing instagrapi to other tools:

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)],
)

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

List of contributors

For local setup, tests, linting, and pull request expectations, see CONTRIBUTING.md and the development guide.

Maintainer release commands:

git tag -a X.Y.Z -m "Release X.Y.Z"
git push origin X.Y.Z
git push codeberg X.Y.Z

The tag-based publish.yml workflow publishes to PyPI via trusted publishing and creates the GitHub release.

License

instagrapi is distributed under the MIT License.

Release files for instagrapi 3.0.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for instagrapi 3.0.3
File Size Uploaded
instagrapi-3.0.3.tar.gz 229.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for instagrapi 3.0.3
File Interpreter ABI Platform
instagrapi-3.0.3-py3-none-any.whl Python 3 none any Details

Total release size:478.2 kB

Release files / instagrapi-3.0.3.tar.gz

Download URL instagrapi-3.0.3.tar.gz
Size 229.8 kB
Tags Source
SHA-256 checksum
How to use checksums
92dad7c535e4b35672d89563950dd797d1f7f88d821fe8b1b6d09b3cd4eb6a08
BLAKE2b-256 checksum
How to use checksums
55c3014efe56d6e54a711c87ccd43de22086d0288d1d1875ca8b789be41aaedd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 17, 2026.

Transparency log

Release files / instagrapi-3.0.3-py3-none-any.whl

Download URL instagrapi-3.0.3-py3-none-any.whl
Size 248.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
a41c2d96a713f2fa39fb199083510d8b7639f0de5475187b97110449e4448eb5
BLAKE2b-256 checksum
How to use checksums
90a45bc88f6e6d4d245be490f470ea6a43509e234bd223ef71508753897ec31e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 17, 2026.

Transparency log

Release history Release notifications | RSS feed

3.0.6

2 release files

3.0.5

2 release files

3.0.4

2 release files

This release

3.0.3 This release

2 release files

3.0.2

2 release files

3.0.1

2 release files

3.0.0

2 release files

2.18.9

2 release files

2.18.8

2 release files

2.18.7

2 release files

2.18.6

2 release files

2.18.5

2 release files

2.18.4

2 release files

2.18.0

2 release files

2.17.2

2 release files

2.17.1

2 release files

2.17.0

2 release files

2.16.9

2 release files

2.16.8

2 release files

2.16.7

2 release files

2.16.6

2 release files

2.16.5

2 release files

2.16.4

2 release files

2.16.3

2 release files

2.16.2

2 release files

2.16.1

2 release files

2.16.0

2 release files

2.15.0

2 release files

2.14.1

2 release files

2.14.0

2 release files

2.13.1

2 release files

2.13.0

2 release files

2.12.0

2 release files

2.11.0

2 release files

2.10.9

2 release files

2.10.8

2 release files

2.10.7

2 release files

2.10.6

2 release files

2.10.5

2 release files

2.10.4

2 release files

2.10.3

2 release files

2.10.2

2 release files

2.10.1

2 release files

2.10.0

2 release files

2.9.19

2 release files

2.9.18

2 release files

2.9.17

2 release files

2.9.16

2 release files

2.9.15

2 release files

2.9.14

2 release files

2.9.13

2 release files

2.9.12

2 release files

2.9.11

2 release files

2.9.10

2 release files

2.9.9

2 release files

2.9.8

2 release files

2.9.7

2 release files

2.9.6

2 release files

2.9.5

2 release files

2.9.4

2 release files

2.9.3

2 release files

2.9.2

2 release files

2.9.1

2 release files

2.9.0

2 release files

2.8.9

2 release files

2.8.8

2 release files

2.8.7

2 release files

2.8.6

2 release files

2.8.5

2 release files

2.8.4

2 release files

2.8.3

2 release files

2.8.2

2 release files

2.8.1

2 release files

2.8.0

2 release files

2.7.20

2 release files

2.7.19

2 release files

2.7.18

2 release files

2.7.17

2 release files

2.7.16

2 release files

2.7.15

2 release files

2.7.14

2 release files

2.7.13

2 release files

2.7.12

2 release files

2.7.11

2 release files

2.7.10

2 release files

2.7.9

2 release files

2.7.8

2 release files

2.7.7

2 release files

2.7.6

2 release files

2.7.5

2 release files

2.7.4

2 release files

2.7.3

2 release files

2.7.2

2 release files

2.7.1

2 release files

2.7.0

2 release files

2.6.11

2 release files

2.6.10

2 release files

2.6.9

2 release files

2.6.8

2 release files

2.6.7

2 release files

2.6.6

2 release files

2.6.5

2 release files

2.6.4

2 release files

2.6.3

2 release files

2.6.2

2 release files

2.6.1

2 release files

2.6.0

2 release files

2.5.18

2 release files

2.5.17

2 release files

2.5.16

2 release files

2.5.11

2 release files

2.5.10

2 release files

2.5.9

2 release files

2.5.8

2 release files

2.5.7

2 release files

2.5.6

2 release files

2.5.5

2 release files

2.5.4

2 release files

2.5.3

2 release files

2.5.2

2 release files

2.5.1

2 release files

2.5.0

2 release files

2.4.5

2 release files

2.4.4

2 release files

2.4.3

2 release files

2.4.2

2 release files

2.4.1

2 release files

2.4.0

2 release files

2.3.0

2 release files

2.2.1

2 release files

2.1.5

1 release file

2.1.3

1 release file

2.1.2

1 release file

2.1.1

1 release file

2.0.3

1 release file

2.0.1

1 release file

2.0.0

1 release file

1.19.8

1 release file

1.19.7

1 release file

1.19.6

1 release file

1.19.5

1 release file

1.19.4

1 release file

1.19.3

1 release file

1.19.2

1 release file

1.19.1

1 release file

1.18.5

1 release file

1.18.4

1 release file

1.18.3

1 release file

1.18.2

1 release file

1.18.1

1 release file

1.17.13

1 release file

1.17.10

1 release file

1.17.9

1 release file

1.17.8

1 release file

1.17.7

1 release file

1.17.6

1 release file

1.17.5

1 release file

1.17.4

1 release file

1.17.3

1 release file

1.17.2

1 release file

1.17.1

1 release file

1.17.0

1 release file

1.16.41

1 release file

1.16.33

1 release file

1.16.32

1 release file

1.16.31

1 release file

1.16.27

1 release file

1.16.26

1 release file

1.16.25

1 release file

1.16.24

1 release file

1.16.23

1 release file

1.16.22

1 release file

1.16.21

1 release file

1.16.20

1 release file

1.16.16

1 release file

1.16.15

1 release file

1.16.14

1 release file

1.16.13

1 release file

1.16.12

1 release file

1.16.10

1 release file

1.16.9

1 release file

1.16.8

1 release file

1.16.7

1 release file

1.16.6

1 release file

1.16.3

1 release file

1.16.2

1 release file

1.16.1

1 release file

1.15.19

1 release file

1.15.17

1 release file

1.15.14

1 release file

1.15.13

1 release file

1.15.12

1 release file

1.15.11

1 release file

1.15.10

1 release file

1.15.9

1 release file

1.15.8

1 release file

1.15.7

1 release file

1.15.6

1 release file

1.15.5

1 release file

1.15.4

1 release file

1.15.3

1 release file

1.15.2

1 release file

1.15.1

1 release file

1.15.0

1 release file

1.14.5

1 release file

1.14.4

1 release file

1.14.3

1 release file

1.14.2

1 release file

1.14.1

1 release file

1.14.0

1 release file

1.13.6

1 release file

1.13.5

1 release file

1.13.4

1 release file

1.13.3

1 release file

1.13.2

1 release file

1.13.1

1 release file

1.13.0

1 release file

1.12.9

1 release file

1.12.8

1 release file

1.12.7

1 release file

1.12.6

1 release file

1.12.5

1 release file

1.12.4

1 release file

1.12.3

1 release file

1.12.2

1 release file

1.12.1

1 release file

1.12.0

1 release file

1.11.1

1 release file

1.11.0

1 release file

1.10.2

1 release file

1.10.1

1 release file

1.10.0

1 release file

1.9.19

1 release file

1.9.18

1 release file

1.9.17

1 release file

1.9.16

1 release file

1.9.15

1 release file

1.9.14

1 release file

1.9.13

1 release file

1.9.12

1 release file

1.9.11

1 release file

1.9.10

1 release file

1.9.9

1 release file

1.9.8

1 release file

1.9.7

1 release file

1.9.6

1 release file

1.9.5

1 release file

1.9.4

1 release file

1.9.3

1 release file

1.9.2

1 release file

1.9.1

1 release file

1.9.0

1 release file

1.8.12

1 release file

1.8.11

1 release file

1.8.10

1 release file

1.8.9

1 release file

1.8.8

1 release file

1.8.7

1 release file

1.8.6

1 release file

1.8.5

1 release file

1.8.4

1 release file

1.8.3

1 release file

1.8.2

1 release file

1.8.1

1 release file

1.8.0

1 release file

1.7.19

1 release file

1.7.17

1 release file

1.7.16

1 release file

1.7.15

1 release file

1.7.14

1 release file

1.7.13

1 release file

1.7.12

1 release file

1.7.11

1 release file

1.7.10

1 release file

1.7.9

1 release file

1.7.8

1 release file

1.7.7

1 release file

1.7.6

1 release file

1.7.5

1 release file

1.7.4

1 release file

1.7.3

1 release file

1.7.2

1 release file

1.7.1

1 release file

1.7.0

1 release file

1.6.4

1 release file

1.6.3

1 release file

1.6.2

1 release file

1.6.1

1 release file

1.5.10

1 release file

1.5.9

1 release file

1.5.8

1 release file

1.5.5

1 release file

1.5.3

1 release file

1.5.2

1 release file

1.5.1

1 release file

1.5.0

1 release file

1.4.9

1 release file

1.4.8

1 release file

1.4.7

1 release file

1.4.6

1 release file

1.4.5

1 release file

1.4.4

1 release file

1.4.3

1 release file

1.4.2

1 release file

1.4.1

1 release file

1.4.0

1 release file

1.3.8

1 release file

1.3.7

1 release file

1.3.6

1 release file

1.3.5

1 release file

1.3.2

1 release file

1.3.1

1 release file

1.3.0

1 release file

1.2.9

1 release file

1.2.8

1 release file

1.2.7

1 release file

1.2.5

1 release file

1.2.4

1 release file

1.2.3

1 release file

1.2.2

1 release file

1.2.1

1 release file

1.2.0

1 release file

1.1.9

1 release file

1.1.8

1 release file

1.1.7

1 release file

1.1.6

1 release file

1.1.5

2 release files

1.1.4

1 release file

1.1.3

1 release file

1.1.2

1 release file

1.1.1

1 release file

1.1.0

1 release file

1.0.10

1 release file

1.0.9

1 release file

1.0.8

1 release file

1.0.7

1 release file

1.0.6

1 release file

1.0.5

1 release file

1.0.4

1 release file

1.0.3

1 release file

1.0.2

1 release file

1.0.1

1 release file

1.0.0

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page