# FX Signals API
> Live FX technical-analysis signals as an API, computed from European Central Bank daily reference rates. For any currency pair it builds the daily cross-rate series and returns the classic indicators traders watch — 20- and 50-day moving averages and their crossover (golden / death cross), a 14-day RSI (overbought / oversold) and momentum — rolled up into a simple bullish / neutral / bearish verdict. Get a pair's signal, its raw indicators with the recent closes, or scan a whole basket for the strongest setups. A ready-made signal layer for forex, trading and dashboard apps. Live, no key. Educational, not financial advice. Distinct from raw-rate, strength, volatility and correlation APIs.

## Authentication
All requests require your oanor API key in the `x-oanor-key` header. Get one at https://www.oanor.com/developer/keys.

```bash
curl -H "x-oanor-key: oanor_live_…" "https://api.oanor.com/fxsignals-api/..."
```

## Pricing
- **Free** (Free) — 300 calls/Mo, 3 req/s
- **Trader** ($10/Mo) — 9,000 calls/Mo, 10 req/s
- **Pro** ($24/Mo) — 48,000 calls/Mo, 25 req/s
- **Business** ($55/Mo) — 240,000 calls/Mo, 45 req/s

## Endpoints

### Signals

#### `GET /v1/indicators` — Raw indicators + recent closes

**Parameters:**
- `base` (query, required, string) — Base currency Example: `GBP`
- `quote` (query, required, string) — Quote currency Example: `JPY`
- `limit` (query, optional, string) — Recent closes 1-90 Example: `20`

**Example:**
```bash
curl -H "x-oanor-key: $KEY" \
  "https://api.oanor.com/fxsignals-api/v1/indicators?base=GBP&quote=JPY&limit=20"
```

**Response:**
```json
{
    "data": {
        "base": "GBP",
        "pair": "GBPJPY",
        "as_of": "2026-06-08",
        "quote": "JPY",
        "indicators": {
            "price": 213.7564,
            "score": 0,
            "trend": "uptrend",
            "rsi_14": 53.59,
            "sma_20": 213.8631,
            "sma_50": 213.7587,
            "verdict": "neutral",
            "ma_cross": "golden",
            "rsi_state": "neutral",
            "momentum_10d_pct": -0.36
        },
        "recent_closes": [
            213.1032,
            213.1514,
            213.3852,
            211.7863,
            212.5144,
            213.3239,
            213.1362,
            213.5643,
            213.5319,
            214.5267,
            214.437,
            214.1818,
            213.7426,
            213.8418,
            214.7457,
            215.22,
            214.9589,
            215.0653,
            215.2881,
            213.7564
        ]
    },
    "meta": {
        "timestamp": "2026-06-09T03:03:29.744Z",
        "request_id": "c16f8bcf-187f-4003-ba1b-69e31a450271"
    },
    "status": "ok",
    "message": "Indicators retrieved successfully",
    "success": true
}
```

#### `GET /v1/scan` — Scan a basket vs a base for setups

**Parameters:**
- `base` (query, optional, string) — Base currency Example: `USD`
- `verdict` (query, optional, string) — bullish | bearish | neutral

**Example:**
```bash
curl -H "x-oanor-key: $KEY" \
  "https://api.oanor.com/fxsignals-api/v1/scan?base=USD"
```

