A modern Python wrapper for the IG REST and streaming API.
Project description
igapy – IG API Wrapper
A complete, modern, production-ready Python wrapper for the IG REST and streaming API.
Why igapy?
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
Features
- 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
Quickstart
Install
pip install igapy
Python Example
from 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)
CLI Example
# 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-01
Streaming Example
from 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()
API Documentation
Development & Contribution
- 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!
Project Structure
.
├── 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/
├── conftest.py
├── test_accounts.py
├── test_cli.py
├── test_client.py
├── test_costs.py
├── test_exceptions.py
├── test_history.py
├── test_markets.py
├── test_operations.py
├── test_orders.py
├── test_prices.py
├── test_repeat.py
├── test_sentiment.py
├── test_session.py
├── test_streaming.py
├── test_utils.py
└── test_watchlists.py
Code Style
- PEP8 via flake8
- Black formatting
- Type annotations and docstrings for all public classes/methods
Continuous Integration
- GitHub Actions:
.github/workflows/python-ci.yml - Coverage via pytest-cov
License
MIT License – see LICENSE file for details.
Contact
This project is not affiliated with or endorsed by IG Group. Use at your own risk.
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 igapy-1.0.1.tar.gz.
File metadata
- Download URL: igapy-1.0.1.tar.gz
- Upload date:
- Size: 23.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
af80b9eccdbb4a6e9bb4607c901bc367afe85c016b1f7cd14cede6fe168a7cb9
|
|
| MD5 |
b7f20b256284a2f7af73397f6c9fe22f
|
|
| BLAKE2b-256 |
57c358bdd473a66b0b54943fad8f3d1d49bc2688ad3e43c887098fc0f3d32a2b
|
File details
Details for the file igapy-1.0.1-py3-none-any.whl.
File metadata
- Download URL: igapy-1.0.1-py3-none-any.whl
- Upload date:
- Size: 19.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bfa1509f6d0a8c8d12ce0beb6f545f183a5bb10637f0c12682f13ab628be65e0
|
|
| MD5 |
fe59a14a3215e94c1295bb0e1d7bea08
|
|
| BLAKE2b-256 |
cfb27265b6d5708137c225312f57441616cdfdc4fb9c36a98ff613d72b50686c
|