---
title: "Add or remove tracked tickers"
method: PATCH
path: "/tickers"
tags: ["tickers"]
---

# Add or remove tracked tickers

`PATCH /tickers`

## Request

- Base URL: `https://api.tradingpal.io/api/v1`
- URL: `https://api.tradingpal.io/api/v1/tickers`
- Auth: one of:
  - HTTP bearer
  - OAuth 2 (authorization code, authorization URL `https://api.tradingpal.io/oauth/authorize`, token URL `https://api.tradingpal.io/oauth/token`, scopes: `patterns`)

Adds the symbols in `add` to the tracked set and removes the ones in `remove`, leaving the rest alone; removals apply first. Every added symbol must be a ticker TradingPal knows and the result must fit the cap, otherwise nothing changes and the error names the offending symbols; names in `remove` that are not tracked are ignored. Send either list or both. Symbols are upper-cased and duplicates dropped. This also changes the user's My watchlist on the site. The agent tools add_tickers and remove_tickers call this.

## Headers

- `X-TradingPal-Client` string

## Request body

- object: The tickers to add and the tickers to remove; send either or both.
  - `add` string[]: Exchange symbols to start tracking, upper case (BRK.B). Each must be a ticker TradingPal knows; already tracked ones are ignored.
  - `remove` string[]: Exchange symbols to stop tracking; names not on the list are ignored.

## Response `200`

The tracked set as it stands

- Tickers: The account's tracked tickers: the account's My watchlist on the TradingPal site.
  - `api_version` 'v1', required: The contract version, always v1. Field names in v1 do not change, and v1 stays available at least 12 months after a v2 ships.
  - `as_of_session` string, date, nullable, required: The last trading session the data describes, as an ISO date. Setups change nightly, so say it when presenting data and do not cache setups across days. Null on routes that do not read a dated artifact (account, tickers, history, families, universe and the demo index).
  - `data_version` string, nullable: Identifier of the stored artifact the answer came from: the candidate-book generation for patterns, the sealed manifest for family records. Null when the route reads no versioned artifact.
  - `source` object, required: Who produced the data. Constant on every response.
    - `name` string: Always "TradingPal".
    - `url` string, uri: Always https://tradingpal.io.
  - `disclaimer` 'Educational breakout-pattern analysis from TradingPal, not investment advice. Past results do not guarantee future outcomes.', required: The educational-use disclaimer, constant on every response. Repeat it when presenting a setup as something the user might act on.
  - `tickers` object[]: The tracked tickers, in the order they were added.
    - `symbol` string: Exchange symbol, upper case.
    - `covered` boolean: True when the active nightly manifest covers the symbol, so the pattern and history routes can answer for it. False means it is tracked but the nightly has no data for it.
  - `count` integer: Number of tracked tickers.
  - `cap` integer: Maximum number of tickers the account may track.
  - `account` object: The TradingPal account the list belongs to, so a host can say which account is connected when the list is not the one the user expected.
    - `email` string: The account's sign-in email.

## Other responses

- `400`: bad_request (neither list sent, or a field is not a list), invalid_symbol (details.symbols), unknown_symbol (details.symbols) or ticker_cap_exceeded (details.cap, details.tracked, details.adding)
- `401`: missing_api_key (no Authorization: Bearer tp_live_… header) or invalid_api_key (unknown, revoked, or the account is inactive)
- `403`: forbidden (the account is not on Premium+, the plan with API access)
- `429`: rate_limited; wait details.retry_after_seconds

---

[API](https://skmtc.dev/tradingpal/apis/tradingpal-pattern-api.md) · [All operations](https://skmtc.dev/tradingpal/apis/tradingpal-pattern-api/llms.txt) · [OpenAPI document](https://skmtc.dev/tradingpal/apis/tradingpal-pattern-api/revisions/e96e1f20c1ce?raw)
