mcpField
T
trading212-api

trading212-api

github.com/trading212-labsその他137426 回インストール7 週間前に更新
リポジトリ

trading212-api について

trading212-api は、エージェントが Trading 212 API を利用するためのスキルです。認証、口座の選択、環境、API リクエストを扱い、DEMO と LIVE の違いや口座・注文操作を説明します。API はベータ版であることも明記しています。

主な機能

  1. 01HTTP Basic 認証のガイド
  2. 02DEMO と LIVE 環境の選択
  3. 03Invest・Stocks ISA 口座の扱い
  4. 04口座サマリーと注文 API の案内
  5. 05ティッカー検索とリクエスト規則

活用シーン

  1. 01Trading 212 口座情報の確認
  2. 02適切な口座と環境の選択
  3. 03取引操作の API リクエスト

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/trading212-labs/agent-skills --skill trading212-api

インストール後、Claude Code で/trading212-apiを入力して読み込まれたか確認します。

詳細

Trading 212 API

Note: Trading 212 API は現在 ベータ版 で、開発が活発に進められています。一部のエンドポイントや動作が変更される場合があります。

クイックリファレンス

環境
環境ベース URL用途
デモhttps://demo.trading212.com/api/v0ペーパートレード — 実際の資金を使わないテスト
ライブhttps://live.trading212.com/api/v0実際の資金を使った取引
注文数量の規則
  • 正の数量 = BUY(例:10 は 10 株を購入します)
  • 負の数量 = SELL(例:-10 は 10 株を売却します)
口座タイプ

Invest と Stocks ISA の口座のみがサポートされています。

商品識別子

Trading 212 では、商品を一意に識別するために独自のティッカーを使用します。 商品リクエストを行う前に、必ず Trading 212 のティッカーを検索してください。


認証

API キー(ユーザー名)と API シークレット(パスワード)を使用した HTTP Basic 認証です。

まず既存の設定を確認する

ユーザーに認証設定を案内する前に、認証情報がすでに設定されているか確認してください。

意味上のルール: 認証情報は、少なくとも 1 組の完全なセットが存在する場合に設定済みとみなします。完全なセットとは、同じ口座に対応するキーとシークレットの組み合わせです(例:T212_API_KEY + T212_API_SECRET、T212_API_KEY_INVEST + T212_API_SECRET_INVEST、または T212_API_KEY_STOCKS_ISA + T212_API_SECRET_STOCKS_ISA)。口座別の変数が 4 つすべて必要なわけではありません。Invest のペアのみ、または Stocks ISA のペアのみでも十分です。使用可能なキーとシークレットのペアが少なくとも 1 組になる、あらゆる組み合わせを確認してください。

# Example: configured if any complete credential set exists
if [ -n "$T212_AUTH_HEADER" ] && [ -n "$T212_BASE_URL" ]; then
  echo "Configured (derived vars)"
elif [ -n "$T212_API_KEY" ] && [ -n "$T212_API_SECRET" ]; then
  echo "Configured (single account)"
elif [ -n "$T212_API_KEY_INVEST" ] && [ -n "$T212_API_SECRET_INVEST" ]; then
  echo "Configured (Invest); Stocks ISA also if T212_API_KEY_STOCKS_ISA and T212_API_SECRET_STOCKS_ISA are set"
elif [ -n "$T212_API_KEY_STOCKS_ISA" ] && [ -n "$T212_API_SECRET_STOCKS_ISA" ]; then
  echo "Configured (Stocks ISA); Invest also if T212_API_KEY_INVEST and T212_API_SECRET_INVEST are set"
else
  echo "No complete credential set found"
fi

完全なセットが 1 組でも存在する場合は、全設定手順を省略して API 呼び出しに進みます。リクエストを行う際は、以下の「リクエストの実行」に記載された解決順序を使用してください(複数のセットがある場合は、ユーザーの口座状況に合ったペアを選択します)。導出用のワンライナーを実行したり、キーをヘッダーにまとめたりするようユーザーに依頼しないでください。完全な認証情報セットが存在しない場合に限り、以下の全設定手順を案内してください。

重要: API 呼び出しを行う前に、必ずどの環境を使用するかユーザーに確認してください。LIVE(実際の資金を使用)か DEMO(ペーパートレード)かを確認します。環境を決めつけないでください。

API キーは環境ごとに異なります

API キーは特定の環境に紐づいており、環境をまたいで使用することはできません。

API キーの作成環境使用できる環境使用できない環境
LIVE 口座live.trading212.comdemo.trading212.com
DEMO 口座demo.trading212.comlive.trading212.com

401 エラーが発生した場合は、以下を確認してください。

  1. 対象の環境に対応する API キーを使用していること
  2. アクセスしようとしている環境と同じ環境(LIVE または DEMO)で API キーが生成されていること
認証情報を取得する
  1. 使用する環境を決めます — LIVE(実際の資金を使用)または DEMO(ペーパートレード)
  2. Trading 212 アプリ(モバイルまたはウェブ)を開きます
  3. 正しい口座に切り替えます — 対象の環境に合わせて、LIVE モードまたは DEMO モードになっていることを確認してください
  4. Settings > API に移動します
  5. 新しい API キーのペアを生成します。次の情報を受け取ります。
    • API Key (ID)(例:35839398ZFVKUxpHzPiVsxKdOtZdaDJSrvyPF)
    • API Secret(例:7MOzYJlVJgxoPjdZJCEH3fO9ee7A0NzLylFFD4-3tlo)
  6. 両方の環境を使用する場合は、環境ごとに認証情報を分けて保存します
