API coverage

June 14, 2026 · View on GitHub

How capctl commands map to the Capital.com Open API. "Covered" means a command issues the request and surfaces the response (via tables or --json).

General & session

EndpointCommandStatus
GET /timesession timeCovered
GET /pingsession pingCovered
GET /sessionsession detailsCovered
GET /session/encryptionKeysession encryption-keyCovered (key fetch; encrypted-password login flow not used)
POST /sessionsession loginCovered
PUT /sessionsession switchCovered
DELETE /sessionsession logoutCovered

Accounts

EndpointCommandStatus
GET /accountsaccount listCovered
GET /accounts/preferencesaccount prefs-getCovered
PUT /accounts/preferencesaccount prefs-set (--hedging, --leverage)Covered
GET /history/activityaccount history-activityCovered
GET /history/transactionsaccount history-transactionsCovered
POST /accounts/topUpaccount topupCovered (demo only)

Markets

EndpointCommandStatus
GET /marketsmarket searchCovered
GET /markets/{epic}market getCovered
GET /marketnavigationmarket nav-rootCovered
GET /marketnavigation/{id}market nav-nodeCovered
GET /prices/{epic}market pricesCovered
GET /clientsentimentmarket sentiment A,BCovered (batch)
GET /clientsentiment/{id}market sentiment ACovered

Trading

EndpointCommandStatus
GET /positionstrade positionsCovered
GET /positions/{dealId}trade positionCovered
POST /positionstrade preview-positiontrade execute-positionCovered
PUT /positions/{dealId}trade amend-positionCovered
DELETE /positions/{dealId}trade closeCovered
GET /workingorderstrade ordersCovered
POST /workingorderstrade preview-ordertrade execute-orderCovered
PUT /workingorders/{dealId}trade amend-orderCovered
DELETE /workingorders/{dealId}trade cancelCovered
GET /confirms/{dealReference}trade confirmCovered

Watchlists

EndpointCommandStatus
GET /watchlistswatchlist listCovered
POST /watchlistswatchlist createCovered
GET /watchlists/{id}watchlist getCovered
PUT /watchlists/{id}watchlist addCovered
DELETE /watchlists/{id}watchlist deleteCovered
DELETE /watchlists/{id}/{epic}watchlist removeCovered

Streaming (WebSocket)

DestinationCommandStatus
marketData.subscribe (quotes)stream prices, stream alerts, stream portfolioCovered
OHLCMarketData.subscribe (candles)stream candlesCovered
ping (keep-alive)(internal)Covered

Verified coverage. Every endpoint below is exercised by automated tests on the real demo API across four cells — CLI positive, CLI negative, SDK positive, SDK negative — generated from tests/e2e/endpoints.py (regenerate with make coverage-doc). Both the CLI and the SDK cover the full Open API surface; the only surface not exposed as a command is the RSA encrypted-password login flow (the CLI uses the standard credential login). See the matrix at the bottom of this file.

Test matrix

EndpointHTTP / WSCLI +CLI −SDK +SDK −
session.timeGET /timetestedtestedtestedtested
session.pingGET /pingtestedtestedtestedtested
session.detailsGET /sessiontestedtestedtestedtested
session.encryption_keyGET /session/encryptionKeytestedtestedtestedtested
session.loginPOST /sessiontestedtestedtestedtested
session.switchPUT /sessiontestedtestedtestedtested
session.logoutDELETE /sessiontestedtestedtestedtested
account.listGET /accountstestedtestedtestedtested
account.prefs_getGET /accounts/preferencestestedtestedtestedtested
account.prefs_setPUT /accounts/preferencestestedtestedtestedtested
account.history_activityGET /history/activitytestedtestedtestedtested
account.history_transactionsGET /history/transactionstestedtestedtestedtested
account.topupPOST /accounts/topUptestedtestedtestedtested
market.searchGET /marketstestedtestedtestedtested
market.getGET /markets/{epic}testedtestedtestedtested
market.nav_rootGET /marketnavigationtestedtestedtestedtested
market.nav_nodeGET /marketnavigation/{id}testedtestedtestedtested
market.pricesGET /prices/{epic}testedtestedtestedtested
market.sentimentGET /clientsentimenttestedtestedtestedtested
position.listGET /positionstestedtestedtestedtested
position.getGET /positions/{dealId}testedtestedtestedtested
position.preview(local)testedtestedtestedtested
position.executePOST /positionstestedtestedtestedtested
position.amendPUT /positions/{dealId}testedtestedtestedtested
position.closeDELETE /positions/{dealId}testedtestedtestedtested
order.listGET /workingorderstestedtestedtestedtested
order.preview(local)testedtestedtestedtested
order.executePOST /workingorderstestedtestedtestedtested
order.amendPUT /workingorders/{dealId}testedtestedtestedtested
order.cancelDELETE /workingorders/{dealId}testedtestedtestedtested
trade.confirmGET /confirms/{dealRef}testedtestedtestedtested
watchlist.listGET /watchliststestedtestedtestedtested
watchlist.createPOST /watchliststestedtestedtestedtested
watchlist.getGET /watchlists/{id}testedtestedtestedtested
watchlist.addPUT /watchlists/{id}testedtestedtestedtested
watchlist.removeDELETE /watchlists/{id}/{epic}testedtestedtestedtested
watchlist.deleteDELETE /watchlists/{id}testedtestedtestedtested
stream.pricesWS marketData.subscribetestedtestedtestedtested
stream.candlesWS OHLCMarketData.subscribetestedtestedtestedtested
stream.alertsWS quotes (level cross)testedtestedtestedtested
stream.portfolioWS quotes (position epics)testedtestedtestedtested

Coverage: 164/164 applicable cells tested (100%) across 41 endpoints — CLI and SDK, positive and negative.