Skip to main content

⚡ PocketOption API SDK (Unofficial)

PyPI version PyPI - Python Version Downloads License GitHub stars

🌐 Available languages: 🇬🇧 English | 🇷🇺 Русский

Asynchronous Python SDK for interacting with the PocketOption API (unofficial).

Fully type-hinted, built on pydantic, with middleware and event support.

Supports Python 3.13+ and is fully asynchronous (asyncio + aiohttp).

⚠️ Disclaimer

⚠️ This project is not a trading bot.

⚠️ It is not affiliated with PocketOption and is intended for integrations and analytical purposes only.

⚠️ Investing in financial instruments carries risks. Past performance does not guarantee future returns, and asset values may fluctuate due to market conditions and movements in underlying instruments. Any forecasts or illustrations are for informational purposes only and do not constitute guarantees or investment advice. This project is not an invitation or recommendation to invest. Before making investment decisions, consult financial, legal, and tax professionals to determine whether such products suit your goals, risk tolerance, and personal circumstances.

P.S. Their demo mode is surprisingly fun to play around with 😎

🚀 Features

  • 🔌 Connects to PocketOption WebSocket API (via socket.io)

  • 🔐 Session-based authentication

  • 💹 Order and trade management (demo / real account)

  • 📊 Market stream subscriptions

  • 💾 Built-in in-memory storages (MemoryCandleStorage, MemoryDealsStorage)

  • ⚙️ Middleware chain for event and request interception

  • 💬 Event model with decorators (@client.on.*)

  • ✅ Strict type hints

🔑 Getting Session ID and UID