認証ヘッダーを作成する

API キー(ID)とシークレットをコロンで連結し、Base64 エンコードして、Authorization ヘッダー用に Basic を先頭に付けます。

任意: キーとシークレットからヘッダーを事前に計算するには、次のように設定できます。

export T212_AUTH_HEADER="Basic $(echo -n "$T212_API_KEY:$T212_API_SECRET" | base64 -w 0)"

それ以外の場合、リクエスト時にエージェントが T212_API_KEY と T212_API_SECRET からヘッダーを作成します。

手動(プレースホルダー):

# Format: T212_AUTH_HEADER = "Basic " + base64(API_KEY_ID:API_SECRET)
export T212_AUTH_HEADER="Basic $(echo -n "<YOUR_API_KEY_ID>:<YOUR_API_SECRET>" | base64 -w 0)"

# Example with sample credentials:
export T212_AUTH_HEADER="Basic $(echo -n "35839398ZFVKUxpHzPiVsxKdOtZdaDJSrvyPF:7MOzYJlVJgxoPjdZJCEH3fO9ee7A0NzLylFFD4-3tlo" | base64 -w 0)"
リクエストの作成

API 呼び出しを行うときは、該当する最初の選択肢を使用します(意味的には、ユーザーのアカウントに合った認証情報のセット、または設定されている唯一のセットを選びます)。

  • T212_AUTH_HEADER と T212_BASE_URL が設定されている場合: リクエストでこれらを使用します。
  • それ以外で、T212_API_KEY と T212_API_SECRET が設定されている場合: このペアを使用します(単一アカウント)。ヘッダーは Basic $(echo -n "$T212_API_KEY:$T212_API_SECRET" | base64 -w 0)、ベース URL は https://${T212_ENV:-live}.trading212.com として構築します。ユーザーに導出や統合を案内せず、こちらで行います。
  • それ以外で、アカウント固有のペアが両方設定されている場合(T212_API_KEY_INVEST/T212_API_SECRET_INVEST と T212_API_KEY_STOCKS_ISA/T212_API_SECRET_STOCKS_ISA):ユーザーがすべてのアカウントの情報を求めている場合を除き、対象アカウント(Invest または Stocks ISA)を明確に指定する必要があります。ユーザーが Invest に言及した場合は Invest のペアを使用し、ISA/Stocks ISA に言及した場合は Stocks ISA のペアを使用します。ユーザーがすべてのアカウントの情報を求めている場合は、アカウントごと(Invest と Stocks ISA)に複数の API 呼び出しを行い、両方の結果を提示または集約します。コンテキストから使用するアカウントが明らかでない場合(かつ、すべてのアカウントを求めていない場合)は、API 呼び出しを行う前に確認します(例:「どのアカウントを使用しますか?— Invest または Stocks ISA」)。推測してはいけません。選択したキーとシークレットからヘッダーを構築し、ベース URL は https://${T212_ENV:-live}.trading212.com とします。
  • それ以外で、Invest のペア(T212_API_KEY_INVEST と T212_API_SECRET_INVEST)のみが設定されている場合: リクエストにはこのペアを使用します。ユーザーが Stocks ISA について尋ねた場合は、Invest アカウントのみが設定されていることを伝えます。
  • それ以外で、Stocks ISA のペア(T212_API_KEY_STOCKS_ISA と T212_API_SECRET_STOCKS_ISA)のみが設定されている場合: リクエストにはこのペアを使用します。ユーザーが Invest について尋ねた場合は、Stocks ISA アカウントのみが設定されていることを伝えます。

T212_AUTH_HEADER が設定されている場合は、その値を Authorization ヘッダーで使用します。

# When T212_AUTH_HEADER and T212_BASE_URL are set:
curl -H "Authorization: $T212_AUTH_HEADER" \
  "${T212_BASE_URL}/api/v0/equity/account/summary"

プライマリ変数のみが設定されている場合は、curl でインライン形式を使用します。

# When only T212_API_KEY, T212_API_SECRET, T212_ENV are set:
curl -H "Authorization: Basic $(echo -n "$T212_API_KEY:$T212_API_SECRET" | base64 -w 0)" \
  "https://${T212_ENV:-live}.trading212.com/api/v0/equity/account/summary"

警告: T212_AUTH_HEADER には、Basic のプレフィックスを含む完全なヘッダー値を設定する必要があります。

# WRONG - "Basic " のプレフィックスがない、base64 の生データ
curl -H "Authorization: <base64-only>" ...  # これは動作しません!

# CORRECT - T212_AUTH_HEADER を使用("Basic <base64>" を含む)
curl -H "Authorization: $T212_AUTH_HEADER" ...  # これは動作します
環境変数

単一アカウントとすべてのアカウント: API キーは単一アカウント用です。1 組のキーとシークレット(T212_API_KEY + T212_API_SECRET)は、1 つのアカウント(Invest または Stocks ISA)に対応します。すべてのアカウント(Invest と Stocks ISA)を使用するには、ユーザーはキーとシークレットを 2 組設定する必要があります。T212_API_KEY_INVEST / T212_API_SECRET_INVEST と T212_API_KEY_STOCKS_ISA / T212_API_SECRET_STOCKS_ISA です。両方のペアが設定されている場合、ユーザーは対象アカウントを明確に指定する必要があります。コンテキストから明らかでない場合は、API 呼び出しを行う前に確認します(Invest または Stocks ISA)。

