Lookup First
Use /tickers/lookup to auto-populate company info before creating.
Manage stock symbols, configure data collection intervals, and track data fetch history.
| Method | Endpoint | Auth | Description |
|---|---|---|---|
POST | /tickers | No | Create ticker |
GET | /tickers | No | List tickers |
GET | /tickers/search | No | Search tickers |
GET | /tickers/lookup/{symbol} | No | Lookup from Polygon |
GET | /tickers/{symbol} | No | Get ticker details |
PUT | /tickers/{symbol} | No | Update ticker |
DELETE | /tickers/{symbol} | No | Delete ticker |
GET | /tickers/{symbol}/history | No | Get fetch history |
| Status | Description |
|---|---|
| ACTIVE | Actively collecting data |
| INACTIVE | Data collection paused |
| DELISTED | Stock no longer trading |
| ERROR | Data collection errors |
Add a new symbol to track.
POST /api/v1/tickersContent-Type: application/json
{ "symbol": "NVDA", "name": "NVIDIA Corporation", "exchange": "NASDAQ", "sector": "Technology", "industry": "Semiconductors", "status": "ACTIVE", "priority": 1, "provider": "massive", "track_intervals": ["1m", "1d"], "auto_collect": true, "notes": "AI/GPU leader"}{ "symbol": "NVDA", "name": "NVIDIA Corporation", "exchange": "NASDAQ", "sector": "Technology", "industry": "Semiconductors", "status": "ACTIVE", "priority": 1, "provider": "massive", "track_1min": true, "track_5min": false, "track_15min": false, "track_30min": false, "track_1h": false, "track_daily": true, "track_weekly": false, "track_monthly": false, "notes": "AI/GPU leader", "created_at": "2025-12-17T10:30:00Z"}| Field | Type | Required | Default | Description |
|---|---|---|---|---|
symbol | string | Yes | - | Stock ticker symbol |
name | string | No | - | Company name |
exchange | string | No | - | Stock exchange |
sector | string | No | - | Business sector |
industry | string | No | - | Industry classification |
status | string | No | ACTIVE | Ticker status |
priority | integer | No | 5 | Collection priority (1=highest) |
provider | string | No | massive | Data provider |
track_intervals | array | No | [“1d”] | Intervals to track |
auto_collect | boolean | No | true | Start collection immediately |
notes | string | No | - | Custom notes |
| Interval | Field | Description |
|---|---|---|
1m | track_1min | 1-minute bars |
5m | track_5min | 5-minute bars |
15m | track_15min | 15-minute bars |
30m | track_30min | 30-minute bars |
1h | track_1h | 1-hour bars |
1d | track_daily | Daily bars |
1w | track_weekly | Weekly bars |
1mo | track_monthly | Monthly bars |
Fetch ticker info from Polygon before adding.
GET /api/v1/tickers/lookup/NVDA{ "symbol": "NVDA", "name": "NVIDIA Corporation", "exchange": "NASDAQ", "sector": "Technology", "industry": "Semiconductors", "market_cap": 1250000000000, "description": "NVIDIA Corporation provides graphics, and compute and networking solutions..."}Get ticker with data point counts.
GET /api/v1/tickers/AAPL{ "symbol": "AAPL", "name": "Apple Inc.", "exchange": "NASDAQ", "sector": "Technology", "industry": "Consumer Electronics", "status": "ACTIVE", "priority": 1, "provider": "massive", "track_1min": true, "track_5min": false, "track_15min": true, "track_30min": false, "track_1h": false, "track_daily": true, "track_weekly": false, "track_monthly": false, "datapoint_counts": { "1m": 376095, "15m": 25000, "1d": 5000 }, "notes": "Core holding", "massive_data": { "cik": "0000320193", "composite_figi": "BBG000B9XRY4", "primary_exchange": "XNAS" }, "created_at": "2025-01-01T00:00:00Z", "updated_at": "2025-12-17T10:30:00Z"}| Field | Description |
|---|---|
datapoint_counts | Number of data points per interval |
massive_data | Extended data from Polygon API |
Search tickers by symbol or name.
GET /api/v1/tickers/search?query=apple&limit=10{ "results": [ {"symbol": "AAPL", "name": "Apple Inc."}, {"symbol": "APLE", "name": "Apple Hospitality REIT"} ], "count": 2}Get all tracked tickers with optional filtering.
GET /api/v1/tickers?status=ACTIVE&limit=100| Parameter | Type | Description |
|---|---|---|
status | string | Filter by status |
sector | string | Filter by sector |
provider | string | Filter by provider |
limit | integer | Max results (default: 100) |
offset | integer | Pagination offset |
View data collection history for a ticker.
GET /api/v1/tickers/AAPL/history{ "history": [ { "id": "bb0e8400-e29b-41d4-a716-446655440000", "symbol": "AAPL", "interval": "1m", "status": "COMPLETED", "provider": "massive", "records_fetched": 376095, "is_full_history": true, "start_date": "2023-11-24", "end_date": "2025-11-22", "started_at": "2025-12-15T02:00:00Z", "completed_at": "2025-12-15T02:15:00Z", "error_message": null }, { "id": "bb0e8400-e29b-41d4-a716-446655440001", "symbol": "AAPL", "interval": "1d", "status": "COMPLETED", "provider": "massive", "records_fetched": 5000, "is_full_history": true, "started_at": "2025-12-15T02:20:00Z", "completed_at": "2025-12-15T02:21:00Z", "error_message": null } ]}| Status | Description |
|---|---|
PENDING | Scheduled, not started |
IN_PROGRESS | Currently fetching |
COMPLETED | Successfully finished |
FAILED | Error occurred |
PARTIAL | Partially completed |
Modify ticker configuration.
PUT /api/v1/tickers/AAPLContent-Type: application/json
{ "status": "ACTIVE", "priority": 1, "track_intervals": ["1m", "15m", "1d"], "notes": "Updated tracking intervals"}const api = axios.create({ baseURL: 'http://localhost:8501/api/v1'});
// Lookup and create tickerasync function addTicker(symbol) { // First lookup to get company info const { data: info } = await api.get(`/tickers/lookup/${symbol}`);
// Create ticker with auto-populated data const { data: ticker } = await api.post('/tickers', { symbol: info.symbol, name: info.name, exchange: info.exchange, sector: info.sector, industry: info.industry, status: 'ACTIVE', priority: 1, track_intervals: ['1m', '1d'], auto_collect: true });
console.log(`Added ${ticker.symbol}: ${ticker.name}`); return ticker;}
// Get tickers with data countsasync function getTickersWithData() { const { data: tickers } = await api.get('/tickers', { params: { status: 'ACTIVE' } });
console.log('Active tickers:'); for (const ticker of tickers) { const counts = ticker.datapoint_counts || {}; const total = Object.values(counts).reduce((a, b) => a + b, 0); console.log(` ${ticker.symbol}: ${total.toLocaleString()} data points`); }
return tickers;}
// Check fetch historyasync function checkFetchStatus(symbol) { const { data } = await api.get(`/tickers/${symbol}/history`);
console.log(`\nFetch history for ${symbol}:`); for (const fetch of data.history.slice(0, 5)) { const status = fetch.status === 'COMPLETED' ? '✅' : '❌'; console.log(` ${status} ${fetch.interval}: ${fetch.records_fetched.toLocaleString()} records`); }}
// Usageawait addTicker('NVDA');await getTickersWithData();await checkFetchStatus('AAPL');import requestsfrom typing import List, Dict, Optional
class TickerManager: def __init__(self, base_url: str): self.base_url = base_url
def lookup(self, symbol: str) -> Dict: """Lookup ticker info from Polygon.""" response = requests.get(f"{self.base_url}/tickers/lookup/{symbol}") response.raise_for_status() return response.json()
def create( self, symbol: str, intervals: List[str] = ["1d"], auto_collect: bool = True ) -> Dict: """Create a new ticker.""" # Lookup first info = self.lookup(symbol)
response = requests.post( f"{self.base_url}/tickers", json={ "symbol": symbol, "name": info.get("name"), "exchange": info.get("exchange"), "sector": info.get("sector"), "industry": info.get("industry"), "status": "ACTIVE", "track_intervals": intervals, "auto_collect": auto_collect } ) response.raise_for_status() return response.json()
def list_active(self) -> List[Dict]: """List all active tickers.""" response = requests.get( f"{self.base_url}/tickers", params={"status": "ACTIVE"} ) response.raise_for_status() return response.json()
def get_history(self, symbol: str) -> List[Dict]: """Get fetch history for a ticker.""" response = requests.get(f"{self.base_url}/tickers/{symbol}/history") response.raise_for_status() return response.json()["history"]
def get_data_summary(self) -> Dict[str, int]: """Get total data points per ticker.""" tickers = self.list_active() summary = {}
for ticker in tickers: counts = ticker.get("datapoint_counts", {}) total = sum(counts.values()) summary[ticker["symbol"]] = total
return summary
# Usagemanager = TickerManager("http://localhost:8501/api/v1")
# Add new tickerticker = manager.create("NVDA", intervals=["1m", "1d"])print(f"Added {ticker['symbol']}")
# List active tickersactive = manager.list_active()print(f"Active tickers: {len(active)}")
# Data summarysummary = manager.get_data_summary()for symbol, count in sorted(summary.items(), key=lambda x: -x[1])[:10]: print(f" {symbol}: {count:,} data points")
# Check fetch historyhistory = manager.get_history("AAPL")for fetch in history[:5]: status = "✅" if fetch["status"] == "COMPLETED" else "❌" print(f" {status} {fetch['interval']}: {fetch['records_fetched']:,} records")Lookup First
Use /tickers/lookup to auto-populate company info before creating.
Priority Planning
Assign higher priority (lower number) to frequently traded symbols.
Interval Selection
Only track intervals you actually need to save storage and API calls.
Monitor History
Regularly check fetch history to catch collection errors early.