# Trading 212 Public API Welcome to the official API reference for the Trading 212 Public API! This guide provides all the information you need to start building your own trading applications and integrations. --- # General Information This API is currently in **beta** and is under active development. We're continuously adding new features and improvements, and we welcome your feedback. ### API Environments We provide two distinct environments for development and trading: * **Paper Trading (Demo):** `https://demo.trading212.com/api/v0` * **Live Trading (Real Money):** `https://live.trading212.com/api/v0` You can test your applications extensively in the paper trading environment without risking real funds before moving to live trading. ### ⚠️ API Limitations Please be aware of the following limitations for any order placement: * **Supported account types:** The Trading 212 Public API is enabled and usable only for **Invest and Stocks ISA** account types. * **Live trading order types:** For the live (real money) environment, only **Market Orders** are supported for execution via the API. * **Order execution:** Orders can be executed only in the **primary account currency** * **Multi-currency:** Multi-currency accounts are not currently supported through the API. Meaning your account, position and result values in the responses will be in the primary account currency. ### Key Concepts * **Authentication:** Every request to the API must be authenticated using a secure key pair. See the **Authentication** section below for details. * **Rate Limiting:** All API calls are subject to rate limits to ensure fair usage and stability. See the **Rate Limiting** section for a full explanation. * **IP Restrictions:** For enhanced security, you can optionally restrict your API keys to a specific set of IP addresses from within your Trading 212 account settings. * **Selling Orders:** To execute a sell order, you must provide a **negative** value for the `quantity` parameter (e.g., `-10.5`). This is a core convention of the API. --- ## Quickstart This simple example shows you how to retrieve your account's cash balance. First, you must generate your API keys from within the Trading 212 app. For detailed instructions, please visit our Help Centre: * [**How to get your Trading 212 API key**](https://helpcentre.trading212.com/hc/en-us/articles/14584770928157-Trading-212-API-key) Once you have your **API Key** and **API Secret**, you can make your first call using `cURL`: ```bash # Step 1: Replace with your actual credentials and Base64-encode them. # The `-n` is important as it prevents adding a newline character. CREDENTIALS=$(echo -n ":" | base64) # Step 2: Make the API call to the live environment using the encoded credentials. curl -X GET "https://live.trading212.com/api/v0/equity/account/cash" \ -H "Authorization: Basic $CREDENTIALS" ``` --- # Authentication The API uses a secure key pair for authentication on every request. You must provide your **API Key** as the username and your **API Secret** as the password, formatted as an HTTP Basic Authentication header. The `Authorization` header is constructed by Base64-encoding your `API_KEY:API_SECRET` string and prepending it with `Basic `. ### Building the Authorization Header Here are examples of how to generate the required value in different environments. **Linux or macOS (Terminal)** You can use the `echo` and `base64` commands. Remember to use the `-n` flag with `echo` to prevent it from adding a trailing newline, which would invalidate the credential string. ```bash # This command outputs the required Base64-encoded string for your header. echo -n ":" | base64 ``` **Python** This simple snippet shows how to generate the full header value. ```python import base64 # 1. Your credentials api_key = "" api_secret = "" # 2. Combine them into a single string credentials_string = f"{api_key}:{api_secret}" # 3. Encode the string to bytes, then Base64 encode it encoded_credentials = base64.b64encode(credentials_string.encode('utf-8')).decode('utf-8') # 4. The final header value auth_header = f"Basic {encoded_credentials}" print(auth_header) ``` --- # Rate Limiting To ensure high performance and fair access for all users, all API endpoints are subject to rate limiting. > **IMPORTANT NOTE:** All rate limits are applied on a per-account basis, regardless of which API key is used or which IP address the request originates from. Specific rate limits are detailed in the reference for each endpoint. ### Response Headers Every API response includes the following headers to help you manage your request frequency and avoid hitting limits. * `x-ratelimit-limit`: The total number of requests allowed in the current time period. * `x-ratelimit-period`: The duration of the time period in seconds. * `x-ratelimit-remaining`: The number of requests you have left in the current period. * `x-ratelimit-reset`: A Unix timestamp indicating the exact time when the limit will be fully reset. * `x-ratelimit-used`: The number of requests you have already made in the current period. ### How It Works The rate limiter allows for requests to be made in bursts. For example, an endpoint with a limit of `50 requests per 1 minute` does **not** strictly mean you can only make one request every 1.2 seconds. Instead, you could: * Make a burst of all 50 requests in the first 5 seconds of a minute. You would then need to wait for the reset time indicated by the `x-ratelimit-reset` header before making more requests. * Pace your requests evenly, for example, by making one call every 1.2 seconds, ensuring you always stay within the limit. ### Function-Specific Limits In addition to the general rate limits on HTTP calls, some actions have their own functional limits. For example, there is a maximum of **50 pending orders** allowed per ticker, per account. --- # Useful Links Here are some additional resources that you may find helpful. * [**Trading 212 API Terms**](https://www.trading212.com/legal-documentation/API-Terms_EN.pdf) * [**Trading 212 Community Forum**](https://community.trading212.com/) - A great place to ask questions and share what you've built. Version: v0 ## Servers ``` https://demo.trading212.com ``` ``` https://live.trading212.com ``` ## Security ### authWithSecretKey This API uses an authentication scheme, which requires a secure pair of API keys. Use your API Key as the username and your API Secret as the password. You can generate and manage your API keys in the Settings > API section of your Trading 212 account. The Authorization header should be constructed as follows: Authorization: Basic base64(:) Type: http Scheme: basic ## Download OpenAPI description [Trading 212 Public API](https://docs.trading212.com/_bundle/api.yaml) ## Account Data Access fundamental information about your trading account. Retrieve details such as your account ID, currency, and current cash balance. ### Get Account Cash Balance - [GET /api/v0/equity/account/cash](https://docs.trading212.com/api/account-data/accountcash.md): Rate Limit: 1 request per 2 seconds Provides a detailed breakdown of your account's cash and investment metrics, including available funds, invested capital, and total account value. ### Get Account Information - [GET /api/v0/equity/account/info](https://docs.trading212.com/api/account-data/account.md): Rate Limit: 1 request per 30 seconds Retrieves fundamental information about your trading account, such as your primary account number and its base currency. ## Equity Orders **⚠️ Order Limitations** * Orders can be executed only in the **main account currency** * Only **Market Orders** are supported for the live (real money) environment Place, monitor, and cancel equity trade orders. This section provides the core functionality for programmatically executing your trading strategies for stocks and ETFs. ### Get All Pending Orders - [GET /api/v0/equity/orders](https://docs.trading212.com/api/equity-orders/orders.md): Rate Limit: 1 request per 5 seconds Retrieves a list of all orders that are currently active (i.e., not yet filled, cancelled, or expired). This is useful for monitoring the status of your open positions and managing your trading strategy. ### Place a Limit Order - [POST /api/v0/equity/orders/limit](https://docs.trading212.com/api/equity-orders/placelimitorder.md): Rate Limit: 1 request per 2 seconds Creates a new Limit order, which executes at a specified price or better. - To place a buy order, use a positive quantity. The order will fill at the limitPrice or lower. - To place a sell order, use a negative quantity. The order will fill at the limitPrice or higher. Order Limitations * Orders can be executed only in the main account currency * Only Market Orders are supported for the live (real money) environment Important: In this beta version, this endpoint is not idempotent. Sending the same request multiple times may result in duplicate orders. ### Place a Market Order - [POST /api/v0/equity/orders/market](https://docs.trading212.com/api/equity-orders/placemarketorder.md): Rate Limit: 50 requests per 1 minute Creates a new Market order, which is an instruction to trade a security immediately at the next available price. - To place a buy order, use a positive quantity. - To place a sell order, use a negative quantity. - extendedHours: Set to true to allow the order to be filled outside of the standard trading session. - If placed when the market is closed, the order will be queued to execute when the market next opens. Order Limitations * Orders can be executed only in the main account currency * Only Market Orders are supported for the live (real money) environment Warning: Market orders can be subject to price slippage, where the final execution price may differ from the price at the time of order placement. Important: In this beta version, this endpoint is not idempotent. Sending the same request multiple times may result in duplicate orders. ### Place a Stop Order - [POST /api/v0/equity/orders/stop](https://docs.trading212.com/api/equity-orders/placestoporder_1.md): Rate Limit: 1 request per 2 seconds Creates a new Stop order, which places a Market order once the stopPrice is reached. - To place a buy stop order, use a positive quantity. - To place a sell stop order (commonly a 'stop-loss'), use a negative quantity. - The stopPrice is triggered by the instrument's Last Traded Price (LTP). Order Limitations * Orders can be executed only in the main account currency * Only Market Orders are supported for the live (real money) environment Important: In this beta version, this endpoint is not idempotent. Sending the same request multiple times may result in duplicate orders. ### Place a Stop-Limit Order - [POST /api/v0/equity/orders/stop_limit](https://docs.trading212.com/api/equity-orders/placestoporder.md): Rate Limit: 1 request per 2 seconds Creates a new Stop-Limit order, combining features of a Stop and a Limit order. The direction of the trade (buy/sell) is determined by the sign of the quantity field. Execution Logic: 1. When the instrument's Last Traded Price (LTP) reaches the specified stopPrice, the order is triggered. 2. A Limit order is then automatically placed at the specified limitPrice. This two-step process helps protect against price slippage that can occur with a standard Stop order. Order Limitations * Orders can be executed only in the main account currency * Only Market Orders are supported for the live (real money) environment Important: In this beta version, this endpoint is not idempotent. Sending the same request multiple times may result in duplicate orders. ### Cancel a Pending Order - [DELETE /api/v0/equity/orders/{id}](https://docs.trading212.com/api/equity-orders/cancelorder.md): Rate Limit: 50 requests per 1 minute Attempts to cancel an active, unfilled order by its unique ID. Cancellation is not guaranteed if the order is already in the process of being filled. A successful response indicates the cancellation request was accepted. ### Get Order by ID - [GET /api/v0/equity/orders/{id}](https://docs.trading212.com/api/equity-orders/orderbyid.md): Rate Limit: 1 request per 1 second Retrieves a single pending order using its unique numerical ID. This is useful for checking the status of a specific order you have previously placed. ## Personal Portfolio View the current state of your portfolio. Get a real-time overview of all your open positions, including quantity, average price, and current profit or loss. ### Fetch all open positions - [GET /api/v0/equity/portfolio](https://docs.trading212.com/api/personal-portfolio/portfolio.md): Rate Limit: 1 request per 5 seconds Fetch an open positions for your account ### Search for a specific position by ticker - [POST /api/v0/equity/portfolio/ticker](https://docs.trading212.com/api/personal-portfolio/positionbytickerv2.md): Rate Limit: 1 request per 1 second Search for a open position by ticker ### Fetch a specific position - [GET /api/v0/equity/portfolio/{ticker}](https://docs.trading212.com/api/personal-portfolio/positionbyticker.md): Rate Limit: 1 request per 1 second Fetch an open position by ticker ## Instruments Metadata Discover what you can trade. These endpoints provide comprehensive lists of all tradable instruments and the exchanges they belong to, including details like tickers and trading hours. ### Exchange List - [GET /api/v0/equity/metadata/exchanges](https://docs.trading212.com/api/instruments-metadata/exchanges.md): Rate Limit: 1 request per 30 seconds Fetch all exchanges and their corresponding working schedules that your account has access to ### Instrument List - [GET /api/v0/equity/metadata/instruments](https://docs.trading212.com/api/instruments-metadata/instruments.md): Rate Limit: 1 request per 50 seconds Fetch all instruments that your account has access to ## Historical items Review your account's trading history. Access detailed records of past orders, dividend payments, and cash transactions, or generate downloadable CSV reports for analysis and record-keeping. ### Historical order data - [GET /api/v0/equity/history/orders](https://docs.trading212.com/api/historical-items/orders_1.md): Rate Limit: 6 requests per 1 minute ### Paid out dividends - [GET /api/v0/history/dividends](https://docs.trading212.com/api/historical-items/dividends.md): Rate Limit: 6 requests per 1 minute ### List Generated Reports - [GET /api/v0/history/exports](https://docs.trading212.com/api/historical-items/getreports.md): Rate Limit: 1 request per 1 minute Retrieves a list of all requested CSV reports and their current status. Asynchronous Workflow: 1. Call POST /history/exports to request a report. You will receive a reportId. 2. Periodically call this endpoint (GET /history/exports) to check the status of the report corresponding to your reportId. 3. Once the status is Finished, the downloadLink field will contain a URL to download the CSV file. ### Request a CSV Report - [POST /api/v0/history/exports](https://docs.trading212.com/api/historical-items/requestreport.md): Rate Limit: 1 request per 30 seconds Initiates the generation of a CSV report containing historical account data. This is an asynchronous operation. The response will include a reportId which you can use to track the status of the generation process using the GET /history/exports endpoint. ### Transaction list - [GET /api/v0/history/transactions](https://docs.trading212.com/api/historical-items/transactions.md): Rate Limit: 6 requests per 1 minute Fetch superficial information about movements to and from your account