プライマリ(単一アカウント): プラグインの README と一貫性のある設定にするには、次を設定します。

export T212_API_KEY="your-api-key"       # API Key (ID) from Trading 212
export T212_API_SECRET="your-api-secret"
export T212_ENV="demo"                   # or "live" (defaults to "live" if unset)

アカウント固有(Invest および/または Stocks ISA): 使用するペアのみを設定します。同じアカウントのキーとシークレットがそろったセットが 1 組あれば十分です。たとえば、Invest のみの場合:

export T212_API_KEY_INVEST="your-invest-api-key"
export T212_API_SECRET_INVEST="your-invest-api-secret"
export T212_ENV="demo"                   # or "live"

両方のアカウントを使用する場合は、両方のペアを設定します。

export T212_API_KEY_INVEST="your-invest-api-key"
export T212_API_SECRET_INVEST="your-invest-api-secret"
export T212_API_KEY_STOCKS_ISA="your-stocks-isa-api-key"
export T212_API_SECRET_STOCKS_ISA="your-stocks-isa-api-secret"
export T212_ENV="demo"                   # or "live" (applies to both)

オプション — 事前計算済み(スクリプト用、またはユーザーが希望する場合): プライマリ変数から認証ヘッダーとベース URL を設定できますが、必須ではありません。これらが設定されていない場合、API 呼び出し時にエージェントがプライマリ変数からヘッダーとベース URL を構築する必要があります。

# Build auth header and base URL from T212_API_KEY, T212_API_SECRET, T212_ENV
export T212_AUTH_HEADER="Basic $(echo -n "$T212_API_KEY:$T212_API_SECRET" | base64 -w 0)"
export T212_BASE_URL="https://${T212_ENV:-live}.trading212.com"

代替手段(手動): キーとシークレットを環境変数に保存したくない場合は、導出した変数を直接設定します。API キーは、それに対応する環境でのみ動作することに注意してください。

# For DEMO (paper trading)
export T212_AUTH_HEADER="Basic $(echo -n "<DEMO_API_KEY_ID>:<DEMO_API_SECRET>" | base64 -w 0)"
export T212_BASE_URL="https://demo.trading212.com"

# For LIVE (real money) - generate separate credentials in LIVE account
# export T212_AUTH_HEADER="Basic $(echo -n "<LIVE_API_KEY_ID>:<LIVE_API_SECRET>" | base64 -w 0)"
# export T212_BASE_URL="https://live.trading212.com"

ヒント: 両方の環境を使用する場合は、変数名を分けてください。

# Demo credentials
export T212_DEMO_AUTH_HEADER="Basic $(echo -n "<DEMO_KEY_ID>:<DEMO_SECRET>" | base64 -w 0)"

# Live credentials
export T212_LIVE_AUTH_HEADER="Basic $(echo -n "<LIVE_KEY_ID>:<LIVE_SECRET>" | base64 -w 0)"
一般的な認証エラー
コード原因解決方法
401認証情報が無効ですAPI キー/シークレットを確認し、余分な空白がないことを確認してください
401環境の不一致LIVE API キーは DEMO では使用できず、その逆も同様です - キーが対象の環境と一致していることを確認してください
403権限がありませんTrading 212 の設定で API 権限を確認してください
408リクエストがタイムアウトしましたリクエストを再試行してください
429レート制限を超過しましたx-ratelimit-reset のタイムスタンプまで待機してください

アカウント

アカウント概要の取得

GET /api/v0/equity/account/summary (1 req/5s)

curl -H "Authorization: $T212_AUTH_HEADER" \
  "$T212_BASE_URL/api/v0/equity/account/summary"

レスポンススキーマ:

{
  "id": 12345678,
  "currency": "GBP",
  "totalValue": 15250.75,
  "cash": {
    "availableToTrade": 2500.5,
    "reservedForOrders": 150.0,
    "inPies": 500.0
  },
  "investments": {
    "currentValue": 12100.25,
    "totalCost": 10500.0,
    "realizedProfitLoss": 850.5,
    "unrealizedProfitLoss": 1600.25
  }
}
アカウントのフィールド
フィールド型説明
idinteger取引口座の主番号
currencystring口座の基準通貨(ISO 4217)
totalValuenumber基準通貨での口座総額
cash.availableToTradenumber投資に利用可能な資金
cash.reservedForOrdersnumber保留中の注文用に確保された現金
cash.inPiesnumberPies 内の未投資現金
investments.currentValuenumberすべての投資の現在価値
investments.totalCostnumber現在の投資の取得原価
investments.realizedProfitLossnumberこれまでに確定した損益
investments.unrealizedProfitLossnumber今売却した場合の含み損益

注文

