---
title: "Technical Analysis"
method: GET
path: "/technicals/{symbol}"
tags: ["technicals"]
---

# Technical Analysis

`GET /technicals/{symbol}`

## Request

- Base URL: `https://mcp.f1ow.com/v1`
- URL: `https://mcp.f1ow.com/v1/technicals/{symbol}`
- Auth: one of:
  - HTTP bearer
  - none

Multi-timeframe technical-analysis snapshot for one coin, computed locally from real candles (not a vendor black box): per interval — last close, RSI(14), EMA20/50/200 + SMA200, MACD(12,26,9) with signal/histogram/cross freshness, ATR(14) with 2xATR stop suggestions (feed research_trade_plan), Bollinger(20,2) with %B and bandwidth, ADX(14) with +DI/-DI, volume vs 20-candle average, and a transparent trend rule (EMA alignment qualified by ADX). 'intervals' picks the timeframes (default 1h,4h,1d; max 4 of 1m|5m|15m|30m|1h|4h|12h|1d|1w); 'market' routes candles (spot|perp|auto, default auto: spot preferred; perp when spot fails or a recent spot listing has too little history for the indicators). Support/resistance comes from the same candles: daily swing highs/lows over the last year, clustered within half a daily ATR, nearest 3 on each side with distance, swing count and last touch, plus the year's range. For levels from executed perp flow (volume at price, liquidations, OI), use flow_levels.

## Path parameters

- `symbol` string, required: Coin symbol, e.g. 'ETH' or 'BTC'

## Query parameters

- `intervals` string[]: Candle intervals to analyze, e.g. ["4h","1d"]. Default ["1h","4h","1d"]; max 4 of 1m|5m|15m|30m|1h|4h|12h|1d|1w
- `market` string: Which candle series: 'spot', 'perp', or 'auto' (default: spot preferred; perp when spot fails or its history is too short)

## Response `200`

The result.

- object
  - `data` object
    - `symbol` string, required
    - `lastPriceUsd` number, required: Newest close of the finest analyzed timeframe
    - `timeframes` object[], required
      - `interval` string
      - `market` string: 'spot' or 'perp' — series actually delivered
      - `source` string: Candle provider that answered
      - `closedCandles` integer
      - `droppedPartialCandle` boolean: True when a still-forming newest candle was excluded
      - `asOfMs` integer: Open time of the newest closed candle, Unix epoch ms
      - `asOfAt` string: Same instant, ISO-8601 UTC
      - `lastCloseUsd` number
      - `rsi14` number: Wilder RSI, 0-100; omitted without 15 closed candles
      - `ema20Usd` number
      - `ema50Usd` number
      - `ema200Usd` number
      - `sma200Usd` number
      - `macd` object
        - `macd` number
        - `signal` number
        - `histogram` number: macd - signal; sign is the cross state
        - `aboveSignal` boolean
        - `candlesSinceCross` integer: 1 = crossed on the newest closed candle; omitted when no cross in window
      - `atr14Usd` number: Wilder ATR(14), USD
      - `atr14Pct` number: ATR(14) as % of last close — stop-sizing form
      - `bollinger` object
        - `middleUsd` number
        - `upperUsd` number
        - `lowerUsd` number
        - `percentB` number: Close inside the band: 0 = lower, 1 = upper
        - `bandwidthPct` number: Band width as % of middle — squeeze measure
      - `adx14` number: >=25 trending, 20-25 developing, <20 rangebound
      - `plusDi14` number
      - `minusDi14` number
      - `volumeLastClosedUsd` number
      - `volumeAvg20Usd` number
      - `trend` string: Transparent rule: EMA alignment qualified by ADX
    - `failedIntervals` string[]: Intervals that could not be analyzed, with reasons
    - `levels` object: Daily swing support/resistance; omitted when unavailable (see levelsUnavailable)
      - `interval` string
      - `windowCandles` integer
      - `toleranceUsd` number: Cluster width: half a daily ATR(14), floored at 0.25% of price
      - `measuredFromUsd` number: Price the levels are split around and distances measured from (the headline lastPriceUsd)
      - `resistances` object[]: Nearest first, at or above measuredFromUsd
        - `priceUsd` number
        - `distancePct` number: Signed distance from measuredFromUsd, % (negative = below)
        - `swings` integer: Confirmed swing highs/lows in the cluster
        - `lastTouchAt` string: Newest swing in the cluster, ISO-8601 UTC
      - `supports` object[]: Nearest first, below measuredFromUsd
        - `priceUsd` number
        - `distancePct` number: Signed distance from measuredFromUsd, % (negative = below)
        - `swings` integer: Confirmed swing highs/lows in the cluster
        - `lastTouchAt` string: Newest swing in the cluster, ISO-8601 UTC
      - `rangeHighUsd` number
      - `rangeHighAt` string
      - `rangeLowUsd` number
      - `rangeLowAt` string
    - `levelsUnavailable` string: Why levels are missing, when they are
  - `text` string, required: Human-readable rendering of the result.
  - `meta` ResponseMeta
    - `generatedAt` string, date-time: When the data was produced (source timestamp where the provider has one), ISO 8601 UTC

## Other responses

- `400`: An argument is missing or invalid.
- `401`: No credential was sent.
- `402`: x402 route: a priced call without a valid payment (challenge in the base64 PAYMENT-REQUIRED header). Metered routes: the account balance or access period is spent.
- `403`: The credential was rejected.
- `500`: Unexpected server error.
- `502`: The data source could not answer.

---

[API](https://skmtc.dev/f1ow/apis/f1ow-api.md) · [All operations](https://skmtc.dev/f1ow/apis/f1ow-api/llms.txt) · [OpenAPI document](https://skmtc.dev/f1ow/apis/f1ow-api/revisions/6974f25b6067?raw)
