openapi: 3.0.1
info:
description: "Welcome to the official API reference for the Trading 212 Public API! This\nguide provides all the information you need to start building your own\ntrading applications and integrations.\n\n\n---\n\n# General Information\n\nThis API is currently in **beta** and is under active development. We're\ncontinuously adding new features and improvements, and we welcome your\nfeedback.\n\n\n### Only for Invest and Stocks ISA\n\nThe API described here is enabled and usable only for **Invest and Stocks ISA** account types.\n\n\n\n### API Environments\n\nWe provide two distinct environments for development and trading:\n\n* **Paper Trading (Demo):** `https://demo.trading212.com/api/v0`\n\n* **Live Trading (Real Money):** `https://live.trading212.com/api/v0`\n\nYou can test your applications extensively in the paper trading environment\nwithout risking real funds before moving to live trading.\n\n### ⚠️ API Limitations\n\nPlease be aware of the following limitations for any order placement:\n\n* **Supported account types:** The Trading 212 Public API is enabled and\n usable only for **Invest and Stocks ISA** account types.\n\n* **Order execution:** Orders can be executed only in the **primary account\n currency**\n\n* **Multi-currency:** Multi-currency accounts are not currently supported\n through the API. Meaning your account, position and result values in the\n responses will be in the primary account currency.\n\n### Key Concepts\n\n* **Authentication:** Every request to the API must be authenticated using a\n secure key pair. See the **Authentication** section below for details.\n\n* **Rate Limiting:** All API calls are subject to rate limits to ensure fair\n usage and stability. See the **Rate Limiting** section for a full\n explanation.\n\n* **IP Restrictions:** For enhanced security, you can optionally restrict\n your API keys to a specific set of IP addresses from within your Trading 212\n account settings.\n\n* **Selling Orders:** To execute a sell order, you must provide a\n **negative** value for the `quantity` parameter (e.g., `-10.5`). This is a\n core convention of the API.\n\n---\n\n## Quickstart\n\nThis simple example shows you how to retrieve your account summary.\n\nFirst, you must generate your API keys from within the Trading 212 app. For\ndetailed instructions, please visit our Help Centre:\n\n* [**How to get your Trading 212 API\n key**](https://helpcentre.trading212.com/hc/en-us/articles/14584770928157-Trading-212-API-key)\n\nOnce you have your **API Key** and **API Secret**, you can make your first\ncall using `cURL`:\n\n```bash\n\n# Step 1: Replace with your actual credentials and Base64-encode them.\n\n# The `-n` is important as it prevents adding a newline character.\n\nCREDENTIALS=$(echo -n \"<YOUR_API_KEY>:<YOUR_API_SECRET>\" | base64)\n\n\n# Step 2: Make the API call to the live environment using the encoded\ncredentials.\n\ncurl -X GET \"https://live.trading212.com/api/v0/equity/account/summary\" \\\n -H \"Authorization: Basic $CREDENTIALS\"\n```\n\n---\n\n# Authentication\n\nThe API uses a secure key pair for authentication on every request. You must\nprovide your **API Key** as the username and your **API Secret** as the\npassword, formatted as an HTTP Basic Authentication header.\n\nThe `Authorization` header is constructed by Base64-encoding your\n`API_KEY:API_SECRET` string and prepending it with `Basic `.\n\n### Building the Authorization Header\n\nHere are examples of how to generate the required value in different\nenvironments.\n\n**Linux or macOS (Terminal)**\n\nYou can use the `echo` and `base64` commands. Remember to use the `-n` flag\nwith `echo` to prevent it from adding a trailing newline, which would\ninvalidate the credential string.\n\n```bash\n\n# This command outputs the required Base64-encoded string for your header.\n\necho -n \"<YOUR_API_KEY>:<YOUR_API_SECRET>\" | base64\n\n```\n\n**Python**\n\nThis simple snippet shows how to generate the full header value.\n\n```python\n\nimport base64\n\n\n# 1. Your credentials\n\napi_key = \"<YOUR_API_KEY>\"\n\napi_secret = \"<YOUR_API_SECRET>\"\n\n\n# 2. Combine them into a single string\n\ncredentials_string = f\"{api_key}:{api_secret}\"\n\n\n# 3. Encode the string to bytes, then Base64 encode it\n\nencoded_credentials =\nbase64.b64encode(credentials_string.encode('utf-8')).decode('utf-8')\n\n\n# 4. The final header value\n\nauth_header = f\"Basic {encoded_credentials}\"\n\n\nprint(auth_header)\n\n```\n\n---\n\n# Rate Limiting\n\nTo ensure high performance and fair access for all users, all API endpoints\nare subject to rate limiting.\n\n\n> **IMPORTANT NOTE:** All rate limits are applied on a per-account basis,\n> regardless of which API key is used or which IP address the request\n> originates from.\n\n\nSpecific rate limits are detailed in the reference for each endpoint.\n\n### Response Headers\n\nEvery API response includes the following headers to help you manage your\nrequest frequency and avoid hitting limits.\n\n* `x-ratelimit-limit`: The total number of requests allowed in the current\n time period.\n\n* `x-ratelimit-period`: The duration of the time period in seconds.\n\n* `x-ratelimit-remaining`: The number of requests you have left in the\n current period.\n\n* `x-ratelimit-reset`: A Unix timestamp indicating the exact time when the\n limit will be fully reset.\n\n* `x-ratelimit-used`: The number of requests you have already made in the\n current period.\n\n### How It Works\n\nThe rate limiter allows for requests to be made in bursts. For example, an\nendpoint with a limit of `50 requests per 1 minute` does **not** strictly\nmean you can only make one request every 1.2 seconds. Instead, you could:\n\n* Make a burst of all 50 requests in the first 5 seconds of a minute. You\n would then need to wait for the reset time indicated by the\n `x-ratelimit-reset` header before making more requests.\n\n* Pace your requests evenly, for example, by making one call every 1.2\n seconds, ensuring you always stay within the limit.\n\n### Function-Specific Limits\n\nIn addition to the general rate limits on HTTP calls, some actions have\ntheir own functional limits. For example, there is a maximum of **50 pending\norders** allowed per ticker, per account.\n\n# Pagination\n\nAll list endpoints in the API that return a collection of items (such as historical orders, dividends, and transactions) use **cursor-based pagination** to handle large data sets.\n\n### Parameters\n\n* **`limit`** (integer): Specifies the maximum number of items to return in a single request.\n * **Default:** 20\n * **Maximum:** 50\n* **`cursor`** (string | number): A pointer to a specific item in the dataset. This tells the API where to start the next page of results.\n\n### How to Paginate\n\nThe easiest way to paginate is by using the `nextPagePath` field returned in the response.\n\n1. Make your initial request to a list endpoint (e.g., `/api/v0/equity/history/orders`) with an optional `limit` parameter. Do not include a `cursor`.\n2. The API will return a response object. This object will contain a list of `items` and a `nextPagePath` field.\n3. If the `nextPagePath` field is `null`, you have reached the end of the data, and there are no more pages.\n4. If `nextPagePath` is not `null`, **use the entire string value of `nextPagePath`** as the path for your next request. This string contains all the necessary parameters (like `limit` and `cursor`) to get the next page.\n5. Repeat this process until `nextPagePath` is `null`.\n\n### Example\n\nHere is a step-by-step example of fetching all transactions, 2 at a time.\n\n**Request 1: Get the first page**\n```bash\ncurl -X GET \"https://demo.trading212.com/api/v0/equity/history/orders?limit=2\" \\\n -u \"API_KEY:API_SECRET\"\n```\n**Response 1: Note the nextPagePath**\n```json\n{\n \"items\": [\n { \"id\": 987654321, \"ticker\": \"AAPL_US_EQ\", ... },\n { \"id\": 987654320, \"ticker\": \"MSFT_US_EQ\", ... }\n ],\n \"nextPagePath\": \"/api/v0/equity/history/orders?limit=2&cursor=1760346100000\"\n}\n```\n**Request 2: Use the full nextPagePath for the next request**\n```bash\ncurl -X GET \"https://demo.trading212.com/api/v0/equity/history/orders?limit=2&cursor=1760346100000\" \\\n -u \"API_KEY:API_SECRET\"\n```\n**Response 2: Get the next page (and a new nextPagePath)**\n```json\n{\n \"items\": [\n { \"id\": 987654319, \"ticker\": \"AAPL_US_EQ\", ... },\n { \"id\": 987654320, \"987654318\": \"MSFT_US_EQ\", ... }\n ],\n \"nextPagePath\": \"/api/v0/equity/history/orders?limit=2&cursor=1660015723000\"\n}\n```\n**Request 3: Get the final page**\n```bash\ncurl -X GET \"https://demo.trading212.com/api/v0/equity/history/orders?limit=2&cursor=1660015723000\" \\\n -u \"API_KEY:API_SECRET\"\n```\nResponse 3: nextPagePath is null, indicating the end\n```json\n{\n \"items\": [\n { \"id\": 987654317, \"ticker\": \"AMZN_US_EQ\", ... }\n ],\n \"nextPagePath\": null\n}\n```\n\n---\n\n# Useful Links\n\nHere are some additional resources that you may find helpful.\n\n* [**Trading 212 API\n Terms**](https://www.trading212.com/legal-documentation/API-Terms_EN.pdf)\n\n* [**Trading 212 Community Forum**](https://community.trading212.com/) - A\n great place to ask questions and share what you've built.\n"
title: Trading 212 Public Accounts Historical events API
version: v0
servers:
- url: https://demo.trading212.com
- url: https://live.trading212.com
tags:
- description: '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.'
name: Historical events
paths:
/api/v0/equity/history/dividends:
get:
description: '
**Rate limit:** 6 req / 1m0s'
operationId: dividends
parameters:
- description: Pagination cursor
in: query
name: cursor
required: false
schema:
format: int64
type: integer
- description: Ticker filter
in: query
name: ticker
required: false
schema:
type: string
- description: 'Max items: 50'
example: 21
in: query
name: limit
required: false
schema:
default: 20
format: int32
type: integer
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/PaginatedResponseHistoryDividendItem'
description: OK
'400':
description: Bad filtering arguments
'401':
description: Bad API key
'403':
description: Scope( history:dividends ) missing for API key
'408':
description: Timed-out
'429':
description: 'Limited: 6 / 1m0s'
security:
- authWithSecretKey: []
legacyApiKeyHeader: []
summary: Get paid out dividends
tags:
- Historical events
/api/v0/equity/history/exports:
get:
description: "Retrieves a list of all requested CSV reports and their current status. \n\n\n**Asynchronous Workflow:**\n\n1. Call `POST /history/exports` to request a report. You will receive a\n`reportId`.\n\n2. Periodically call this endpoint (`GET /history/exports`) to check the\n`status` of the report corresponding to your `reportId`.\n\n3. Once the status is `Finished`, the `downloadLink` field will contain\na URL to download the CSV file.\n\n**Rate limit:** 1 req / 1m0s"
operationId: getReports
responses:
'200':
content:
application/json:
schema:
items:
$ref: '#/components/schemas/ReportResponse'
type: array
description: OK
'400':
description: Bad filtering arguments
'401':
description: Bad API key
'403':
description: Missing Permissions
'408':
description: Timed-out
'429':
description: 'Limited: 1 / 1m0s'
security:
- authWithSecretKey: []
legacyApiKeyHeader: []
summary: List generated reports
tags:
- Historical events
post:
description: '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.
**Rate limit:** 1 req / 30s'
operationId: requestReport
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/PublicReportRequest'
required: true
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/EnqueuedReportResponse'
description: OK
'400':
description: Bad filtering arguments
'401':
description: Bad API key
'403':
description: Missing Permissions
'408':
description: Timed-out
'429':
description: 'Limited: 1 / 30s'
security:
- authWithSecretKey: []
legacyApiKeyHeader: []
summary: Request a CSV report
tags:
- Historical events
/api/v0/equity/history/orders:
get:
description: '
**Rate limit:** 6 req / 1m0s'
operationId: orders_1
parameters:
- description: Pagination cursor
in: query
name: cursor
required: false
schema:
format: int64
type: integer
- description: Ticker filter
in: query
name: ticker
required: false
schema:
type: string
- description: 'Max items: 50'
example: 21
in: query
name: limit
required: false
schema:
default: 20
format: int32
type: integer
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/PaginatedResponseHistoricalOrder'
description: OK
'400':
description: Bad filtering arguments
'401':
description: Bad API key
'403':
description: Scope( history:orders ) missing for API key
'408':
description: Timed-out
'429':
description: 'Limited: 6 / 1m0s'
security:
- authWithSecretKey: []
legacyApiKeyHeader: []
summary: Get historical orders data
tags:
- Historical events
/api/v0/equity/history/transactions:
get:
description: 'Fetch superficial information about movements to and from your account
**Rate limit:** 6 req / 1m0s'
operationId: transactions
parameters:
- description: Pagination cursor
in: query
name: cursor
required: false
schema:
type: string
- description: Retrieve transactions starting from the specified time
in: query
name: time
required: false
schema:
format: date-time
type: string
- description: 'Max items: 50'
example: 21
in: query
name: limit
required: false
schema:
default: 20
format: int32
type: integer
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/PaginatedResponseHistoryTransactionItem'
description: OK
'400':
description: Bad filtering arguments
'401':
description: Bad API key
'403':
description: Scope( history:transactions ) missing for API key
'408':
description: Timed-out
'429':
description: 'Limited: 6 / 1m0s'
security:
- authWithSecretKey: []
legacyApiKeyHeader: []
summary: Get transactions
tags:
- Historical events
components:
schemas:
FillWalletImpact:
properties:
currency:
type: string
fxRate:
type: number
netValue:
type: number
realisedProfitLoss:
type: number
taxes:
items:
$ref: '#/components/schemas/Tax'
type: array
type: object
HistoryTransactionItem:
properties:
amount:
description: Amount in the currency of the transaction
type: number
currency:
description: Currency of the transaction
type: string
dateTime:
format: date-time
type: string
reference:
description: ID
type: string
type:
enum:
- WITHDRAW
- DEPOSIT
- FEE
- TRANSFER
type: string
type: object
Instrument:
description: Instrument information as given by /instruments endpoint.
properties:
currency:
description: Instrument currency in ISO 4217 format.
type: string
isin:
description: ISIN of the instrument.
type: string
name:
description: Name of the instrument.
type: string
ticker:
description: Unique instrument identifier.
example: AAPL_US_EQ
type: string
type: object
PaginatedResponseHistoryDividendItem:
properties:
items:
items:
$ref: '#/components/schemas/HistoryDividendItem'
type: array
nextPagePath:
type: string
type: object
PublicReportRequest:
properties:
dataIncluded:
$ref: '#/components/schemas/ReportDataIncluded'
timeFrom:
format: date-time
type: string
timeTo:
format: date-time
type: string
type: object
HistoryDividendItem:
properties:
amount:
description: In account's primary currency.
type: number
amountInEuro:
type: number
currency:
description: The account's primary currency.
type: string
grossAmountPerShare:
description: In instrument currency
type: number
instrument:
$ref: '#/components/schemas/Instrument'
paidOn:
format: date-time
type: string
quantity:
type: number
reference:
type: string
ticker:
type: string
tickerCurrency:
type: string
type:
enum:
- ORDINARY
- BONUS
- PROPERTY_INCOME
- RETURN_OF_CAPITAL_NON_US
- DEMERGER
- INTEREST
- CAPITAL_GAINS_DISTRIBUTION_NON_US
- INTERIM_LIQUIDATION
- ORDINARY_MANUFACTURED_PAYMENT
- BONUS_MANUFACTURED_PAYMENT
- PROPERTY_INCOME_MANUFACTURED_PAYMENT
- RETURN_OF_CAPITAL_NON_US_MANUFACTURED_PAYMENT
- DEMERGER_MANUFACTURED_PAYMENT
- INTEREST_MANUFACTURED_PAYMENT
- CAPITAL_GAINS_DISTRIBUTION_NON_US_MANUFACTURED_PAYMENT
- INTERIM_LIQUIDATION_MANUFACTURED_PAYMENT
- INTEREST_PAID_BY_US_OBLIGORS
- INTEREST_PAID_BY_FOREIGN_CORPORATIONS
- DIVIDENDS_PAID_BY_US_CORPORATIONS
- DIVIDENDS_PAID_BY_FOREIGN_CORPORATIONS
- CAPITAL_GAINS
- REAL_PROPERTY_INCOME_AND_NATURAL_RESOURCES_ROYALTIES
- OTHER_INCOME
- QUALIFIED_INVESTMENT_ENTITY
- TRUST_DISTRIBUTION
- PUBLICLY_TRADED_PARTNERSHIP_DISTRIBUTION
- CAPITAL_GAINS_DISTRIBUTION
- RETURN_OF_CAPITAL
- OTHER_DIVIDEND_EQUIVALENT
- TAX_EVENT_1446F_FOR_PUBLICLY_TRADED_SECURITIES
- PTP_UNCHARACTERISED_INCOME
- MULTIPLE_1042S_TAX_COMPONENTS
- DIVIDEND
- SHORT_TERM_CAPITAL_GAINS
- LONG_TERM_CAPITAL_GAINS
- PROPERTY_INCOME_DISTRIBUTION
- TAX_EXEMPTED
- INTEREST_PAID_BY_US_OBLIGORS_MANUFACTURED_PAYMENT
- INTEREST_PAID_BY_FOREIGN_CORPORATIONS_MANUFACTURED_PAYMENT
- DIVIDENDS_PAID_BY_US_CORPORATIONS_MANUFACTURED_PAYMENT
- DIVIDENDS_PAID_BY_FOREIGN_CORPORATIONS_MANUFACTURED_PAYMENT
- CAPITAL_GAINS_MANUFACTURED_PAYMENT
- REAL_PROPERTY_INCOME_AND_NATURAL_RESOURCES_ROYALTIES_MANUFACTURED_PAYMENT
- OTHER_INCOME_MANUFACTURED_PAYMENT
- QUALIFIED_INVESTMENT_ENTITY_MANUFACTURED_PAYMENT
- TRUST_DISTRIBUTION_MANUFACTURED_PAYMENT
- PUBLICLY_TRADED_PARTNERSHIP_DISTRIBUTION_MANUFACTURED_PAYMENT
- CAPITAL_GAINS_DISTRIBUTION_MANUFACTURED_PAYMENT
- RETURN_OF_CAPITAL_MANUFACTURED_PAYMENT
- OTHER_DIVIDEND_EQUIVALENT_MANUFACTURED_PAYMENT
- TAX_EVENT_1446F_FOR_PUBLICLY_TRADED_SECURITIES_MANUFACTURED_PAYMENT
- PTP_UNCHARACTERISED_INCOME_MANUFACTURED_PAYMENT
- MULTIPLE_1042S_TAX_COMPONENTS_MANUFACTURED_PAYMENT
- DIVIDEND_MANUFACTURED_PAYMENT
- SHORT_TERM_CAPITAL_GAINS_MANUFACTURED_PAYMENT
- LONG_TERM_CAPITAL_GAINS_MANUFACTURED_PAYMENT
- PROPERTY_INCOME_DISTRIBUTION_MANUFACTURED_PAYMENT
- TAX_EXEMPTED_MANUFACTURED_PAYMENT
type: string
type: object
ReportDataIncluded:
properties:
includeDividends:
type: boolean
includeInterest:
type: boolean
includeOrders:
type: boolean
includeTransactions:
type: boolean
type: object
EnqueuedReportResponse:
properties:
reportId:
format: int64
type: integer
type: object
TimeValidity:
description: "Specifies how long the order remains active: \n* DAY: The order will automatically expire if not executed by midnight in the time zone of the instrument's exchange.\n* GOOD_TILL_CANCEL: The order remains active indefinitely until it is either filled or explicitly cancelled by you."
enum:
- DAY
- GOOD_TILL_CANCEL
type: string
Order:
properties:
createdAt:
description: The ISO 8601 formatted date of when the order was created.
format: date-time
type: string
currency:
description: The currency used for the order in ISO 4217 format.
type: string
extendedHours:
description: If true, the order is eligible for execution outside regular trading hours.
type: boolean
filledQuantity:
description: The number of shares that have been successfully executed. Applicable to quantity orders.
type: number
filledValue:
description: 'The total monetary value of the executed portion of the order. Applicable to orders placed by value.Note: Placing orders by value is not currently supported via the API but can be done through other Trading 212 platforms.'
type: number
id:
description: A unique, system-generated identifier for the order.
format: int64
type: integer
initiatedFrom:
description: How the order was initiated.
enum:
- API
- IOS
- ANDROID
- WEB
- SYSTEM
- AUTOINVEST
- INSTRUMENT_AUTOINVEST
type: string
instrument:
$ref: '#/components/schemas/Instrument'
limitPrice:
description: Applicable to LIMIT and STOP_LIMIT orders.
type: number
quantity:
description: The total number of shares requested. Applicable to quantity orders.
type: number
side:
description: Indicates whether the order is BUY or SELL.
enum:
- BUY
- SELL
type: string
status:
description: The current state of the order in its lifecycle.
enum:
- LOCAL
- UNCONFIRMED
- CONFIRMED
- NEW
- CANCELLING
- CANCELLED
- PARTIALLY_FILLED
- FILLED
- REJECTED
- REPLACING
- REPLACED
type: string
stopPrice:
description: Applicable to STOP and STOP_LIMIT orders.
type: number
strategy:
description: The strategy used to place the order, either by QUANTITY or VALUE. The API currently only supports placing orders by QUANTITY.
enum:
- QUANTITY
- VALUE
type: string
ticker:
description: Unique instrument identifier. Get from the /instruments endpoint
example: AAPL_US_EQ
type: string
timeInForce:
$ref: '#/components/schemas/TimeValidity'
type:
enum:
- LIMIT
- STOP
- MARKET
- STOP_LIMIT
type: string
value:
description: The total monetary value of the order. Applicable to value orders.
type: number
type: object
Fill:
properties:
filledAt:
format: date-time
type: string
id:
format: int64
type: integer
price:
type: number
quantity:
type: number
tradingMethod:
enum:
- TOTV
- OTC
type: string
type:
enum:
- TRADE
- STOCK_SPLIT
- STOCK_DISTRIBUTION
- FOP
- FOP_CORRECTION
- CUSTOM_STOCK_DISTRIBUTION
- EQUITY_RIGHTS
- SCRIP_STOCK_DIVIDENDS
- STOCK_DIVIDENDS
- STOCK_ACQUISITION
- CASH_AND_STOCK_ACQUISITION
- SPIN_OFF
type: string
walletImpact:
$ref: '#/components/schemas/FillWalletImpact'
type: object
PaginatedResponseHistoricalOrder:
properties:
items:
items:
$ref: '#/components/schemas/HistoricalOrder'
type: array
nextPagePath:
type: string
type: object
Tax:
properties:
chargedAt:
format: date-time
type: string
currency:
type: string
name:
enum:
- COMMISSION_TURNOVER
- CURRENCY_CONVERSION_FEE
- FINRA_FEE
- FRENCH_TRANSACTION_TAX
- PTM_LEVY
- STAMP_DUTY
- STAMP_DUTY_RESERVE_TAX
- TRANSACTION_FEE
type: string
quantity:
type: number
type: object
ReportResponse:
properties:
dataIncluded:
$ref: '#/components/schemas/ReportDataIncluded'
downloadLink:
type: string
reportId:
format: int64
type: integer
status:
enum:
- Queued
- Processing
- Running
- Canceled
- Failed
- Finished
type: string
timeFrom:
format: date-time
type: string
timeTo:
format: date-time
type: string
type: object
PaginatedResponseHistoryTransactionItem:
properties:
items:
items:
$ref: '#/components/schemas/HistoryTransactionItem'
type: array
nextPagePath:
type: string
type: object
HistoricalOrder:
properties:
fill:
$ref: '#/components/schemas/Fill'
order:
$ref: '#/components/schemas/Order'
type: object
securitySchemes:
authWithSecretKey:
description: Use your API Key as the username and your API Secret as the password
scheme: basic
type: http
legacyApiKeyHeader:
in: header
name: Authorization
type: apiKey