注文タイプ
タイプエンドポイント利用可否説明
成行/api/v0/equity/orders/marketDemo + Live最良価格ですぐに執行します
指値/api/v0/equity/orders/limitDemo + Live指値またはそれより有利な価格で執行します
逆指値/api/v0/equity/orders/stopDemo + Live逆指値価格に達したときに成行注文を行います
逆指値指値/api/v0/equity/orders/stop_limitDemo + Live逆指値価格に達したときに指値注文を行います
注文ステータス
ステータス説明
LOCAL注文はローカルで作成され、まだ送信されていません
UNCONFIRMED取引所に送信済みで、確認待ちです
CONFIRMED取引所によって確認済みです
NEW有効で、執行待ちです
CANCELLINGキャンセルリクエストの処理中です
CANCELLEDキャンセルが完了しました
PARTIALLY_FILLED一部の株式が約定しました
FILLED全量が約定しました
REJECTED取引所によって拒否されました
REPLACING変更処理中です
REPLACED変更が完了しました
有効期間
値説明
DAY取引所のタイムゾーンで午前0時に期限切れになります
GOOD_TILL_CANCEL約定またはキャンセルされるまで有効です(デフォルト)
注文戦略
値説明
QUANTITY株数を指定して注文します(API 対応)
VALUE金額を指定して注文します(API では未対応)
注文の開始元
値説明
APIこの API 経由で発注
IOSiOS アプリ
ANDROIDAndroid アプリ
WEBWeb プラットフォーム
SYSTEMシステムによる生成
AUTOINVEST自動投資機能
成行注文を発注

POST /api/v0/equity/orders/market (50 req/min)

# Buy 5 shares
curl -X POST -H "Authorization: $T212_AUTH_HEADER" \
  -H "Content-Type: application/json" \
  "$T212_BASE_URL/api/v0/equity/orders/market" \
  -d '{"ticker": "AAPL_US_EQ", "quantity": 5}'

# Sell 3 shares (negative quantity)
curl -X POST -H "Authorization: $T212_AUTH_HEADER" \
  -H "Content-Type: application/json" \
  "$T212_BASE_URL/api/v0/equity/orders/market" \
  -d '{"ticker": "AAPL_US_EQ", "quantity": -3}'

# Buy with extended hours enabled
curl -X POST -H "Authorization: $T212_AUTH_HEADER" \
  -H "Content-Type: application/json" \
  "$T212_BASE_URL/api/v0/equity/orders/market" \
  -d '{"ticker": "AAPL_US_EQ", "quantity": 5, "extendedHours": true}'

リクエストフィールド:

フィールド型必須説明
tickerstringはい金融商品のティッカー(例:AAPL_US_EQ)
quantitynumberはい買いの場合は正の値、売りの場合は負の値
extendedHoursbooleanいいえ市場前(4:00~9:30 ET)および時間外(16:00~20:00 ET)の取引セッションでの約定を許可するには、true に設定します。デフォルト:false

レスポンス:

{
  "id": 123456789,
  "type": "MARKET",
  "ticker": "AAPL_US_EQ",
  "instrument": {
    "ticker": "AAPL_US_EQ",
    "name": "Apple Inc",
    "isin": "US0378331005",
    "currency": "USD"
  },
  "quantity": 5,
  "filledQuantity": 0,
  "status": "NEW",
  "side": "BUY",
  "strategy": "QUANTITY",
  "initiatedFrom": "API",
  "extendedHours": false,
  "createdAt": "2024-01-15T10:30:00Z"
}
指値注文を発注

POST /api/v0/equity/orders/limit (1 req/2s)

curl -X POST -H "Authorization: $T212_AUTH_HEADER" \
  -H "Content-Type: application/json" \
  "$T212_BASE_URL/api/v0/equity/orders/limit" \
  -d '{"ticker": "AAPL_US_EQ", "quantity": 5, "limitPrice": 150.00, "timeValidity": "DAY"}'

リクエストフィールド:

フィールド型必須説明
tickerstringはい金融商品のティッカー
quantitynumberはい買いの場合は正の値、売りの場合は負の値
limitPricenumberはい買いの場合は上限価格、売りの場合は下限価格
timeValiditystringいいえDAY(デフォルト)または GOOD_TILL_CANCEL
逆指値注文を発注

POST /api/v0/equity/orders/stop (1 req/2s)

curl -X POST -H "Authorization: $T212_AUTH_HEADER" \
  -H "Content-Type: application/json" \
  "$T212_BASE_URL/api/v0/equity/orders/stop" \
  -d '{"ticker": "AAPL_US_EQ", "quantity": -5, "stopPrice": 140.00, "timeValidity": "GOOD_TILL_CANCEL"}'

リクエストフィールド:

フィールド型必須説明
tickerstringはい金融商品のティッカー
quantitynumberはい買いの場合は正の値、売りの場合は負の値
stopPricenumberはいトリガー価格(最終取引価格に基づく)
timeValiditystringいいえDAY(デフォルト)または GOOD_TILL_CANCEL
逆指値付き指値注文を発注

POST /api/v0/equity/orders/stop_limit (1 req/2s)

curl -X POST -H "Authorization: $T212_AUTH_HEADER" \
  -H "Content-Type: application/json" \
  "$T212_BASE_URL/api/v0/equity/orders/stop_limit" \
  -d '{"ticker": "AAPL_US_EQ", "quantity": -5, "stopPrice": 145.00, "limitPrice": 140.00, "timeValidity": "DAY"}'

リクエストフィールド:

フィールド型必須説明
tickerstringはい金融商品のティッカー
quantitynumberはい買いの場合は正の値、売りの場合は負の値
stopPricenumberはい指値注文を有効にするトリガー価格
limitPricenumberはい発生する注文の指値価格
timeValiditystringいいえDAY(デフォルト)または GOOD_TILL_CANCEL
未約定注文を取得

GET /api/v0/equity/orders (1 req/5s)

curl -H "Authorization: $T212_AUTH_HEADER" \
  "$T212_BASE_URL/api/v0/equity/orders"

ステータスが NEW、PARTIALLY_FILLED などの Order オブジェクトの配列を返します。

ID で注文を取得

GET /api/v0/equity/orders/{id} (1 req/1s)

