{"openapi":"3.1.0","info":{"title":"Price Action API","version":"2026-10-23","summary":"Objective price action data, delivered as an API. Bar states and multi-timeframe trend agreement for trading bots, agents, and dashboards.","description":"Objective bar states (TheStrat 1, 2, 3 with failed breaks), above/below-open markers, and multi-timeframe continuity for SPY, QQQ, DIA, and IWM. Free API keys are issued instantly at sign-up with no credit card: 10 requests per minute and 1,000 per day.","contact":{"name":"345 Strategies","url":"https://345strategies.com","email":"hello@priceactionapi.com"},"license":{"name":"CC BY 4.0 (this API description only)","identifier":"CC-BY-4.0"},"x-provider":{"name":"345 Strategies","url":"https://345strategies.com"}},"externalDocs":{"description":"API docs","url":"https://priceactionapi.com/docs"},"servers":[{"url":"https://priceactionapi.com"}],"security":[{"bearerAuth":[]}],"tags":[{"name":"Bar states","description":"Objective bar classification and timeframe continuity."}],"paths":{"/v1/meta":{"get":{"operationId":"getMeta","tags":["Bar states"],"summary":"API status, coverage, and limits","description":"Returns supported symbols, timeframe aliases, defaults, rate limits, and the fields included in snapshots. Call this first.","responses":{"200":{"description":"Metadata.","headers":{"X-RateLimit-Limit":{"description":"Requests allowed per minute for this key.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"ISO 8601 time when the minute window resets.","schema":{"type":"string","format":"date-time"}},"X-RateLimit-Daily-Limit":{"description":"Requests allowed per day for this key.","schema":{"type":"integer"}},"X-RateLimit-Daily-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Meta"}}}},"401":{"description":"Missing, expired, or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/snapshot":{"get":{"operationId":"getSnapshot","tags":["Bar states"],"summary":"Current bar states by symbol and timeframe","description":"Returns the live bar state for each requested symbol and timeframe, plus continuity and plain-English interpretation notes per symbol.","parameters":[{"name":"symbols","in":"query","required":false,"description":"Comma-separated symbols. `symbol` is also accepted. Defaults to SPY.","schema":{"type":"string","default":"SPY"},"example":"SPY,QQQ"},{"name":"tf","in":"query","required":false,"description":"Comma-separated timeframes. `timeframes` and `timeframe` are also accepted, as are aliases such as daily, 60, and 15. Defaults to 15m.","schema":{"type":"string","default":"15m"},"example":"M,W,D,H1,30m,15m,5m"}],"responses":{"200":{"description":"Snapshot batch.","headers":{"X-RateLimit-Limit":{"description":"Requests allowed per minute for this key.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"ISO 8601 time when the minute window resets.","schema":{"type":"string","format":"date-time"}},"X-RateLimit-Daily-Limit":{"description":"Requests allowed per day for this key.","schema":{"type":"integer"}},"X-RateLimit-Daily-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SnapshotBatch"}}}},"400":{"description":"Unsupported symbol or timeframe.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, expired, or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Feed store temporarily unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Free API key from https://priceactionapi.com/sign-up, issued instantly."}},"schemas":{"Symbol":{"type":"string","enum":["SPY","QQQ","DIA","IWM"]},"Timeframe":{"type":"string","enum":["M","W","D","H1","30m","15m","5m"]},"Meta":{"type":"object","properties":{"type":{"const":"bar_state.meta"},"status":{"type":"string"},"timestamp":{"type":"string","format":"date-time"},"symbols":{"type":"array","items":{"$ref":"#/components/schemas/Symbol"}},"defaults":{"type":"object","properties":{"symbols":{"type":"array","items":{"type":"string"}},"timeframes":{"type":"array","items":{"type":"string"}}}},"timeframe_aliases":{"type":"object","properties":{"canonical":{"type":"array","items":{"$ref":"#/components/schemas/Timeframe"}},"accepted":{"type":"object","additionalProperties":{"type":"array","items":{"type":"string"}}}}},"rate_limits":{"type":"object","properties":{"free":{"type":"object","properties":{"requests_per_minute":{"type":"integer","example":10},"requests_per_day":{"type":"integer","example":1000}}}}},"included":{"type":"array","items":{"type":"string"}},"excluded":{"type":"array","items":{"type":"string"}},"market_hours_note":{"type":"string"}}},"BarState":{"type":"object","properties":{"cc":{"type":"string","description":"Current bar state: 1 (inside), 2u/2d (directional), 3 (outside). An F prefix marks a failed break, such as F2u.","example":"2u"},"c1":{"type":["string","null"],"description":"Prior bar state."},"open_sign":{"type":["string","null"],"enum":[">","<",null],"description":"> when price is above the bar's open, < when not."},"display":{"type":"string","description":"Compact display state, such as 2u, F2d, or 1>."},"combo_2bar":{"type":["string","null"]},"combo_3bar":{"type":["string","null"]},"took_c1h":{"type":["boolean","null"],"description":"Bar has traded above the prior bar's high."},"took_c1l":{"type":["boolean","null"],"description":"Bar has traded below the prior bar's low."},"above_prior_high":{"type":["boolean","null"]},"below_prior_low":{"type":["boolean","null"]},"trend":{"type":["string","null"],"description":"up, down, inside, or mixed."},"updated_at":{"type":"string","format":"date-time"},"status":{"const":"missing","description":"Present instead of the fields above when no data exists yet for this timeframe."}}},"SymbolUpdate":{"type":"object","properties":{"type":{"const":"bar_state.update"},"symbol":{"$ref":"#/components/schemas/Symbol"},"timeframes":{"type":"object","description":"Keyed by requested timeframe.","additionalProperties":{"$ref":"#/components/schemas/BarState"}},"continuity":{"type":"object","properties":{"display":{"type":"string","example":"D:2u 15m:1>"},"full_continuity":{"type":"string","enum":["bull","bear","none"],"description":"bull when every requested timeframe is above its open, bear when every one is below."}}},"interpretation":{"type":"array","items":{"type":"string"},"description":"Objective plain-English notes about the bar states."}}},"SnapshotBatch":{"type":"object","properties":{"type":{"const":"bar_state.snapshot_batch"},"status":{"type":"string","enum":["ok","warming_up"]},"symbols":{"type":"array","items":{"$ref":"#/components/schemas/Symbol"}},"timeframes":{"type":"array","items":{"$ref":"#/components/schemas/Timeframe"}},"timestamp":{"type":"string","format":"date-time"},"source":{"type":["string","null"]},"source_timestamp":{"type":["string","null"],"format":"date-time"},"live_during_market_hours":{"type":"boolean"},"market_hours_note":{"type":"string"},"provisional":{"type":"boolean"},"events":{"type":"object","description":"Keyed by symbol.","additionalProperties":{"$ref":"#/components/schemas/SymbolUpdate"}}}},"Error":{"type":"object","properties":{"type":{"const":"bar_state.error"},"error":{"type":"object","properties":{"code":{"type":"string","example":"unsupported_symbol"},"message":{"type":"string"}},"required":["code","message"]}}}}}}