Choosing Your Stack · Broker & Execution · Module 2

ib_insync vs ib_async: Which IBKR Python Wrapper to Use

The most-used Python wrapper for Interactive Brokers' API was ib_insync. It was archived read-only on March 14, 2024, following the passing of its author, Ewald de Wit. The maintained community successor is ib_async, developed by the ib-api-reloaded organization. This page explains what changed, how compatible the two libraries are, and which to use for new and existing projects. No investment advice, no affiliate links — neutral guidance for researchers choosing their stack.

ib_insync is archived as of March 14, 2024. The repository is preserved for reference but receives no commits, bug fixes, or API compatibility updates. New IBKR Python projects must use ib_async.

Broker API comparisons — Module 2 cluster:

Head-to-Head Comparison

Both libraries wrap Interactive Brokers' TWS API and Client Portal Gateway using Python's asyncio model. The distinction is entirely one of maintenance status.

Library Status Latest Release Python Req. Maintainer License
ib_insync Archived (read-only, 2024-03-14) v0.9.86 (last) ≥3.6 Ewald de Wit (archived) BSD
ib_async Active v2.0.1 (Jun 2025) ≥3.10 Matt Stancliff, ib-api-reloaded org BSD

Four Points of Nuance

1. The transition was due to the author's passing, not abandonment

ib_insync was actively maintained and widely used. Its archival was not a product decision or a case of a maintainer losing interest — Ewald de Wit passed away in early 2024, and the repository was archived shortly after. This context matters for how you interpret the codebase: ib_insync is not broken or deprecated in a technical sense. It is frozen at v0.9.86, a stable release that worked well. The library's asyncio design and core architecture are sound. The problem is that Interactive Brokers' API evolves, Python versions evolve, and there is no longer anyone to apply updates. ib_async was created precisely to continue that work.

2. API compatibility: ib_async is largely a drop-in replacement

ib_async was designed to be API-compatible with ib_insync. The core objects — IB, Contract, Order, Trade, Ticker — follow the same interfaces. The asyncio event loop model, the ib.connect() flow, and the callback/event patterns are preserved. Most ib_insync codebases can migrate to ib_async by changing the import statement and resolving any Python version requirements. Non-trivial differences and breaking changes are documented in ib_async's release notes. For projects with extensive ib_insync usage, review those notes before migrating — but expect the migration to be measured in hours, not days.

3. Python version requirement: 3.10+ is a real constraint

ib_async requires Python 3.10 or newer. ib_insync's last stable version works with Python 3.6+. If your trading system still runs Python 3.7, 3.8, or 3.9, migrating to ib_async requires a Python version upgrade as a prerequisite. Python 3.10 introduced structural pattern matching and improved typing features; ib_async uses the improved async/await semantics available from 3.10 onwards. For teams on older Python versions, the migration has two steps: Python upgrade first, then ib_insync → ib_async. Python 3.10+ is the current standard for production trading systems, so this is a worthwhile upgrade regardless.

4. ib_async is actively developed, not just patched

ib_async is not merely applying bug fixes to a frozen codebase. The ib-api-reloaded organization makes ongoing changes to keep pace with IBKR's API updates, resolve Python compatibility issues, and improve the library. v2.0.1 (June 2025) reflects a significant version bump from ib_insync's v0.9.x series. Any new IBKR API features — new order types, new data endpoints, authentication changes — will be implemented in ib_async and not in ib_insync. Over time, the divergence between the two libraries will increase as IBKR's API evolves.

Best for Whom

When Neither Fits

Both ib_insync and ib_async wrap IBKR's API specifically. If you want to avoid IBKR's authentication complexity entirely, Alpaca (alpaca-py, REST + WebSocket, API key, no session management) covers US stocks, ETFs, options, and crypto with a significantly simpler integration path. For code-first backtesting that connects directly to IBKR live without a separate wrapper, QuantConnect/LEAN has native IBKR broker connection support via its Lean CLI. IBKR's official Python, Java, C++, and C# clients are also available for teams that prefer the official SDK over a community wrapper — but those clients are lower-level than ib_insync/ib_async and require more manual event loop management.

Related comparisons: Alpaca vs Interactive Brokers (full broker comparison) · Best Paper Trading Sandboxes (IBKR paper vs alternatives) · All broker APIs (full 11-venue table)


Frequently Asked Questions

What happened to ib_insync?
ib_insync was archived read-only on March 14, 2024, following the passing of its author, Ewald de Wit. The repository (github.com/erdewit/ib_insync) is preserved for reference but receives no further commits, bug fixes, or compatibility updates. Existing code that uses ib_insync will continue to work as long as the library's dependencies remain compatible, but new projects must use ib_async, the maintained community successor.
Is ib_async a drop-in replacement for ib_insync?
Largely yes. ib_async (ib-api-reloaded organization) is designed to be API-compatible with ib_insync. Most code that uses ib_insync's IB class, Contract, Order, and Trade objects will work with ib_async with minimal changes — primarily the import statement and any Python version adjustments. ib_async requires Python 3.10 or newer, which may require a Python upgrade if your environment is on an older version. The ib-api-reloaded organization documents breaking changes in its release notes.
Which Python version does ib_async require?
ib_async requires Python 3.10 or newer. ib_insync's last supported versions include Python 3.6 and newer. If your existing environment runs Python 3.7, 3.8, or 3.9, migrating to ib_async requires a Python version upgrade. Python 3.10+ is the current standard for most production trading systems, and the async/await improvements in 3.10+ are part of why ib_async chose it as the minimum version.
Should I migrate my existing ib_insync code to ib_async?
If your existing ib_insync code works and you are not actively developing it, there is no immediate urgency — ib_insync will not spontaneously break. The case for migrating: over time, IBKR may change its API in ways that require library updates, and ib_insync will not receive those fixes. If you hit a bug or compatibility issue, only ib_async will have a path to resolution. For any new IBKR Python project, start with ib_async; for stable existing code, evaluate migration when you next touch the codebase.
What is the ib-api-reloaded organization?
ib-api-reloaded is the GitHub organization that maintains ib_async. The project was created to provide an actively maintained fork of ib_insync after the original library was archived. The lead maintainer is Matt Stancliff. The organization follows the same asyncio-based architecture as ib_insync and aims to preserve API compatibility while adding Python 3.10+ support, ongoing IBKR API compatibility fixes, and continued development. The repository is at github.com/ib-api-reloaded/ib_async.

Drill IBKR API patterns, authentication architecture, and Python wrapper trade-offs with AlgoDrill's spaced-repetition flashcards.

Start Flashcards →   View Reading List →