curl -H "Authorization: $T212_AUTH_HEADER" \
  "$T212_BASE_URL/api/v0/equity/orders/123456789"
注文をキャンセル

DELETE /api/v0/equity/orders/{id} (50 req/min)

curl -X DELETE -H "Authorization: $T212_AUTH_HEADER" \
  "$T212_BASE_URL/api/v0/equity/orders/123456789"

キャンセルリクエストが受け付けられると、200 OK を返します。注文はすでに約定している場合があります。

よくある注文エラー
エラー原因解決策
InsufficientFreeForStocksBuy現金が不足していますcash.availableToTrade を確認します
SellingEquityNotOwned保有数を超えて売却していますquantityAvailableForTrading を確認します
MarketClosed取引時間外です取引所のスケジュールを確認します

ポジション

すべてのポジションを取得する

GET /api/v0/equity/positions (1 req/1s)

クエリパラメーター:

パラメーター型必須説明
tickerstringいいえ特定のティッカーで絞り込みます(例:AAPL_US_EQ)
# All positions
curl -H "Authorization: $T212_AUTH_HEADER" \
  "$T212_BASE_URL/api/v0/equity/positions"

# Filter by ticker
curl -H "Authorization: $T212_AUTH_HEADER" \
  "$T212_BASE_URL/api/v0/equity/positions?ticker=AAPL_US_EQ"

レスポンススキーマ:

[
  {
    "instrument": {
      "ticker": "AAPL_US_EQ",
      "name": "Apple Inc",
      "isin": "US0378331005",
      "currency": "USD"
    },
    "quantity": 15.5,
    "quantityAvailableForTrading": 12.5,
    "quantityInPies": 3,
    "currentPrice": 185.5,
    "averagePricePaid": 170.25,
    "createdAt": "2024-01-10T09:15:00Z",
    "walletImpact": {
      "currency": "GBP",
      "totalCost": 2089.45,
      "currentValue": 2275.1,
      "unrealizedProfitLoss": 185.65,
      "fxImpact": 12.3
    }
  }
]
ポジションのフィールド
フィールド型説明
quantitynumber保有している株式の合計数
quantityAvailableForTradingnumber売却可能な株式数
quantityInPiesnumberpies に割り当てられた株式数
currentPricenumber現在価格(金融商品の通貨)
averagePricePaidnumber1 株あたりの平均取得価格
createdAtdatetimeポジションの開始日
walletImpact.currencystring口座の通貨
walletImpact.totalCostnumber口座通貨での合計コスト
walletImpact.currentValuenumber口座通貨での現在価値
walletImpact.unrealizedProfitLossnumber口座通貨での損益
walletImpact.fxImpactnumber為替レートが価値に与える影響
ポジション数量のシナリオ
シナリオquantityquantityAvailableForTradingquantityInPies
すべて直接保有10100
一部が pie に割り当て1073
すべて pie に割り当て10010

重要: 売却注文を出す前に、必ず quantityAvailableForTrading を確認してください。


金融商品

ティッカー検索ワークフロー

ユーザーが一般的な名称(例:「SAP」、「Apple」、「AAPL」)で金融商品を指定した場合、注文、ポジション、または過去のデータを問い合わせる前に、必ず正確な Trading 212 のティッカーを検索してください。ティッカー形式を手動で組み立てないでください。

キャッシュを最初に確認: API を呼び出す前に、必ず /tmp/t212_instruments.json を確認してください。金融商品エンドポイントには 50 秒のレート制限があり、約 5MB のデータが返されます。API を呼び出すのは、キャッシュがない場合、またはキャッシュが 1 時間より古い場合に限ります。

一般的な検索: ティッカー、名前、短縮名の 3 つの意味のあるフィールドで、ユーザーの検索語句を照合します。1 つの変数(例:SEARCH_TERM)を使い、各フィールドで test($q; "i") を使うと、「TSLA」、「Tesla」、「TL0」などを効率よく一致させられます。地域で絞り込む場合(例:「米国株」、「欧州の SAP」)、grep の後に ISIN の接頭辞(先頭 2 文字)で国コードを確認するか、currencyCode を使ってください。

重要: 金融商品を自動選択しないでください。候補が複数ある場合は、必ずユーザーに希望を確認してください。

# SEARCH_TERM = user query (e.g. TSLA, Tesla, AAPL, SAP)
SEARCH_TERM="TSLA"
CACHE_FILE="/tmp/t212_instruments.json"
if [ -f "$CACHE_FILE" ] && [ $(($(date +%s) - $(stat -f %m "$CACHE_FILE" 2>/dev/null || stat -c %Y "$CACHE_FILE"))) -lt 3600 ]; then
  # Search ticker, name, or shortName fields
  jq --arg q "$SEARCH_TERM" '[.[] | select((.ticker // "" | test($q; "i")) or (.name // "" | test($q; "i")) or (.shortName // "" | test($q; "i")))]' "$CACHE_FILE"
else
  curl -s -H "Authorization: $T212_AUTH_HEADER" \
    "$T212_BASE_URL/api/v0/equity/metadata/instruments" > "$CACHE_FILE"
fi
すべての金融商品を取得する

GET /api/v0/equity/metadata/instruments (1 req/50s)

curl -H "Authorization: $T212_AUTH_HEADER" \
  "$T212_BASE_URL/api/v0/equity/metadata/instruments"

レスポンススキーマ:

