A complete, modern, production-ready Python wrapper for the IG REST and streaming API.
igapy is an unofficial, open source Python client for IG's REST and streaming API. It is designed for quant developers, algo traders, and anyone who wants a robust, well-documented and production-ready interface to IG's trading platform. The project aims to be a reference implementation for clean API wrappers in Python.
- 100% endpoint coverage (REST & streaming)
- Modern, type-annotated, PEP8/Black-formatted codebase
- CLI for all public API endpoints
- Full test suite and CI/CD
- No unnecessary complexity – easy to read, extend, and audit
- Full REST API coverage (session, accounts, markets, orders, prices, watchlists, sentiment, history, costs, operations)
- WebSocket streaming client with reconnect, ping, custom subscription management
- Authentication (session management, token handling, account switching, encryption keys)
- Market data retrieval (search, details, bulk, navigation)
- Order management (positions, working orders, confirmations)
- Client sentiment access (single, related, batch)
- Historical prices (multiple date/resolution variants)
- Account preferences management
- Watchlist management (create, modify, delete, add/remove markets)
- Command-line interface (CLI)
- GitHub Actions CI workflow
- Unit tests with pytest (90 tests, 100% coverage)
- PEP8-compliant, Black-formatted codebase
pip install igapyfrom igapy import IGClient, Accounts, Markets
client = IGClient(
api_key="YOUR_API_KEY",
username="YOUR_USERNAME",
password="YOUR_PASSWORD",
is_demo=True
)
client.login()
accounts = Accounts(client).list_accounts()
print(accounts)
# Search for Apple stock (AAPL)
apple_search = Markets(client).search_markets("APPLE")
print(apple_search)
# Get details for the first Apple market found (if any)
if apple_search and apple_search["markets"]:
apple_epic = apple_search["markets"][0]["epic"]
apple_details = Markets(client).get_market_details(apple_epic)
print(apple_details)# List accounts
igapy accounts list --api-key KEY --username USER --password PASS --demo
# Get market details
igapy markets get-details --api-key KEY --username USER --password PASS --demo --epic IX.D.FTSE.DAILY.IP
# Create order
igapy orders create --api-key KEY --username USER --password PASS --demo --order '{"epic":"IX.D.FTSE.DAILY.IP","expiry":"DFB","direction":"BUY","size":1,"orderType":"MARKET","currencyCode":"GBP"}'
# Get prices
igapy prices get --api-key KEY --username USER --password PASS --demo --epic IX.D.FTSE.DAILY.IP
# Get transactions for type and period
igapy history transactions-period --api-key KEY --username USER --password PASS --demo --transaction-type ALL --last-period MONTH
# Get cost history
igapy costs history --api-key KEY --username USER --password PASS --demo --from-date 2024-01-01 --to-date 2024-06-01from igapy import IGClient, IGStreamingClient
import time
client = IGClient(
api_key="YOUR_API_KEY",
username="YOUR_USERNAME",
password="YOUR_PASSWORD",
is_demo=False
)
client.login()
def on_chart_tick(data):
print("Chart tick update:", data)
# IGStreamingClient supports automatic reconnect and re-subscription on connection loss.
# You can control this with the 'reconnect' and 'reconnect_delay' parameters.
stream = IGStreamingClient(client, reconnect=True, reconnect_delay=5)
stream.start()
stream.subscribe_chart_tick(
epic = "CS.D.BITCOIN.CFD.IP",
fields=["BID", "OFR", "UTM"],
callback=on_chart_tick
)
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
print("Stopping streaming...")
stream.stop()- Clone repo, create a virtualenv, install with
pip install -e .[dev] - Run tests:
pytest - Lint:
flake8 src/igapy tests - Format:
black src/igapy tests
Pull requests and issues are welcome!
.
├── LICENSE
├── pyproject.toml
├── MANIFEST.in
├── README.md
├── .gitignore
├── .github/
│ └── workflows/
│ └── python-ci.yml
├── src/
│ └── igapy/
│ ├── __init__.py
│ ├── cli.py
│ ├── client.py
│ ├── session.py
│ ├── accounts.py
│ ├── markets.py
│ ├── prices.py
│ ├── orders.py
│ ├── sentiment.py
│ ├── history.py
│ ├── repeat.py
│ ├── watchlists.py
│ ├── costs.py
│ ├── operations.py
│ ├── streaming.py
│ ├── exceptions.py
│ └── utils.py
└── tests/
- PEP8 via flake8
- Black formatting
- Type annotations and docstrings for all public classes/methods
- GitHub Actions:
.github/workflows/python-ci.yml - Coverage via pytest-cov
MIT License – see LICENSE file for details.
This project is not affiliated with or endorsed by IG Group. Use at your own risk.