📡 API Documentation

Base URL: https://web-production-4c1d00.up.railway.app

Rate Limits: Free tier = 100 req/day | Premium = 1,000 req/day

Authentication: None required for read endpoints (planned for alerts/exports)

Response Format: JSON with Content-Type: application/json

🔍 Read Endpoints

GET/health

Service health check

Response

{
  "status": "healthy",
  "service": "reserve-watch",
  "version": "1.0.0",
  "timestamp": "2025-10-27T12:00:00Z"
}

Examples

# curl
curl https://web-production-4c1d00.up.railway.app/health

# JavaScript
fetch('https://web-production-4c1d00.up.railway.app/health')
  .then(res => res.json())
  .then(data => console.log(data));

# Go
resp, _ := http.Get("https://web-production-4c1d00.up.railway.app/health")
defer resp.Body.Close()
json.NewDecoder(resp.Body).Decode(&result)

GET/api/latest

Get latest data from all 6 sources + 2 proprietary indices

Response Fields

FieldTypeDescription
series_idstringUnique series identifier
datestringDate of data point
valuefloat64Numeric value
source_updated_atstringWhen source published data
ingested_atstringWhen we fetched the data

Example Response

[
  {
    "series_id": "DTWEXBGS",
    "date": "2025-10-27",
    "value": 121.45,
    "source_updated_at": "2025-10-27",
    "ingested_at": "2025-10-27T06:00:00Z"
  }
]

GET/api/latest/realtime

Get real-time DXY from Yahoo Finance (updates every 15 min during market hours)

Response

{
  "series_id": "DXY_REALTIME",
  "date": "2025-10-27",
  "value": 104.23,
  "source_updated_at": "2025-10-27 09:45",
  "ingested_at": "2025-10-27T09:45:12Z"
}

GET/api/history?series={id}&limit={n}

Get historical data for a specific series

Parameters

ParamTypeDescription
seriesstringSeries ID (e.g., DTWEXBGS, COFER_CNY)
limitintNumber of points to return (default: 30, max: 365)

Example

curl "https://web-production-4c1d00.up.railway.app/api/history?series=DTWEXBGS&limit=90"

GET/api/indices

Get proprietary de-dollarization indices with component breakdown

Response

[
  {
    "name": "RMB Penetration Score",
    "value": 8.48,
    "description": "RMB's penetration into global finance",
    "method": "Equal-weight average of normalized components...",
    "components": {
      "payments_component": 5.87,
      "reserves_component": 3.78,
      "network_component": 15.79
    },
    "components_detailed": {
      "payments": {
        "raw_value": 2.88,
        "normalized": 5.87,
        "baseline": "USD SWIFT share ~49.1%"
      }
    },
    "timestamp": "2025-10-27T12:00:00Z"
  }
]

GET/api/signals/latest

Get signal analysis (Good/Watch/Crisis) for all 7 indicators

Response

{
  "dtwexbgs": {
    "series_id": "dtwexbgs",
    "value": 121.45,
    "as_of": "2025-10-27",
    "status": "good",
    "why": "USD index stable, not signaling acute stress",
    "action": "open_hedge_checklist",
    "action_label": "Set Alert"
  }
}

📥 Export Endpoints

GET/api/export/csv?series={id}&limit={n}

Export data in CSV format

Example

curl "https://web-production-4c1d00.up.railway.app/api/export/csv?series=SWIFT_RMB&limit=365" -o swift_rmb.csv

GET/api/export/json?series={id}&limit={n}

Export data in JSON format

GET/api/export/all?format={csv|json}

Export all series data (last 365 days)

Example

curl "https://web-production-4c1d00.up.railway.app/api/export/all?format=json" -o reserve_watch_full.json

🔔 Alerts Endpoints (Premium)

POST/api/alerts

Create a new threshold alert

Request Body

{
  "user_email": "user@example.com",
  "name": "DXY Rally Alert",
  "series_id": "DTWEXBGS",
  "condition": "above",
  "threshold": 125.0,
  "webhook_url": "https://hooks.zapier.com/..."
}

GET/api/alerts?email={email}

List all alerts for a user

DELETE/api/alerts/{id}?email={email}

Delete a specific alert

📖 OpenAPI 3.0 Specification

Full OpenAPI spec available below (copy to your favorite API client)

openapi: 3.0.0
info:
  title: Reserve Watch API
  description: De-dollarization monitoring and signal analysis
  version: 1.0.0
  contact:
    email: contact@reserve.watch
servers:
  - url: https://web-production-4c1d00.up.railway.app
paths:
  /health:
    get:
      summary: Health check
      responses:
        '200':
          description: Service is healthy
  /api/latest:
    get:
      summary: Get latest data from all sources
      responses:
        '200':
          description: Array of latest data points
  /api/signals/latest:
    get:
      summary: Get signal analysis for all indicators
      responses:
        '200':
          description: Map of series_id to SignalResult

🚀 Quick Start Examples

Python

import requests

# Get latest data
response = requests.get('https://web-production-4c1d00.up.railway.app/api/latest')
data = response.json()
print(f"USD Index: {data[0]['value']}")

# Get signals
signals = requests.get('https://web-production-4c1d00.up.railway.app/api/signals/latest').json()
dxy_status = signals['dtwexbgs']['status']
print(f"DXY Status: {dxy_status}")

JavaScript

// Get latest data
const response = await fetch('https://web-production-4c1d00.up.railway.app/api/latest');
const data = await response.json();
console.log('USD Index:', data[0].value);

// Get signals
const signals = await fetch('https://web-production-4c1d00.up.railway.app/api/signals/latest').then(r => r.json());
console.log('DXY Status:', signals.dtwexbgs.status);

Go

package main

import (
    "encoding/json"
    "net/http"
)

type DataPoint struct {
    SeriesID  string  `json:"series_id"`
    Date      string  `json:"date"`
    Value     float64 `json:"value"`
}

func main() {
    resp, _ := http.Get("https://web-production-4c1d00.up.railway.app/api/latest")
    defer resp.Body.Close()
    
    var data []DataPoint
    json.NewDecoder(resp.Body).Decode(&data)
    
    fmt.Printf("USD Index: %.2f\n", data[0].Value)
}
← Back to Dashboard