trading212-api について
trading212-api は、エージェントが Trading 212 API を利用するためのスキルです。認証、口座の選択、環境、API リクエストを扱い、DEMO と LIVE の違いや口座・注文操作を説明します。API はベータ版であることも明記しています。
主な機能
- 01HTTP Basic 認証のガイド
- 02DEMO と LIVE 環境の選択
- 03Invest・Stocks ISA 口座の扱い
- 04口座サマリーと注文 API の案内
- 05ティッカー検索とリクエスト規則
活用シーン
- 01Trading 212 口座情報の確認
- 02適切な口座と環境の選択
- 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.com | demo.trading212.com |
| DEMO 口座 | demo.trading212.com | live.trading212.com |
401 エラーが発生した場合は、以下を確認してください。
- 対象の環境に対応する API キーを使用していること
- アクセスしようとしている環境と同じ環境(LIVE または DEMO)で API キーが生成されていること
認証情報を取得する
- 使用する環境を決めます — LIVE(実際の資金を使用)または DEMO(ペーパートレード)
- Trading 212 アプリ(モバイルまたはウェブ)を開きます
- 正しい口座に切り替えます — 対象の環境に合わせて、LIVE モードまたは DEMO モードになっていることを確認してください
- Settings > API に移動します
- 新しい API キーのペアを生成します。次の情報を受け取ります。
- API Key (ID)(例:
35839398ZFVKUxpHzPiVsxKdOtZdaDJSrvyPF) - API Secret(例:
7MOzYJlVJgxoPjdZJCEH3fO9ee7A0NzLylFFD4-3tlo)
- API Key (ID)(例:
- 両方の環境を使用する場合は、環境ごとに認証情報を分けて保存します
認証ヘッダーを作成する
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
}
}
アカウントのフィールド
| フィールド | 型 | 説明 |
|---|---|---|
id | integer | 取引口座の主番号 |
currency | string | 口座の基準通貨(ISO 4217) |
totalValue | number | 基準通貨での口座総額 |
cash.availableToTrade | number | 投資に利用可能な資金 |
cash.reservedForOrders | number | 保留中の注文用に確保された現金 |
cash.inPies | number | Pies 内の未投資現金 |
investments.currentValue | number | すべての投資の現在価値 |
investments.totalCost | number | 現在の投資の取得原価 |
investments.realizedProfitLoss | number | これまでに確定した損益 |
investments.unrealizedProfitLoss | number | 今売却した場合の含み損益 |
注文
注文タイプ
| タイプ | エンドポイント | 利用可否 | 説明 |
|---|---|---|---|
| 成行 | /api/v0/equity/orders/market | Demo + Live | 最良価格ですぐに執行します |
| 指値 | /api/v0/equity/orders/limit | Demo + Live | 指値またはそれより有利な価格で執行します |
| 逆指値 | /api/v0/equity/orders/stop | Demo + Live | 逆指値価格に達したときに成行注文を行います |
| 逆指値指値 | /api/v0/equity/orders/stop_limit | Demo + Live | 逆指値価格に達したときに指値注文を行います |
注文ステータス
| ステータス | 説明 |
|---|---|
LOCAL | 注文はローカルで作成され、まだ送信されていません |
UNCONFIRMED | 取引所に送信済みで、確認待ちです |
CONFIRMED | 取引所によって確認済みです |
NEW | 有効で、執行待ちです |
CANCELLING | キャンセルリクエストの処理中です |
CANCELLED | キャンセルが完了しました |
PARTIALLY_FILLED | 一部の株式が約定しました |
FILLED | 全量が約定しました |
REJECTED | 取引所によって拒否されました |
REPLACING | 変更処理中です |
REPLACED | 変更が完了しました |
有効期間
| 値 | 説明 |
|---|---|
DAY | 取引所のタイムゾーンで午前0時に期限切れになります |
GOOD_TILL_CANCEL | 約定またはキャンセルされるまで有効です(デフォルト) |
注文戦略
| 値 | 説明 |
|---|---|
QUANTITY | 株数を指定して注文します(API 対応) |
VALUE | 金額を指定して注文します(API では未対応) |
注文の開始元
| 値 | 説明 |
|---|---|
API | この API 経由で発注 |
IOS | iOS アプリ |
ANDROID | Android アプリ |
WEB | Web プラットフォーム |
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}'
リクエストフィールド:
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
ticker | string | はい | 金融商品のティッカー(例:AAPL_US_EQ) |
quantity | number | はい | 買いの場合は正の値、売りの場合は負の値 |
extendedHours | boolean | いいえ | 市場前(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"}'
リクエストフィールド:
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
ticker | string | はい | 金融商品のティッカー |
quantity | number | はい | 買いの場合は正の値、売りの場合は負の値 |
limitPrice | number | はい | 買いの場合は上限価格、売りの場合は下限価格 |
timeValidity | string | いいえ | 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"}'
リクエストフィールド:
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
ticker | string | はい | 金融商品のティッカー |
quantity | number | はい | 買いの場合は正の値、売りの場合は負の値 |
stopPrice | number | はい | トリガー価格(最終取引価格に基づく) |
timeValidity | string | いいえ | 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"}'
リクエストフィールド:
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
ticker | string | はい | 金融商品のティッカー |
quantity | number | はい | 買いの場合は正の値、売りの場合は負の値 |
stopPrice | number | はい | 指値注文を有効にするトリガー価格 |
limitPrice | number | はい | 発生する注文の指値価格 |
timeValidity | string | いいえ | 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)
クエリパラメーター:
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
ticker | string | いいえ | 特定のティッカーで絞り込みます(例: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
}
}
]
ポジションのフィールド
| フィールド | 型 | 説明 |
|---|---|---|
quantity | number | 保有している株式の合計数 |
quantityAvailableForTrading | number | 売却可能な株式数 |
quantityInPies | number | pies に割り当てられた株式数 |
currentPrice | number | 現在価格(金融商品の通貨) |
averagePricePaid | number | 1 株あたりの平均取得価格 |
createdAt | datetime | ポジションの開始日 |
walletImpact.currency | string | 口座の通貨 |
walletImpact.totalCost | number | 口座通貨での合計コスト |
walletImpact.currentValue | number | 口座通貨での現在価値 |
walletImpact.unrealizedProfitLoss | number | 口座通貨での損益 |
walletImpact.fxImpact | number | 為替レートが価値に与える影響 |
ポジション数量のシナリオ
| シナリオ | quantity | quantityAvailableForTrading | quantityInPies |
|---|---|---|---|
| すべて直接保有 | 10 | 10 | 0 |
| 一部が pie に割り当て | 10 | 7 | 3 |
| すべて pie に割り当て | 10 | 0 | 10 |
重要: 売却注文を出す前に、必ず 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"
}
]
金融商品フィールド
| フィールド | 型 | 説明 |
|---|---|---|
ticker | string | 金融商品の一意の識別子 |
name | string | 金融商品の正式名称 |
shortName | string | 短いシンボル(例:AAPL) |
isin | string | 国際証券識別番号 |
currencyCode | string | 取引通貨(ISO 4217) |
type | string | 金融商品の種類(下記参照) |
maxOpenQuantity | number | 許容される最大ポジションサイズ |
extendedHours | boolean | 時間外取引が利用可能かどうか |
workingScheduleId | integer | 取引所スケジュールへの参照 |
addedOn | datetime | プラットフォームに追加された日時 |
金融商品の種類
| 種類 | 説明 |
|---|---|
STOCK | 普通株 |
ETF | 上場投資信託 |
CRYPTOCURRENCY | 暗号通貨 |
CRYPTO | 暗号資産 |
FOREX | 外国為替 |
FUTURES | 先物契約 |
INDEX | 指数 |
WARRANT | ワラント |
CVR | 条件付価値請求権 |
CORPACT | コーポレートアクション |
ティッカー形式
{SYMBOL}_{EXCHANGE}_{TYPE} - 例:
AAPL_US_EQ- 米国の取引所に上場するAppleVUSA_LSE_EQ- ロンドンのVanguard S&P 500BTC_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 を使用したカーソルベースのページネーションを使用します。
ページネーションパラメーター
| パラメーター | 型 | デフォルト | 最大 | 説明 |
|---|---|---|---|---|
limit | integer | 20 | 50 | 1ページあたりの項目数 |
cursor | string/number | - | - | ページネーションカーソル(nextPagePath で使用) |
ticker | string | - | - | ティッカーで絞り込み(注文、配当) |
time | datetime | - | - | ページネーション時刻(取引の 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_CORRECTION | FOP の修正 |
CUSTOM_STOCK_DISTRIBUTION | カスタム株式分配 |
EQUITY_RIGHTS | 株式引受権の発行 |
取引方法
| 方法 | 説明 |
|---|---|
TOTV | 取引所で取引 |
OTC | 店頭取引 |
税金の種類(walletImpact.taxes)
| 種類 | 説明 |
|---|---|
COMMISSION_TURNOVER | 売上高に対する手数料 |
CURRENCY_CONVERSION_FEE | 為替換算手数料 |
FINRA_FEE | FINRA 取引活動手数料 |
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_ENTITY | QIE 分配 |
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"
安全ガイドライン
- まずデモ環境でテストする - 実際の取引を行う前に、必ずワークフローを検証してください
- 注文前に検証する - 買い注文の前に資金(
cash.availableToTrade)、売り注文の前にポジション(quantityAvailableForTrading)を確認してください - 取り消せない操作は確認する - 注文の発注とキャンセルは取り消せません
- API は冪等ではありません - リクエストが重複すると、注文が重複して作成される可能性があります
- 認証情報をログに記録しない - 環境変数を使用してください
- レート制限を守る - リクエストの間隔を均等に空け、一度に集中させないでください
- 保留中の注文は最大 50 件 - ティッカーごと、アカウントごとの上限です
- メタデータをキャッシュする - 金融商品と取引所が変更されることはほとんどありません