[
  {
    "ticker": "AAPL_US_EQ",
    "name": "Apple Inc",
    "shortName": "AAPL",
    "isin": "US0378331005",
    "currencyCode": "USD",
    "type": "STOCK",
    "maxOpenQuantity": 10000,
    "extendedHours": true,
    "workingScheduleId": 123,
    "addedOn": "2020-01-15T00:00:00Z"
  }
]
金融商品フィールド
フィールド型説明
tickerstring金融商品の一意の識別子
namestring金融商品の正式名称
shortNamestring短いシンボル(例:AAPL)
isinstring国際証券識別番号
currencyCodestring取引通貨(ISO 4217)
typestring金融商品の種類(下記参照)
maxOpenQuantitynumber許容される最大ポジションサイズ
extendedHoursboolean時間外取引が利用可能かどうか
workingScheduleIdinteger取引所スケジュールへの参照
addedOndatetimeプラットフォームに追加された日時
金融商品の種類
種類説明
STOCK普通株
ETF上場投資信託
CRYPTOCURRENCY暗号通貨
CRYPTO暗号資産
FOREX外国為替
FUTURES先物契約
INDEX指数
WARRANTワラント
CVR条件付価値請求権
CORPACTコーポレートアクション
ティッカー形式

{SYMBOL}_{EXCHANGE}_{TYPE} - 例:

  • AAPL_US_EQ - 米国の取引所に上場するApple
  • VUSA_LSE_EQ - ロンドンのVanguard S&P 500
  • BTC_CRYPTO - Bitcoin
取引所のメタデータを取得

GET /api/v0/equity/metadata/exchanges (1 req/30s)

curl -H "Authorization: $T212_AUTH_HEADER" \
  "$T212_BASE_URL/api/v0/equity/metadata/exchanges"

レスポンススキーマ:

[
  {
    "id": 123,
    "name": "NASDAQ",
    "workingSchedules": [
      {
        "id": 456,
        "timeEvents": [
          { "type": "PRE_MARKET_OPEN", "date": "2024-01-15T09:00:00Z" },
          { "type": "OPEN", "date": "2024-01-15T14:30:00Z" },
          { "type": "CLOSE", "date": "2024-01-15T21:00:00Z" },
          { "type": "AFTER_HOURS_CLOSE", "date": "2024-01-15T01:00:00Z" }
        ]
      }
    ]
  }
]
時刻イベントの種類
種類説明
PRE_MARKET_OPENプレマーケットセッション開始
OPEN通常取引開始
BREAK_START取引休止開始
BREAK_END取引休止終了
CLOSE通常取引終了
AFTER_HOURS_OPEN時間外セッション開始
AFTER_HOURS_CLOSE時間外セッション終了
OVERNIGHT_OPENオーバーナイトセッション開始

履歴データ

すべての履歴エンドポイントでは、nextPagePath を使用したカーソルベースのページネーションを使用します。

ページネーションパラメーター
パラメーター型デフォルト最大説明
limitinteger20501ページあたりの項目数
cursorstring/number--ページネーションカーソル(nextPagePath で使用)
tickerstring--ティッカーで絞り込み(注文、配当)
timedatetime--ページネーション時刻(取引の nextPagePath で使用)
ページネーションの例
#!/bin/bash
# Fetch all historical orders with pagination

NEXT_PATH="/api/v0/equity/history/orders?limit=50"

while [ -n "$NEXT_PATH" ]; do
  echo "Fetching: $NEXT_PATH"

  RESPONSE=$(curl -s -H "Authorization: $T212_AUTH_HEADER" \
    "$T212_BASE_URL$NEXT_PATH")

  # Process items (e.g., save to file)
  echo "$RESPONSE" | jq '.items[]' >> orders.json

  # Get next page path (null if no more pages)
  NEXT_PATH=$(echo "$RESPONSE" | jq -r '.nextPagePath // empty')

  # Wait 1 second between requests (50 req/min limit)
  if [ -n "$NEXT_PATH" ]; then
    sleep 1
  fi
done

echo "Done fetching all orders"
過去の注文

GET /api/v0/equity/history/orders (50 req/min)

curl -H "Authorization: $T212_AUTH_HEADER" \
  "$T212_BASE_URL/api/v0/equity/history/orders?limit=50"

# Filter by ticker
curl -H "Authorization: $T212_AUTH_HEADER" \
  "$T212_BASE_URL/api/v0/equity/history/orders?ticker=AAPL_US_EQ&limit=50"

レスポンススキーマ:

