Skip to main content

A modern Python wrapper for the IG REST and streaming API.

Project description

igapy – IG API Wrapper

PyPI version License: MIT Python versions CI codecov Code style: black

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

hi@vilhelmhilding.com


This project is not affiliated with or endorsed by IG Group. Use at your own risk.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

igapy-1.0.1.tar.gz (23.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

igapy-1.0.1-py3-none-any.whl (19.2 kB view details)

Uploaded Python 3

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

Hashes for igapy-1.0.1.tar.gz
Algorithm Hash digest
SHA256 af80b9eccdbb4a6e9bb4607c901bc367afe85c016b1f7cd14cede6fe168a7cb9
MD5 b7f20b256284a2f7af73397f6c9fe22f
BLAKE2b-256 57c358bdd473a66b0b54943fad8f3d1d49bc2688ad3e43c887098fc0f3d32a2b

See more details on using hashes here.

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

Hashes for igapy-1.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 bfa1509f6d0a8c8d12ce0beb6f545f183a5bb10637f0c12682f13ab628be65e0
MD5 fe59a14a3215e94c1295bb0e1d7bea08
BLAKE2b-256 cfb27265b6d5708137c225312f57441616cdfdc4fb9c36a98ff613d72b50686c

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page