---
title: "Replace the tracked tickers (all-or-nothing)"
method: PUT
path: "/tickers"
tags: ["tickers"]
---

# Replace the tracked tickers (all-or-nothing)

`PUT /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`)

Replaces the whole tracked set with the symbols in the body, all or nothing: every symbol must be a ticker TradingPal knows and the list must fit the cap, otherwise nothing changes and the error names the offending symbols. Read GET /tickers first and include the tickers to keep. Symbols are upper-cased and duplicates dropped. This also rewrites the user's My watchlist on the site.

## Headers

- `X-TradingPal-Client` string

## Request body

- object: The full new tracked list.
  - `symbols` string[], required: The complete new list of exchange symbols, upper case (BRK.B). Every symbol must be a ticker TradingPal knows and the list must fit the cap; duplicates are dropped.

## Response `200`

The new tracked set

- 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 (symbols is not a list), invalid_symbol (details.symbols), unknown_symbol (details.symbols) or ticker_cap_exceeded (details.cap, details.sent)
- `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)
