Skip to main content

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

Project description

igapy – IG API Wrapper

PyPI version Downloads 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.0.tar.gz (24.0 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.0-py3-none-any.whl (19.2 kB view details)

Uploaded Python 3

File details

Details for the file igapy-1.0.0.tar.gz.

File metadata

  • Download URL: igapy-1.0.0.tar.gz
  • Upload date:
  • Size: 24.0 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.0.tar.gz
Algorithm Hash digest
SHA256 c3b08e61934742f9969f000f403181e313bea0b1bbb7bea65d3a8fbda272b70a
MD5 61499828e5e03a65227e7f67a4ca6996
BLAKE2b-256 65246c2c55ba385af8894f6f8e427e84c55761d7ecd4b347d16117bf34a6d965

See more details on using hashes here.

File details

Details for the file igapy-1.0.0-py3-none-any.whl.

File metadata

  • Download URL: igapy-1.0.0-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.0-py3-none-any.whl
Algorithm Hash digest
SHA256 86388b6f6d7c23ff1d10f7ef9bdacc8321fe1b452a5004f1c05067b57a923579
MD5 faf026938210c0006d6fc55ad915eb2c
BLAKE2b-256 00d7bd97faa464f6f8a730c833a0304da712c75d523c209312f8da0c66fe9b7d

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