# TrendTrader Pro Signals API documentation

Read the same algorithmic trades the dashboard shows, from your own code. One GET endpoint, JSON out, one key per account. Included with the Pro plan.

[Generate your API key](https://app.trendtrader.pro/api) · [See plans](https://trendtrader.pro/pricing/)

## Authentication

Every request carries your API key as a bearer token. Generate the key on the API page in the app (left menu, https://app.trendtrader.pro/api). It is shown once: we store only a hash, so a lost key cannot be recovered, only replaced.

```
Authorization: Bearer ttp_live_…
```

- One live key per account. Generating a new key revokes the old one immediately.
- Pro plan required. Calls need an active Pro subscription; revoking a key works on any plan.
- Keep it server-side. Never ship the key in a browser, a mobile app or a public repository.

## Endpoint

One endpoint returns the current daily trend and the latest intraday flip for every market we cover, or for the symbols you name.

```
GET https://app.trendtrader.pro/api/v1/signals
```

The API answers on app.trendtrader.pro only. Any other hostname answers 404.

## Parameters

Both query parameters are optional. Omit them to receive the whole feed.

- `symbol`: comma-separated list of up to 50 symbols, for example `EUR/USD,BTC/USD,AAPL`. Omit it for the whole universe.
- `since`: ISO-8601, a date (`2026-10-08`) or a datetime with a zone (`2026-10-08T00:00:00Z`). Daily rows keep trends whose `fired_at` date is on or after the calendar date you wrote (the `2026-10-08` part, in your own zone; it is never shifted to UTC). Intraday rows keep flips at or after the exact timestamp. Daily flips are detected hours after the bar closes, so poll daily with a one-day overlap. Daily `between` and `awaiting` rows have no `fired_at` and are left out whenever `since` is set.

## Examples

Whole feed:

```
curl -s -H "Authorization: Bearer $TTP_KEY" \
  https://app.trendtrader.pro/api/v1/signals
```

Two symbols, flips since a timestamp:

```
curl -s -H "Authorization: Bearer $TTP_KEY" \
  "https://app.trendtrader.pro/api/v1/signals?symbol=EUR/USD,BTC/USD&since=2026-10-08T00:00:00Z"
```

## Response

A JSON object with the time it was generated, your plan, the row count, a `daily` list, an `intraday` list and the disclaimer.

```json
{
  "generated_at": "2026-10-09T05:12:40.118Z",
  "plan": "pro",
  "count": 2,
  "daily": [
    {
      "symbol": "EUR/USD",
      "asset_class": "Forex",
      "timeframe": "daily",
      "state": "buy",
      "trend_age_days": 4,
      "fired_at": "2026-10-03",
      "as_of": "2026-10-07"
    }
  ],
  "intraday": [
    {
      "symbol": "EUR/USD",
      "asset_class": "Forex",
      "timeframe": "intraday",
      "state": "sell",
      "fired_at": "2026-10-08T13:45:00.000Z"
    }
  ],
  "disclaimer": "TrendTrader Pro signals are educational information, not financial advice. Trading involves risk; you are responsible for your own decisions."
}
```

Fields:

- `asset_class`: one of `Forex`, `Crypto`, `Stocks`, `ETFs`, `Indices`, `Commodities`.
- `state`: `buy`, `sell`, `between` (the dashboard's "Between Zones" row) or `awaiting` ("Awaiting first signal"). A row is the market's current state, however old; use `fired_at` for its age. `between` and `awaiting` rows carry no trade: their `fired_at` is `null` and `trend_age_days` is `0`.
- `trend_age_days`: daily rows only. The number shown beside the daily row in the dashboard: the age of the trend structure the row is anchored to. It is not the days since `fired_at`.
- `fired_at`: daily, the date the current trend fired, or `null` for `between` and `awaiting` rows; intraday, the exact flip time.
- `as_of`: daily rows only. The last daily bar the row was evaluated on.
- `intraday`: the most recent intraday flip per market on record, with its real `fired_at`. The in-app intraday feed additionally hides markets with no fresh intraday data.

## Status codes

- `200`: success. The body is the JSON object above.
- `400`: bad `symbol` or `since` value.
- `401`: missing, malformed, unknown or revoked key.
- `403`: the account has no active Pro subscription.
- `404`: wrong hostname. The API answers on app.trendtrader.pro only.
- `500`: a read on our side failed. Retry with backoff.
- `503`: the service is briefly unavailable. Retry with backoff.

## Limits and terms

- Caching: the unfiltered feed is cached at our edge for 60 seconds; polling faster than that returns the same data. Filtered requests are not cached.
- No client caching: responses carry `Cache-Control: no-store`. Never cache them yourself.
- Polling cadence: daily flips land hours after the daily bar closes; one call a day with a one-day `since` overlap keeps you current. The feed is each market's current state, not an event log: a flip replaced before your next call is not kept. Intraday flips arrive through the session, so poll at the 60-second cadence or slower.
- Your own use only: the feed is for your own trading decisions and your own tools. Reselling, rebroadcasting or publishing it is not permitted. See the Terms of Service (https://trendtrader.pro/legal/terms-of-service/).

## Disclaimer

TrendTrader Pro signals are educational information, not financial advice. Trading involves risk; you are responsible for your own decisions. The full disclaimer (https://trendtrader.pro/legal/disclaimer/) applies to every response.

Questions about the API? Write to support@trendtrader.pro.
