---
title: "Import Holdings"
method: POST
path: "/watchlists/{watchlist_id}/import"
tags: ["watchlists"]
---

# Import Holdings

`POST /watchlists/{watchlist_id}/import`

## Request

- Base URL: `https://api.tickertrac.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.tickertrac.com/watchlists/{watchlist_id}/import`
- Auth: one of:
  - HTTP bearer
  - API key in header `X-API-Key`

Import the tickers from a brokerage holdings export.

Only symbols are read -- not quantity, cost basis or market value. The value here
is that the watchlist becomes the user's actual holdings rather than a list they
curated twice, and that lands with the symbols alone. A user may separately assert
an optional point-in-time portfolio percentage as private ranking context. The CSV
importer never derives it from brokerage balances, and TickerTrac does not use it
to recommend allocation changes.

Partial success is a real outcome, not an error. Onboarding a ticker that isn't
already in the shared corpus costs embedding spend and is quota'd at a handful per
day, so a thirty-position import will routinely run out partway. Failing the whole
request would mean the user gets nothing; instead everything importable is
imported and the remainder comes back named, to retry tomorrow.

## Path parameters

- `watchlist_id` integer, required

## Request body

- PortfolioImportIn
  - `csv` string, required

## Response `200`

Successful Response

- PortfolioImportOut
  - `added` string[], required
  - `already_present` string[], required
  - `skipped` string[], required
  - `deferred` string[], required
  - `tickers` string[], required

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/tickertrac/apis/tickerrag-api.md) · [All operations](https://skmtc.dev/tickertrac/apis/tickerrag-api/llms.txt) · [OpenAPI document](https://skmtc.dev/tickertrac/apis/tickerrag-api/revisions/3c7eb0f6425d?raw)