{
  "items": [
    {
      "order": {
        "id": 123456789,
        "type": "MARKET",
        "ticker": "AAPL_US_EQ",
        "instrument": {
          "ticker": "AAPL_US_EQ",
          "name": "Apple Inc",
          "isin": "US0378331005",
          "currency": "USD"
        },
        "quantity": 5,
        "filledQuantity": 5,
        "status": "FILLED",
        "side": "BUY",
        "createdAt": "2024-01-15T10:30:00Z"
      },
      "fill": {
        "id": 987654321,
        "type": "TRADE",
        "quantity": 5,
        "price": 185.5,
        "filledAt": "2024-01-15T10:30:05Z",
        "tradingMethod": "TOTV",
        "walletImpact": {
          "currency": "GBP",
          "fxRate": 0.79,
          "netValue": 732.72,
          "realisedProfitLoss": 0,
          "taxes": [
            { "name": "STAMP_DUTY", "quantity": 3.66, "currency": "GBP" }
          ]
        }
      }
    }
  ],
  "nextPagePath": "/api/v0/equity/history/orders?limit=50&cursor=1705326600000"
}
約定の種類
種類説明
TRADE通常の取引執行
STOCK_SPLIT株式分割の調整
STOCK_DISTRIBUTION株式の分配
FOP無償決済の移転
FOP_CORRECTIONFOP の修正
CUSTOM_STOCK_DISTRIBUTIONカスタム株式分配
EQUITY_RIGHTS株式引受権の発行
取引方法
方法説明
TOTV取引所で取引
OTC店頭取引
税金の種類(walletImpact.taxes)
種類説明
COMMISSION_TURNOVER売上高に対する手数料
CURRENCY_CONVERSION_FEE為替換算手数料
FINRA_FEEFINRA 取引活動手数料
FRENCH_TRANSACTION_TAXフランスの金融取引税(FTT)
PTM_LEVY買収委員会賦課金
STAMP_DUTY英国印紙税
STAMP_DUTY_RESERVE_TAX英国印紙税準備税(SDRT)
TRANSACTION_FEE一般取引手数料
過去の配当

GET /api/v0/equity/history/dividends (50 req/min)

curl -H "Authorization: $T212_AUTH_HEADER" \
  "$T212_BASE_URL/api/v0/equity/history/dividends?limit=50"

# Filter by ticker
curl -H "Authorization: $T212_AUTH_HEADER" \
  "$T212_BASE_URL/api/v0/equity/history/dividends?ticker=AAPL_US_EQ&limit=50"

レスポンススキーマ:

{
  "items": [
    {
      "ticker": "AAPL_US_EQ",
      "instrument": {
        "ticker": "AAPL_US_EQ",
        "name": "Apple Inc",
        "isin": "US0378331005",
        "currency": "USD"
      },
      "type": "ORDINARY",
      "amount": 12.5,
      "amountInEuro": 14.7,
      "currency": "GBP",
      "tickerCurrency": "USD",
      "grossAmountPerShare": 0.24,
      "quantity": 65.5,
      "paidOn": "2024-02-15T00:00:00Z",
      "reference": "DIV-123456"
    }
  ],
  "nextPagePath": null
}
配当の種類(一般)
種類説明
ORDINARY通常配当
BONUS特別配当
INTEREST利息支払い
DIVIDEND一般配当
CAPITAL_GAINSキャピタルゲイン分配
RETURN_OF_CAPITAL資本の払い戻し
PROPERTY_INCOME不動産所得(REIT)
DEMERGER会社分割による分配
QUALIFIED_INVESTMENT_ENTITYQIE 分配
TRUST_DISTRIBUTION信託分配

注:1042-S 報告用の米国税務に特化した種類がほかにも多数あります。

口座取引

GET /api/v0/equity/history/transactions (50 req/min)

ページネーション:

  • 最初のリクエスト: limit パラメーターのみを使用する必要があります(カーソル、タイムスタンプは指定しません)
  • 以降のリクエスト: 前回のレスポンスに含まれる nextPagePath を使用します。カーソルとタイムスタンプは自動的に含まれます
  • 時間による絞り込み: 取引を時間で絞り込むことはできません。過去のデータをたどるにはページネーションのみを使用できます
# First request - use only limit
curl -H "Authorization: $T212_AUTH_HEADER" \
  "$T212_BASE_URL/api/v0/equity/history/transactions?limit=50"

レスポンススキーマ:

{
  "items": [
    {
      "type": "DEPOSIT",
      "amount": 1000.0,
      "currency": "GBP",
      "dateTime": "2024-01-10T14:30:00Z",
      "reference": "TXN-123456"
    }
  ],
  "nextPagePath": null
}
取引の種類
種類説明
DEPOSIT口座への入金
WITHDRAW口座からの出金
FEE請求された手数料
TRANSFER内部振替
CSV レポート

レポートをリクエスト: POST /api/v0/equity/history/exports (1 req/30s)

curl -X POST -H "Authorization: $T212_AUTH_HEADER" \
  -H "Content-Type: application/json" \
  "$T212_BASE_URL/api/v0/equity/history/exports" \
  -d '{
    "dataIncluded": {
      "includeDividends": true,
      "includeInterest": true,
      "includeOrders": true,
      "includeTransactions": true
    },
    "timeFrom": "2024-01-01T00:00:00Z",
    "timeTo": "2024-12-31T23:59:59Z"
  }'

レスポンス:

{
  "reportId": 12345
}

完了を確認: GET /api/v0/equity/history/exports (1 req/min)

curl -H "Authorization: $T212_AUTH_HEADER" \
  "$T212_BASE_URL/api/v0/equity/history/exports"

レスポンス:

[
  {
    "reportId": 12345,
    "status": "Finished",
    "dataIncluded": {
      "includeDividends": true,
      "includeInterest": true,
      "includeOrders": true,
      "includeTransactions": true
    },
    "timeFrom": "2024-01-01T00:00:00Z",
    "timeTo": "2024-12-31T23:59:59Z",
    "downloadLink": "https://trading212-reports.s3.amazonaws.com/..."
  }
]

レポートをダウンロード:

# Get the download link from the response
DOWNLOAD_URL=$(curl -s -H "Authorization: $T212_AUTH_HEADER" \
  "$T212_BASE_URL/api/v0/equity/history/exports" | jq -r '.[0].downloadLink')