**Response:**
```json
{
    "data": {
        "base": "USD",
        "as_of": "2026-06-08",
        "count": 7,
        "signals": [
            {
                "pair": "USDGBP",
                "quote": "GBP",
                "score": 3,
                "trend": "uptrend",
                "rsi_14": 55.34,
                "verdict": "bullish",
                "momentum_10d_pct": 1.02
            },
            {
                "pair": "USDEUR",
                "quote": "EUR",
                "score": 3,
                "trend": "uptrend",
                "rsi_14": 63.5,
                "verdict": "bullish",
                "momentum_10d_pct": 0.89
            },
            {
                "pair": "USDCAD",
                "quote": "CAD",
                "score": 2,
                "trend": "uptrend",
                "rsi_14": 79.17,
                "verdict": "bullish",
                "momentum_10d_pct": 0.9
            },
            {
                "pair": "USDJPY",
                "quote": "JPY",
                "score": 2,
                "trend": "uptrend",
                "rsi_14": 71.98,
                "verdict": "bullish",
                "momentum_10d_pct": 0.65
            },
            {
                "pair": "USDCHF",
                "quote": "CHF",
                "score": 1,
                "trend": "downtrend",
                "rsi_14": 60.2,
                "verdict": "neutral",
                "momentum_10d_pct": 1.87
            },
            {
                "pair
…(truncated, see openapi.json for full schema)
```

#### `GET /v1/signal` — Technical signal + verdict for a pair

**Parameters:**
- `base` (query, required, string) — Base currency Example: `EUR`
- `quote` (query, required, string) — Quote currency Example: `USD`

**Example:**
```bash
curl -H "x-oanor-key: $KEY" \
  "https://api.oanor.com/fxsignals-api/v1/signal?base=EUR&quote=USD"
```

**Response:**
```json
{
    "data": {
        "base": "EUR",
        "pair": "EURUSD",
        "as_of": "2026-06-08",
        "price": 1.154,
        "quote": "USD",
        "score": -3,
        "trend": "downtrend",
        "rsi_14": 36.58,
        "sma_20": 1.1637,
        "sma_50": 1.1667,
        "verdict": "bearish",
        "ma_cross": "death",
        "rsi_state": "neutral",
        "observations": 64,
        "momentum_10d_pct": -0.88
    },
    "meta": {
        "timestamp": "2026-06-09T03:03:29.997Z",
        "request_id": "30a7d3e1-b494-43f1-b6a6-9d65b4fd24a4"
    },
    "status": "ok",
    "message": "Signal retrieved successfully",
    "success": true
}
```

### Meta

#### `GET /v1/meta` — Service metadata

**Example:**
```bash
curl -H "x-oanor-key: $KEY" \
  "https://api.oanor.com/fxsignals-api/v1/meta"
```

**Response:**
```json
{
    "data": {
        "as_of": "2026-06-08",
        "source": "ECB daily reference rates via Frankfurter (live)",
        "service": "fxsignals-api",
        "endpoints": {
            "GET /v1/meta": "This document.",
            "GET /v1/scan": "Scan a basket vs a base for setups (base=USD, verdict=bullish|bearish|neutral).",
            "GET /v1/signal": "Technical signal + verdict for a pair (base=EUR&quote=USD).",
            "GET /v1/indicators": "Raw indicators + recent closes for a pair (base, quote, limit)."
        },
        "indicators": [
            "SMA20",
            "SMA50",
            "MA crossover",
            "RSI14",
            "momentum(10d)"
        ],
        "description": "Live FX technical signals from ECB reference rates (Frankfurter): 20/50-day moving averages and crossover (golden/death), 14-day RSI (overbought/oversold) and momentum, rolled into a bullish/neutral/bearish verdict for any currency pair. Get a pair signal, raw indicators with recent closes, or scan a basket. Live, no key. Educational, not financial advice. Distinct from rate, strength, volatility and correlation APIs.",
        "scan_basket": [
            "USD",
            "EUR",
            "JPY",
            "GBP",
            "AUD",
            "CAD",
            "CHF",
            "NZD"
        ]
    },
    "meta": {
        "timestamp": "2026-06-09T03:03:30.125Z",
        "request_id": "04a66669-a7ff-4c82-92d4-9b2fcd6fdecf"
    },
    "status": "ok",
    "message": "M
…(truncated, see openapi.json for full schema)
```


---
Marketplace page: https://www.oanor.com/api/fxsignals-api
OpenAPI spec: https://www.oanor.com/api/fxsignals-api/openapi.json
