The hardware and bandwidth for this mirror is donated by dogado GmbH, the Webhosting and Full Service-Cloud Provider. Check out our Wordpress Tutorial.
If you wish to report a bug, or if you are interested in having us mirror your free-software or open-source project, please feel free to contact us at mirror[@]dogado.de.

Getting started with ibkrcp

Overview

ibkrcp provides a lightweight R interface to the Interactive Brokers Client Portal REST API. It covers the four areas you need for programmatic trading:

Prerequisites

ibkrcp communicates with the IBKR Client Portal Gateway — a lightweight Java process that must be running locally and authenticated before any function in this package will work.

Setup steps:

  1. Download the Client Portal Gateway from the IBKR API page

  2. Unzip and start the gateway from a terminal:

    java -jar root/run.jar root/conf.yaml
  3. Open https://localhost:5000 in your browser and log in with your IBKR credentials

  4. Confirm the session is live before making any API calls

The gateway exposes the REST API on https://localhost:5000 and uses a self-signed certificate. ibkrcp disables SSL verification for all requests — this is intentional and necessary for localhost communication.

Sessions time out after approximately 5 minutes without activity. Call ibkr_tickle() regularly to keep the session alive.

Installation

# install.packages("pak")
pak::pak("sactyr/ibkrcp")

A complete trading workflow

The sections below walk through a full end-to-end workflow: starting the session, finding an instrument, fetching price history, and placing an order.

1. Session management

Always start by confirming the gateway is running and authenticated:

library(ibkrcp)

# Verify the session is alive and authenticated — stops with an error if not
ibkr_tickle()

# Check the raw authentication status
ibkr_auth_status()

If the session has timed out but the gateway is still running, re-authenticate without restarting the gateway:

ibkr_reauthenticate()
Sys.sleep(3)       # wait a few seconds for the session to restore
ibkr_tickle()      # confirm it is back

2. Account and portfolio

# List all accounts associated with your login
accounts <- ibkr_get_accounts()
accounts
#>   account_id      type currency           alias
#> 1   U1234567 INDIVIDUAL      AUD Paper Trading

account_id <- accounts$account_id[1]

# High-level portfolio summary: cash, net liquidation, available funds
ibkr_get_summary(account_id)

# Current open positions
positions <- ibkr_get_positions(account_id)
positions
#>       conid symbol position mkt_price mkt_value avg_cost unrealised_pnl currency
#> 1 123456789 VGS.AX      100    120.50     12050   115.00            550      AUD

3. Finding a contract ID

IBKR identifies every instrument by a numeric contract ID (conid). Use ibkr_search_contracts() to find the conid for an ASX-listed ETF:

contracts <- ibkr_search_contracts("VGS")
contracts
#>       conid symbol                                  company_name description company_header
#> 1 123456789    VGS  Vanguard MSCI Index International Shares ETF    ASX:VGS    VGS - ASX

# Filter to ASX listing
conid <- contracts$conid[grepl("ASX", contracts$company_header)]

4. Market data

Price history

# Daily OHLCV bars for the past year
prices <- ibkr_get_price_history(conid, period = "1y")
head(prices)
#>         date   open   high    low  close volume
#> 1 2025-05-01 119.00 121.00 118.50 120.50  50000
#> 2 2025-05-02 120.50 122.00 119.80 121.30  48000

# Available period strings: "1m", "3m", "6m", "1y", "2y", "3y", "5y"
prices_3m <- ibkr_get_price_history(conid, period = "3m")

Trading schedule

Use the trading schedule to distinguish trading days from public holidays before submitting orders:

schedule <- ibkr_get_trading_schedule(symbol = "VGS", exchange = "ASX")
head(schedule)
#>         date is_trading                 sessions
#> 1 2026-05-04       TRUE 100000-160000
#> 2 2026-05-05      FALSE              <NA>

# Trading days only
trading_days <- schedule[schedule$is_trading, "date"]

5. Order management

Placing an order

ibkr_place_order() places a DAY market order and automatically handles any confirmation prompts returned by the API:

ibkr_place_order(
  account_id = account_id,
  conid      = conid,
  side       = "BUY",
  quantity   = 10
)
#> Order placed: BUY 10 shares (conid 123456789) for account U1234567

Inspecting open orders

orders <- ibkr_get_orders()
orders
#>   order_id     conid symbol side order_type quantity    status
#> 1     1001 123456789 VGS.AX  BUY        MKT       10 Submitted

Cancelling an order

ibkr_cancel_order(account_id, order_id = "1001")
#> Order 1001 cancelled for account U1234567

Function reference

Function Description
ibkr_tickle() Confirm session is alive and authenticated
ibkr_auth_status() Get raw authentication status
ibkr_reauthenticate() Request session re-authentication
ibkr_get_accounts() List all accounts
ibkr_get_summary() Portfolio summary for an account
ibkr_get_positions() Open positions for an account
ibkr_search_contracts() Search for contracts by symbol
ibkr_get_price_history() Daily OHLCV price history
ibkr_get_trading_schedule() Exchange trading schedule
ibkr_place_order() Place a market order
ibkr_get_orders() List open orders
ibkr_cancel_order() Cancel an open order

These binaries (installable software) and packages are in development.
They may not be fully stable and should be used with caution. We make no claims about them.
Health stats visible at Monitor.