To interact with the API, you need a valid session payload from the browser.

  1. Open Pocket Option in your browser
  2. Open Developer Tools
  3. Go to the Network tab
  4. Filter by WebSocket (WS)
  5. Find a request to {region}...
  6. Fimd message containing 42["auth"
  7. Copy the session and uid

Example:

42["auth",{"session":"abcd1234efgh5678","isDemo":1,"uid":1234589,"platform":1}]

⚙️ Usage Example

import asyncio
import logging
import os
import random

from pocket_option import PocketOptionClient
from pocket_option.constants import Regions
from pocket_option.contrib.default_init import default_init
from pocket_option.models import (
    Asset,
    AuthorizationData,
    DealAction,
    UpdateCloseValueItem,
)

logging.basicConfig(
    level=logging.DEBUG,
    format="%(asctime)s | %(levelname)s | %(message)s",
)

logger = logging.getLogger(__name__)
rng = random.SystemRandom()
client = PocketOptionClient(logger=True)

ASSET = Asset.AUDCAD_otc
TRADE_AMOUNT = 10
EXPIRATION_TIME = 60
CANDLE_PERIOD = 30
OPTION_TYPE = 100
IS_DEMO = 1

default_init(
    client,
    authorization=AuthorizationData.model_validate(
        {
            "session": os.environ["PO_SESSION"],
            "isDemo": IS_DEMO,
            "uid": int(os.environ["PO_UID"]),
            "platform": 2,
            "isFastHistory": True,
            "isOptimized": True,
        },
    ),
    sub_assets=[ASSET],
    sub_period=CANDLE_PERIOD,
)


@client.on.update_close_value
async def on_update_close_value(
    assets: list[UpdateCloseValueItem],
):
    logger.debug("Assets updated: %s", assets)


def get_signal() -> DealAction | None:
    return rng.choice(
        [
            DealAction.CALL,
            DealAction.PUT,
            None,
        ],
    )


async def execute_trade(direction: DealAction):
    logger.info(
        "Opening %s trade",
        direction.name,
    )
    deal = await client.deals.open_deal(
        asset=ASSET,
        amount=TRADE_AMOUNT,
        action=direction,
        is_demo=IS_DEMO,
        option_type=OPTION_TYPE,
        time=EXPIRATION_TIME,
    )
    logger.info(
        "Deal opened: %s",
        deal,
    )
    result = await client.deals.check_deal_result(
        wait_time=EXPIRATION_TIME + 5,
        deal=deal,
    )
    logger.info(
        "Deal result: %s",
        result,
    )


async def trader_loop():
    await client.authorized_event.wait()
    logger.info("Trader started")
    while True:
        try:
            signal = get_signal()
            if signal is None:
                await asyncio.sleep(5)
                continue
            await execute_trade(signal)
            await asyncio.sleep(5)
        except Exception:
            logger.exception("Trading error")
            await asyncio.sleep(10)


async def main():
    try:
        await client.connect(Regions.DEMO)
        await trader_loop()
    except KeyboardInterrupt:
        logger.info("Stopping...")
    finally:
        await client.disconnect()


if __name__ == "__main__":
    asyncio.run(main())

📤 Available emit events

Method Event Category Description
client.emit.ai_strategy_multi_get_state ai-strategy-multi/get-state ai Get AI strategy state.
client.emit.change_asset changeSymbol assets Changes the active trading asset and timeframe.
client.emit.subscribe_for_market_sentiment subfor assets Subscribes to market sentiment updates for an asset.
client.emit.subscribe_to_asset subscribeSymbol assets Subscribes to real-time updates for a trading asset.
client.emit.unsubscribe_for_market_sentiment unsubfor assets Removes market sentiment subscription for an asset.
client.emit.unsubscribe_from_asset unSubscribeSymbol assets Unsubscribes from real-time updates for a trading asset.
client.emit.auth auth common Authorizes the client session.
client.emit.demo_refill_balance td/refill common Refill demo account balance.
client.emit.load_history_period loadHistoryPeriod common Requests historical market data for a specific period.
client.emit.ps ps common Sends a heartbeat request to keep the connection alive.
client.emit.update_balance updateBalance common Request balance update.
client.emit.copy_signal copySignalOrder deals Creates a deal from a copy trading signal.
client.emit.deals_ai deals/ai deals AI deal operation.
client.emit.deals_copy copyorder deals Copy existing order
client.emit.deals_double_up deals/double-up deals Double existing deal.
client.emit.deals_open openOrder deals Creates a new trading deal.
client.emit.deals_pending_cancel cancelPendingOrder deals Cancel pending order.
client.emit.deals_pending_open openPendingOrder deals Create pending order.
client.emit.deals_rollover deals/rollover deals Rollover existing deal.
client.emit.deals_update_opened updateOpenedDeals deals -
client.emit.social_disable_only_watched social/disable-only-watched deals Disable watched filter.
client.emit.social_enable_only_watched social/enable-only-watched deals Enable watched filter.
client.emit.update_closed_expresses updateClosedExpresses deals -
client.emit.indicator_load indicator/load indicator Indicates that indicator data has been loaded by the platform.
client.emit.signals_subscribe signals/subscribe signals -
client.emit.signals_unsubscribe signals/unsubscribe signals -
client.emit.favorite_load favorite/load ui Indicates that favorite has been loaded by the platform.
client.emit.price_alert_load price-alert/load ui Indicates that price alert data has been loaded by the platform.

📥 Available on events

Method Event Category Description
client.on.ai_strategy_multi_get_state ai-strategy-multi/get-state ai Get AI strategy state.
client.on.change_asset changeSymbol assets Changes the active trading asset and timeframe.
client.on.subscribe_for_market_sentiment subfor assets Subscribes to market sentiment updates for an asset.
client.on.subscribe_to_asset subscribeSymbol assets Subscribes to real-time updates for a trading asset.
client.on.unsubscribe_for_market_sentiment unsubfor assets Removes market sentiment subscription for an asset.
client.on.unsubscribe_from_asset unSubscribeSymbol assets Unsubscribes from real-time updates for a trading asset.
client.on.auth auth common Authorizes the client session.
client.on.demo_refill_balance td/refill common Refill demo account balance.
client.on.load_history_period loadHistoryPeriod common Requests historical market data for a specific period.
client.on.ps ps common Sends a heartbeat request to keep the connection alive.
client.on.update_balance updateBalance common Request balance update.
client.on.copy_signal copySignalOrder deals Creates a deal from a copy trading signal.
client.on.deals_ai deals/ai deals AI deal operation.
client.on.deals_copy copyorder deals Copy existing order
client.on.deals_double_up deals/double-up deals Double existing deal.
client.on.deals_open openOrder deals Creates a new trading deal.
client.on.deals_pending_cancel cancelPendingOrder deals Cancel pending order.
client.on.deals_pending_open openPendingOrder deals Create pending order.
client.on.deals_rollover deals/rollover deals Rollover existing deal.
client.on.deals_update_opened updateOpenedDeals deals -
client.on.social_disable_only_watched social/disable-only-watched deals Disable watched filter.
client.on.social_enable_only_watched social/enable-only-watched deals Enable watched filter.
client.on.update_closed_expresses updateClosedExpresses deals -
client.on.indicator_load indicator/load indicator Indicates that indicator data has been loaded by the platform.
client.on.signals_subscribe signals/subscribe signals -
client.on.signals_unsubscribe signals/unsubscribe signals -
client.on.favorite_load favorite/load ui Indicates that favorite has been loaded by the platform.
client.on.price_alert_load price-alert/load ui Indicates that price alert data has been loaded by the platform.

📜 License

MIT License — do whatever you want, but at your own risk.

Download files

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

Source Distribution

pocket_option-0.3.0.tar.gz (29.4 kB view details)

Uploaded Source

Built Distribution

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

pocket_option-0.3.0-py3-none-any.whl (32.0 kB view details)

Uploaded Python 3

File details

Details for the file pocket_option-0.3.0.tar.gz.

File metadata

  • Download URL: pocket_option-0.3.0.tar.gz
  • Upload date:
  • Size: 29.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for pocket_option-0.3.0.tar.gz
Algorithm Hash digest
SHA256 efbfabb1e2f83688c3cf0eeaf45a7fd48a4a85ec7aaf5c1b9c37a87da1566e02
MD5 249d38cf42d72c4553ad77ba2aaf0320
BLAKE2b-256 2b37edb6aada94b6b6d18194e1c9ec3ab923c2492e4febbe522e77cd296ce19c

See more details on using hashes here.

Provenance

The following attestation bundles were made for pocket_option-0.3.0.tar.gz:

Publisher: release.yml on lordralinc/pocket_option

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pocket_option-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: pocket_option-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 32.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for pocket_option-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 afcdf14afd2b7cb3a958caddfc92d04d016fae1de1ae4c7239c4eb2169e62f82
MD5 2d2b02697eacdd082e33577833f528e5
BLAKE2b-256 5a8265a121409b2b7d4394064a862707b53d291d881a9fb71cc5eb2eee6fd6d7

See more details on using hashes here.

Provenance

The following attestation bundles were made for pocket_option-0.3.0-py3-none-any.whl:

Publisher: release.yml on lordralinc/pocket_option

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

0.4.0

2 files

This release

0.3.0 This release

2 files

0.2.9

2 files

0.2.8

2 files

0.2.7

2 files

0.2.6

2 files

0.1.6

2 files

0.1.5

2 files

0.1.4

2 files

0.1.3

2 files

0.1.2

2 files

0.1.1

2 files

0.1.0

2 files

Supported by

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