# TickerAPI — Complete Documentation > Financial APIs built for AI agents. Pre-computed, categorical market intelligence — no OHLCV parsing, no infrastructure. TickerAPI provides pre-computed, categorical market data designed for LLMs and AI agents. Every response contains verifiable facts expressed as categorical bands (e.g. "oversold", not "RSI: 24"). This vocabulary maps directly to how LLMs reason about markets. ## Base URL https://api.tickerapi.ai/v1 ## Coverage - Asset Classes: US Stocks, Crypto (with USD suffix: BTCUSD, ETHUSD), ETFs - Timeframes: Daily, Weekly - Update Frequency: End-of-day (EOD), refreshes daily around 00:30 UTC - Response Format: JSON - Authentication: Bearer token --- ## Authentication All API requests require a Bearer token in the Authorization header: Authorization: Bearer YOUR_API_KEY All plans allow unlimited API keys. Error responses: - 401 Unauthorized: Missing or invalid Bearer token - 403 Forbidden: Endpoint requires higher tier (includes upgrade_url) --- ## Common Parameters All endpoints accept: - ticker (string, required on per-asset endpoints): Asset symbol, uppercase, crypto requires USD suffix - timeframe (string): "daily" or "weekly"; default: "daily" - asset_class (string): "stock", "crypto", "etf", or "all"; auto-detected on per-asset endpoints - date (string): ISO 8601 date (YYYY-MM-DD) for historical snapshot; Plus: last 30 days, Pro: full backfill - limit (integer): Max results on scan endpoints; default: 20, max: 50 All responses include a data_status field (currently always "eod"). --- ## Endpoints ### GET /v1/summary/{ticker} Full factual snapshot for a single asset: trend, momentum, volatility, volume, support/resistance, fundamentals. Tier access: Free (core technical), Plus (+ support/resistance + basic fundamentals), Pro (+ sector context + advanced fundamentals). Parameters: - ticker (required): Asset symbol (e.g., AAPL, BTCUSD) - timeframe (optional): "daily" or "weekly", default: "daily" - date (optional): ISO 8601 date for historical snapshot Response sections: Identification: ticker, timeframe, asset_class, sector, data_status, performance performance: sharp_decline | moderate_decline | slight_decline | flat | slight_gain | moderate_gain | sharp_gain Per-ticker percentile-based. Thresholds are derived from each asset's own historical return distribution. trend: - direction: strong_uptrend | uptrend | neutral | downtrend | strong_downtrend - duration_days: integer - ma_alignment: aligned_bullish | mixed | aligned_bearish - distance_from_ma_band: object with ma_20, ma_50, ma_200 each being far_above | moderately_above | slightly_above | slightly_below | moderately_below | far_below - volume_confirmation: confirmed | diverging | neutral momentum: - rsi_zone: deep_oversold | oversold | neutral_low | neutral | neutral_high | overbought | deep_overbought - stochastic_zone: same scale as rsi_zone - rsi_stochastic_agreement: boolean - macd_state: expanding_positive | contracting_positive | expanding_negative | contracting_negative - direction: accelerating | steady | decelerating | bullish_reversal | bearish_reversal - divergence_detected: boolean - divergence_type: string or null extremes: - condition: deep_oversold | oversold | overbought | deep_overbought | normal - days_in_condition: integer - historical_median_duration: integer - historical_max_duration: integer - occurrences_1yr: integer - condition_percentile: 0-100 - condition_rarity: extremely_rare | very_rare | rare | uncommon | occasional | common volatility: - regime: low | normal | above_normal | high | extreme - regime_trend: compressing | stable | expanding - squeeze_active: boolean - squeeze_days: integer - historical_avg_squeeze_duration: integer volume: - ratio_band: extremely_low | low | normal | above_average | high | extremely_high - percentile: 0-100 - accumulation_state: strong_accumulation | accumulation | neutral | distribution | strong_distribution - climax_detected: boolean - climax_type: string or null support_level / resistance_level (null if not found): - level_price: number - status: intact | approaching | breached - distance_band: at_level | very_close | near | moderate | far | very_far - touch_count, held_count, broke_count: integers - consecutive_closes_beyond: integer - last_tested_days_ago: integer - type: horizontal | ma_derived - volume_at_tests_band: string range_position: lower_third | mid_range | upper_third sector_context (Pro only, stocks only): - sector_rsi_zone, sector_trend - asset_vs_sector_rsi: weaker | aligned | stronger - asset_vs_sector_trend: weaker | aligned | stronger - sector_oversold_count, sector_total_count fundamentals (stocks only, omitted for crypto/ETFs): Plus tier: - valuation_zone: deep_value | undervalued | fair_value | overvalued | deeply_overvalued - growth_zone: high_growth | moderate_growth | stable | slowing | shrinking - earnings_proximity: within_days | this_week | this_month | next_month | not_soon - analyst_consensus: strong_buy | buy | hold | sell | strong_sell Pro tier adds: - valuation_percentile, valuation_rarity, pe_vs_historical_zone, pe_vs_sector_zone, pb_vs_historical_zone - revenue_growth_direction, eps_growth_direction: accelerating | steady | decelerating | deteriorating - last_earnings_surprise: big_beat | beat | met | missed | big_miss - analyst_consensus_direction: upgrading | stable | downgrading Band Stability Metadata: Every categorical band field (e.g. rsi_zone, trend_direction, volatility_regime) has a sibling _meta object that describes how stable the current value is. For example, rsi_zone_meta sits next to rsi_zone. _meta fields: - stability: fresh | holding | established | volatile - periods_in_current_state: integer (days for daily timeframe, weeks for weekly) - flips_recent: integer (number of state changes in the lookback window) - flips_lookback: string (e.g. "30d" or "12w") - timeframe: "daily" or "weekly" Tier access: - Free: no stability metadata - Plus/Pro: full _meta object with all fields --- ### GET /v1/compare Side-by-side factual comparison of 2-50 assets. Tier limits: Free (up to 5 tickers), Plus (up to 25 tickers), Pro (up to 50 tickers). Parameters: - tickers (required): Comma-separated symbols (e.g., AAPL,MSFT,TSLA) - timeframe (optional): "daily" or "weekly", default: "daily" - date (optional): Plus: 30 days, Pro: full backfill Response: - summaries: Object keyed by ticker, each containing the full summary object - comparison: Cross-asset comparison containing: - performances, rsi_zones, trend_directions, volume_ratio_bands, extremes_conditions, range_positions - condition_percentiles, valuation_zones (stocks only), growth_zones (stocks only), analyst_consensuses (stocks only) - divergences: array of objects with type and description - tickers_requested, tickers_found, data_status --- ### POST /v1/watchlist Batch check multiple tickers with compact snapshots for portfolio monitoring. Tier limits: Free (up to 10 tickers), Plus (up to 50 tickers), Pro (up to 100 tickers). Request body: { "tickers": ["AAPL", "MSFT"], "timeframe": "daily" } Response array items: - ticker, asset_class - trend_direction, rsi_zone, volume_ratio_band - extremes_condition, days_in_extreme, condition_rarity - squeeze_active - support_level_price, support_level_distance - resistance_level_price, resistance_level_distance - valuation_zone (stocks only), earnings_proximity (stocks only), analyst_consensus (stocks only) - notable_changes: array of change descriptions Envelope: watchlist (array), tickers_requested, tickers_found, data_status --- ### GET /v1/watchlist/changes Field-level state changes for your saved watchlist tickers since the last pipeline run. Available on all tiers. Returns the same structured diff data that webhooks deliver. Parameters: timeframe (daily or weekly, default daily) Response: - timeframe: "daily" or "weekly" - run_date: pipeline run date (YYYY-MM-DD) - changes: { "AAPL": [{"field": "rsi_zone", "from": "neutral", "to": "oversold", "stability": "fresh", "periods_in_current_state": 1, "flips_recent": 3, "flips_lookback": "30d"}, ...], ... } - tickers_checked: number of tickers in your watchlist - tickers_changed: number of tickers with at least one change Tracked fields: rsi_zone, macd_state, momentum_direction, divergence_detected, trend_direction, volume_ratio_band, accumulation_state, squeeze_active, extreme_condition, breakout_type, fundamentals.valuation_zone, fundamentals.analyst_consensus, fundamentals.analyst_consensus_direction, fundamentals.earnings_proximity, fundamentals.last_earnings_surprise, fundamentals.growth_zone --- ### GET /v1/events Search for historical band transition events for a ticker. Every time a categorical band value changes (e.g. RSI moving from oversold to deep_oversold), a transition event is recorded. Query those events with optional aftermath performance data showing what happened afterward. Use cases: - "When was AAPL last deep_oversold?" - "How many times has TSLA entered strong_uptrend this year?" - "What happened after NVDA's last overbought reading?" Parameters: - ticker (required): Asset ticker symbol (e.g. AAPL) - field (required): Band field name (e.g. rsi_zone, trend_direction). See Supported Fields below - timeframe (optional): "daily" (default) or "weekly" - band (optional): Filter to a specific band value (e.g. deep_oversold) - limit (optional): Max results (1-100, default 10) - before (optional): Return events before this date (YYYY-MM-DD) - after (optional): Return events after this date (YYYY-MM-DD) - context_ticker (optional): A second ticker to correlate against. Requires context_field and context_band. Plus/Pro only - context_field (optional): The band field to check on the context ticker (e.g. trend_direction) - context_band (optional): Only return events where the context ticker was in this band on the event date Cross-asset correlation: Filter events by what a second ticker was doing on the same date. Useful for questions like "When was AAPL oversold while SPY was in downtrend?" or "NVDA strong_uptrend events where SMH was also in uptrend." Costs 2 credits per request. Plus/Pro only. Tier access: - Free: Technical fields only, 90 days lookback, no aftermath - Plus: + Basic fundamentals, 2 years lookback, + aftermath data, + cross-asset correlation - Pro: + Advanced fundamentals, 5 years lookback, + aftermath data, + cross-asset correlation Supported fields: - Technical (Free): rsi_zone, trend_direction, ma_alignment, volume_ratio_band, accumulation_state, volatility_regime, macd_state, support_status, resistance_status - Basic Fundamentals (Plus): valuation_zone, growth_zone, earnings_proximity, analyst_consensus - Advanced Fundamentals (Pro): pe_vs_historical, pe_vs_sector, revenue_growth_direction, eps_growth_direction, earnings_surprise, analyst_consensus_direction, insider_activity_zone, net_direction Response: - ticker, field, timeframe - events: array of event objects - total_occurrences: integer - query_range: string (e.g. "5y") Event object: - date: YYYY-MM-DD - band: current band value - prev_band: previous band value - duration_days: integer, daily timeframe (null if still active) - duration_weeks: integer, weekly timeframe (null if still active) - stability_at_entry: stability label at the time of the event (Plus/Pro only) - flips_recent_at_entry: integer, state changes in lookback window at time of event (Plus/Pro only) - flips_lookback: string (e.g. "30d" or "12w") (Plus/Pro only) - aftermath: object with performance at lookahead windows (null for Free tier or recent events) When cross-asset correlation is used, the response also includes: - context: object with ticker, field, and band describing the filter applied Aftermath windows: - Daily: 5d, 10d, 20d, 50d, 100d - Weekly: 2w, 4w, 8w, 12w, 16w Aftermath performance bands (per-ticker percentile-based): - sharp_decline (Bottom 5%), moderate_decline (5th-20th), slight_decline (20th-40th), flat (40th-60th), slight_gain (60th-80th), moderate_gain (80th-95th), sharp_gain (Top 5%) --- ### GET /v1/assets Full supported asset list with metadata. Available on all tiers. Does not count against rate limits. Response: - assets: array of { ticker, name, asset_class, sector, exchange } - total_count: integer - asset_classes: { stock, crypto, etf } counts --- ### GET /v1/list/sectors List all valid sector values with asset counts. Available on all tiers. Does not count against rate limits. Response: - sectors: array of { name, asset_count }, sorted by asset count descending - total_sectors: integer Use the returned sector names with the sector parameter on any scan endpoint. The parameter is case-insensitive. --- ### GET /v1/account Check your plan tier, rate limits, and current API usage. Useful for agents that need to check remaining quota before making requests. Response: - tier: "free", "plus", or "pro" - tier_full: Full tier including commercial suffix if applicable - email: Account email - limits: { daily_requests, hourly_requests, compare_limit, watchlist_limit, history_days } - usage: { daily_requests_used, daily_requests_remaining, hourly_requests_used, hourly_requests_remaining } --- ### GET /v1/scan/breakouts Find assets testing or breaking key support/resistance levels. Parameters: - asset_class (optional): "stock", "crypto", "etf", or "all"; default: "all" - sector (optional): Filter by sector - direction (optional): "bullish" (resistance), "bearish" (support), or "all"; default: "all" - sort_by (optional): "volume_ratio", "level_strength", or "condition_percentile"; default: "volume_ratio" - limit (optional): default: 20, max: 50 - timeframe (optional): "daily" or "weekly"; default: "daily" - date (optional): Plus+ Free tier response: ticker, asset_class, breakout_type, condition_rarity, sector breakout_type values: resistance_break | support_break | resistance_test | support_test Plus adds: level_price, level_type (horizontal | trendline | ma_derived), level_touch_count, held_count, broke_count, volume_ratio_band, rsi_zone, trend_context, earnings_proximity, growth_zone Pro adds: squeeze_context (active_squeeze | squeeze_released | no_squeeze), volume_vs_prior_breakouts (stronger | similar | weaker), sector_breakout_count, sector_total_count Envelope: matches (array), total_scanned, match_count, data_status --- ### GET /v1/scan/oversold Find assets in oversold conditions with per-asset historical context. Parameters: - asset_class (optional): "stock", "crypto", "etf", or "all"; default: "all" - sector (optional): Filter by sector - min_severity (optional): "oversold" or "deep_oversold"; default: "oversold" - sort_by (optional): "severity", "days_oversold", or "condition_percentile"; default: "severity" - limit (optional): default: 20, max: 50 - timeframe (optional): "daily" or "weekly"; default: "daily" - date (optional): Plus+ Free tier response: ticker, asset_class, rsi_zone, condition_rarity, sector, valuation_zone (stocks only) Plus adds: stochastic_zone, days_in_oversold, oversold_streaks_count, volume_context (spike | above_average | normal | below_average), volume_ratio_band, trend_context, nearest_support_distance, sector_rsi_zone, earnings_proximity, growth_zone, analyst_consensus, rsi_zone_stability, rsi_zone_flips_recent Pro adds: accumulation_state, historical_median_oversold_days, historical_max_oversold_days, sector_agreement, sector_oversold_count, sector_total_count Envelope: matches, total_scanned, match_count, data_status --- ### GET /v1/scan/overbought Find assets in overbought conditions with per-asset historical context. Parameters: - asset_class (optional): "stock", "crypto", "etf", or "all"; default: "all" - sector (optional): Filter by sector - market_cap_tier (optional): "nano", "micro", "small", "mid", "large", "mega", "ultra_mega" - min_severity (optional): "overbought" or "deep_overbought"; default: "overbought" - sort_by (optional): "severity", "days_overbought", or "condition_percentile"; default: "severity" - limit (optional): default: 20, max: 100 - timeframe (optional): "daily" or "weekly"; default: "daily" - date (optional): Plus+ Free tier response: ticker, asset_class, rsi_zone, condition_rarity, sector, market_cap_tier, valuation_zone (stocks only) Plus adds: stochastic_zone, days_in_overbought, overbought_streaks_count, volume_context (spike | above_average | normal | below_average), volume_ratio_band, trend_context, nearest_resistance_distance, sector_rsi_zone, earnings_proximity, growth_zone, analyst_consensus, rsi_zone_stability, rsi_zone_flips_recent Pro adds: distribution_state, historical_median_overbought_days, historical_max_overbought_days, sector_agreement, sector_overbought_count, sector_total_count Envelope: matches, total_scanned, match_count, data_status --- ### GET /v1/scan/unusual-volume Find assets trading at significantly abnormal volume levels. Parameters: - asset_class (optional): "stock", "crypto", "etf", or "all"; default: "all" - sector (optional): Filter by sector - min_ratio_band (optional): "above_average", "high", or "extremely_high"; default: "above_average" - sort_by (optional): "volume_percentile"; default: "volume_percentile" - limit (optional): default: 20, max: 50 - timeframe (optional): "daily" or "weekly"; default: "daily" - date (optional): Plus+ Free tier response: ticker, asset_class, volume_ratio_band, condition_rarity, sector Plus adds: volume_percentile, price_direction_on_volume (up | down | flat), consecutive_elevated_days, rsi_zone, trend_context, nearest_level_distance, nearest_level_type, earnings_proximity, last_earnings_surprise, volume_stability, volume_flips_recent Pro adds: accumulation_state, historical_avg_elevated_streak, sector_elevated_volume_count, sector_total_count Envelope: matches, total_scanned, match_count, data_status --- ### GET /v1/scan/valuation Find stocks at historically abnormal valuations. Stocks only (no crypto/ETFs). Parameters: - sector (optional): Filter by sector - direction (optional): "undervalued", "overvalued", or "all"; default: "all" - min_severity (optional): "undervalued" or "deep_value" for cheap, "overvalued" or "deeply_overvalued" for expensive - sort_by (optional): "valuation_percentile", "pe_vs_history", or "growth_zone"; default: "valuation_percentile" - limit (optional): default: 20, max: 50 - date (optional): Plus+ Free tier response: ticker, sector, valuation_zone, valuation_rarity, growth_zone, analyst_consensus Plus adds: revenue_growth_direction, eps_growth_direction, earnings_proximity, rsi_zone, trend_context, sector_valuation_zone, sector_agreement, valuation_stability, valuation_flips_recent Pro adds: pe_vs_historical_zone, pe_vs_sector_zone, pb_vs_historical_zone, last_earnings_surprise, analyst_consensus_direction Envelope: matches, total_scanned, match_count, data_status --- ### GET /v1/scan/insider-activity Find stocks with significant insider buying or selling (SEC Form 4 filings). Stocks only (no crypto/ETFs). Parameters: - direction (optional): "all", "buying", or "selling"; default: "all" - sector (optional): Filter by sector - sort_by (optional): "zone_severity", "shares_volume", or "net_ratio"; default: "zone_severity" - limit (optional): default: 20, max: 50 - timeframe (optional): "daily" or "weekly"; default: "daily" - date (optional): Plus+ insider_activity_zone values: heavy_buying | moderate_buying | neutral | moderate_selling | heavy_selling net_direction values: strong_buying | buying | neutral | selling | strong_selling Free tier response: ticker, sector, insider_activity_zone, net_direction Plus adds: quarter, buy_count, sell_count, shares_bought, shares_sold, rsi_zone, trend_context, volume_ratio_band, valuation_zone, earnings_proximity, insider_stability, insider_flips_recent Envelope: matches, total_scanned, match_count, data_status --- ### Webhooks — GET/POST/PUT/DELETE /v1/webhooks Register webhook URLs to receive push notifications after each daily and weekly pipeline run instead of polling. Tier limits: Free (no webhooks), Plus (1 URL), Pro (3 URLs), Commercial Plus (3 URLs), Commercial Pro (5 URLs). Event types: - watchlist.changes: Structured field-level diffs for tickers on your watchlist. Enabled by default on creation. Only fires when at least one field has changed. - data.ready: Simple notification that fresh data has been computed and is available via the API. Opt-in. Each webhook delivery counts as one API request against your daily allowance. GET /v1/webhooks — List all registered webhooks Response: webhooks (array of { id, url, events, active, created_at, updated_at }), webhook_count, webhook_limit POST /v1/webhooks — Register a new webhook Request body: { url (required, HTTPS), events (optional, object) } Response: { id, url, secret, events, active, created_at } The secret is returned only on creation. Use it for HMAC-SHA256 signature verification. PUT /v1/webhooks — Update a webhook Request body: { id (required), events (optional), active (optional) } Response: { updated, id } DELETE /v1/webhooks — Delete a webhook Request body: { id (required) } Response: { deleted, webhook_count } Tracked fields in watchlist.changes payloads: rsi_zone, macd_state, momentum_direction, divergence_detected, trend_direction, volume_ratio_band, accumulation_state, squeeze_active, extreme_condition, breakout_type, fundamentals.valuation_zone, fundamentals.analyst_consensus, fundamentals.analyst_consensus_direction, fundamentals.earnings_proximity, fundamentals.last_earnings_surprise, fundamentals.growth_zone Signature verification: Verify payloads using the X-Webhook-Signature header (HMAC-SHA256 hex digest of the raw request body using your webhook secret). --- ## Categorical Bands Reference All indicator-derived data is expressed as categorical zones. This is the complete vocabulary. RSI Zones: deep_oversold, oversold, neutral_low, neutral, neutral_high, overbought, deep_overbought Stochastic Zones: deep_oversold, oversold, neutral_low, neutral, neutral_high, overbought, deep_overbought Trend Direction: strong_uptrend, uptrend, neutral, downtrend, strong_downtrend MA Alignment: aligned_bullish, mixed, aligned_bearish MA Distance: far_above, moderately_above, slightly_above, slightly_below, moderately_below, far_below Volume Ratio: extremely_low, low, normal, above_average, high, extremely_high Accumulation State: strong_accumulation, accumulation, neutral, distribution, strong_distribution Volatility Regime: low, normal, above_normal, high, extreme Volatility Trend: compressing, stable, expanding Support/Resistance Distance: at_level, very_close, near, moderate, far, very_far Support/Resistance Status: intact, approaching, breached MACD State: expanding_positive, contracting_positive, expanding_negative, contracting_negative Momentum Direction: accelerating, steady, decelerating, bullish_reversal, bearish_reversal Extremes Condition: deep_oversold, oversold, overbought, deep_overbought, normal Performance: sharp_decline, moderate_decline, slight_decline, flat, slight_gain, moderate_gain, sharp_gain (per-ticker percentile-based) Condition Rarity: extremely_rare, very_rare, rare, uncommon, occasional, common Range Position: lower_third, mid_range, upper_third Valuation Zone: deep_value, undervalued, fair_value, overvalued, deeply_overvalued P/E vs. Historical: historic_low, below_average, average, above_average, historic_high P/E vs. Sector: deep_discount, discount, aligned, premium, deep_premium Growth Zone: high_growth, moderate_growth, stable, slowing, shrinking Growth Direction: accelerating, steady, decelerating, deteriorating Earnings Proximity: within_days, this_week, this_month, next_month, not_soon Earnings Surprise: big_beat, beat, met, missed, big_miss Analyst Consensus: strong_buy, buy, hold, sell, strong_sell Analyst Consensus Direction: upgrading, stable, downgrading Volume Context (Scans Only): spike, above_average, normal, below_average Breakout Type (Scans Only): resistance_break, resistance_test, support_break, support_test Squeeze Context (Scans Only): active_squeeze, squeeze_released, no_squeeze Price Direction on Volume: up, down, flat Insider Activity Zone: heavy_buying, moderate_buying, neutral, moderate_selling, heavy_selling, no_activity Net Direction (Insider): strong_buying, buying, neutral, selling, strong_selling Market Cap Tier: nano, micro, small, mid, large, mega, ultra_mega --- ## Band Stability Band stability metadata tells you how trustworthy a categorical band value is. Every band field has a sibling _meta object (e.g. rsi_zone_meta next to rsi_zone) with stability information. Stability categories: - fresh: The band just changed (1 period in current state). Treat with caution since the value may flip back. - holding: The band has persisted for a short time (2-4 periods). Gaining confidence but not yet established. - established: The band has held for 5+ periods. High confidence that this reflects a real state. - volatile: The band has flipped frequently in the recent lookback window (3+ flips). The value is unstable regardless of how long the current state has lasted. _meta object fields: - stability: fresh | holding | established | volatile - periods_in_current_state: integer (days for daily, weeks for weekly) - flips_recent: integer (state changes in the lookback window) - flips_lookback: string (e.g. "30d" or "12w") - timeframe: "daily" or "weekly" Tier access: - Free: no stability metadata - Plus/Pro: full _meta object Where stability appears: - Summary endpoint: _meta sibling on every band field - Events endpoint: stability_at_entry (Plus/Pro), flips_recent_at_entry + flips_lookback (Plus/Pro) - Watchlist changes: stability, periods_in_current_state, flips_recent, flips_lookback on each change object - Scans (oversold, overbought, unusual-volume, valuation, insider-activity): *_stability + *_flips_recent (Plus/Pro). Not included on breakouts scan. --- ## Rate Limits Daily limits by tier: - Free: 250 requests - Plus (Individual): 50,000 requests - Pro (Individual): 100,000 requests - Plus (Commercial): 250,000 requests - Pro (Commercial): 500,000 requests Hourly limits by tier: - Free: 100 - Plus: 5,000 / Pro: 10,000 - Plus Commercial: 25,000 / Pro Commercial: 50,000 Counting rules: - Each API call = 1 request (regardless of result count) - /v1/assets and /v1/list/sectors never count - HTTP 304 (conditional/cached) responses don't count - Each webhook delivery counts as 1 request - Daily limits reset at midnight UTC - Hourly limits reset at top of each UTC hour Rate limit headers on every response: - X-Request-Limit, X-Requests-Used, X-Requests-Remaining, X-Request-Reset - X-Hourly-Request-Limit, X-Hourly-Requests-Used, X-Hourly-Requests-Remaining, X-Hourly-Request-Reset Rate limit exceeded: HTTP 429, error type "rate_limit_exceeded", includes upgrade_url and reset time. --- ## Errors Error response format: { "error": { "type": "...", "message": "..." } } Error codes: - 400: invalid_parameter - 401: unauthorized - 403: tier_restricted (includes upgrade_url) - 404: not_found - 429: rate_limit_exceeded (includes upgrade_url and reset time) - 500: internal_error - 503: data_unavailable ## Caching - Daily timeframe: Refreshes after market close (~5:15 PM ET) - Weekly timeframe: Refreshes after Friday close - Cache-Control and ETag headers included on all responses - 304 Not Modified responses do not count against rate limits - Use ETag with If-None-Match header for conditional requests --- ## Pricing Free: $0/month — 250 req/day (100/hr), core technical data, 3 months historical data, compare up to 5 assets, watchlist up to 10 assets Plus: $25/month (individual) / $100/month (commercial) — 50K-250K req/day, support/resistance, basic fundamentals, 2 years historical data, compare up to 25-100 assets, watchlist up to 50-200 assets, 1-3 webhook URLs Pro: $50/month (individual) / $200/month (commercial) — 100K-500K req/day, sector context, advanced fundamentals, 5 years historical data, compare up to 50-200 assets, watchlist up to 100-400 assets, 3-5 webhook URLs Beta: All users get Pro-tier access free during beta. No credit card required. Commercial tiers launching Q3 2026. --- ## MCP Integration TickerAPI exposes all endpoints as MCP tools for use with Claude Desktop, Cursor, Windsurf, and any MCP-compatible client. Install via npm: @anthropic/tickerapi-mcp. ## SDKs - Python: tickerapi-sdk-python - JavaScript/TypeScript: tickerapi-sdk-js - Go: tickerapi-sdk-go