# Download the CSV file
curl -o trading212_report.csv "$DOWNLOAD_URL"
レポートのステータス値
ステータス説明
Queuedレポートのリクエストを受信しました
Processingレポートの生成を開始しました
Runningレポートを生成中です
Finished完了 — downloadLink が利用可能です
Canceledレポートがキャンセルされました
Failed生成に失敗しました

注文前の検証

BUY の前 — 利用可能な資金を確認
#!/bin/bash
# Validate funds before placing a buy order

TICKER="AAPL_US_EQ"
QUANTITY=10
ESTIMATED_PRICE=185.00
ESTIMATED_COST=$(echo "$QUANTITY * $ESTIMATED_PRICE" | bc)

# Get available funds
AVAILABLE=$(curl -s -H "Authorization: $T212_AUTH_HEADER" \
  "$T212_BASE_URL/api/v0/equity/account/summary" | jq '.cash.availableToTrade')

echo "Estimated cost: $ESTIMATED_COST"
echo "Available funds: $AVAILABLE"

if (( $(echo "$ESTIMATED_COST > $AVAILABLE" | bc -l) )); then
  echo "ERROR: Insufficient funds"
  exit 1
fi

echo "OK: Funds available, proceeding with order"
SELL の前 — 利用可能な株式数を確認
#!/bin/bash
# Validate position before placing a sell order

TICKER="AAPL_US_EQ"
SELL_QUANTITY=5

# Get position for the ticker
POSITION=$(curl -s -H "Authorization: $T212_AUTH_HEADER" \
  "$T212_BASE_URL/api/v0/equity/positions?ticker=$TICKER")

AVAILABLE_QTY=$(echo "$POSITION" | jq '.[0].quantityAvailableForTrading // 0')

echo "Sell quantity: $SELL_QUANTITY"
echo "Available to sell: $AVAILABLE_QTY"

if (( $(echo "$SELL_QUANTITY > $AVAILABLE_QTY" | bc -l) )); then
  echo "ERROR: Insufficient shares (some may be in pies)"
  exit 1
fi

echo "OK: Shares available, proceeding with order"

レート制限への対応

レート制限について

レート制限は API キーや IP アドレスごとではなく、口座ごとに適用されます。同じ Trading 212 口座を使用するアプリケーションが複数ある場合、それらは同じレート制限枠を共有します。

レスポンスヘッダー

すべての API レスポンスには、レート制限ヘッダーが含まれます。

ヘッダー説明
x-ratelimit-limit期間内に許可されるリクエストの合計数
x-ratelimit-period秒単位の期間
x-ratelimit-remaining残りのリクエスト数
x-ratelimit-reset制限がリセットされる Unix タイムスタンプ
x-ratelimit-usedすでに実行したリクエスト数
レート制限を避けるため、リクエストを一度に集中させないでください

リクエストを一度に集中させて送信しないでください。 エンドポイントで毎分 50 件のリクエストが許可されていても、すべてを一度に送信すると、レート制限が適用され、パフォーマンスが低下する可能性があります。 リクエストの間隔を均等に空け、たとえば 1.2 秒ごとに 1 回呼び出すことで、常に制限内に収まるようにしてください。

悪い例(一度に集中させる):

# DON'T DO THIS - sends all requests at once
for ticker in AAPL_US_EQ MSFT_US_EQ GOOGL_US_EQ; do
  curl -H "Authorization: $T212_AUTH_HEADER" \
    "$T212_BASE_URL/api/v0/equity/positions?ticker=$ticker" &
done
wait

良い例(間隔を空ける):

# DO THIS - space requests evenly
for ticker in AAPL_US_EQ MSFT_US_EQ GOOGL_US_EQ; do
  curl -H "Authorization: $T212_AUTH_HEADER" \
    "$T212_BASE_URL/api/v0/equity/positions?ticker=$ticker"
  sleep 1.2  # 1.2 second between requests for 50 req/m limit
done
キャッシュ戦略

頻繁に変更されないデータは、API 呼び出しを減らすためにローカルにキャッシュしてください。

#!/bin/bash
# Cache instruments list (changes rarely)

CACHE_FILE="/tmp/t212_instruments.json"
CACHE_MAX_AGE=3600  # 1 hour

if [ -f "$CACHE_FILE" ]; then
  CACHE_AGE=$(($(date +%s) - $(stat -f %m "$CACHE_FILE")))
  if [ "$CACHE_AGE" -lt "$CACHE_MAX_AGE" ]; then
    cat "$CACHE_FILE"
    exit 0
  fi
fi

# Cache expired or doesn't exist - fetch fresh data
curl -s -H "Authorization: $T212_AUTH_HEADER" \
  "$T212_BASE_URL/api/v0/equity/metadata/instruments" > "$CACHE_FILE"

cat "$CACHE_FILE"

安全ガイドライン

  1. まずデモ環境でテストする - 実際の取引を行う前に、必ずワークフローを検証してください
  2. 注文前に検証する - 買い注文の前に資金(cash.availableToTrade)、売り注文の前にポジション(quantityAvailableForTrading)を確認してください
  3. 取り消せない操作は確認する - 注文の発注とキャンセルは取り消せません
  4. API は冪等ではありません - リクエストが重複すると、注文が重複して作成される可能性があります
  5. 認証情報をログに記録しない - 環境変数を使用してください
  6. レート制限を守る - リクエストの間隔を均等に空け、一度に集中させないでください
  7. 保留中の注文は最大 50 件 - ティッカーごと、アカウントごとの上限です
  8. メタデータをキャッシュする - 金融商品と取引所が変更されることはほとんどありません

コメント