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
Service health check
{
"status": "healthy",
"service": "reserve-watch",
"version": "1.0.0",
"timestamp": "2025-10-27T12:00:00Z"
}
# 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 latest data from all 6 sources + 2 proprietary indices
| Field | Type | Description |
|---|---|---|
| series_id | string | Unique series identifier |
| date | string | Date of data point |
| value | float64 | Numeric value |
| source_updated_at | string | When source published data |
| ingested_at | string | When we fetched the data |
[
{
"series_id": "DTWEXBGS",
"date": "2025-10-27",
"value": 121.45,
"source_updated_at": "2025-10-27",
"ingested_at": "2025-10-27T06:00:00Z"
}
]
Get real-time DXY from Yahoo Finance (updates every 15 min during market hours)
{
"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 historical data for a specific series
| Param | Type | Description |
|---|---|---|
| series | string | Series ID (e.g., DTWEXBGS, COFER_CNY) |
| limit | int | Number of points to return (default: 30, max: 365) |
curl "https://web-production-4c1d00.up.railway.app/api/history?series=DTWEXBGS&limit=90"
Get proprietary de-dollarization indices with component breakdown
[
{
"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 signal analysis (Good/Watch/Crisis) for all 7 indicators
{
"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 data in CSV format
curl "https://web-production-4c1d00.up.railway.app/api/export/csv?series=SWIFT_RMB&limit=365" -o swift_rmb.csv
Export data in JSON format
Export all series data (last 365 days)
curl "https://web-production-4c1d00.up.railway.app/api/export/all?format=json" -o reserve_watch_full.json
Create a new threshold alert
{
"user_email": "user@example.com",
"name": "DXY Rally Alert",
"series_id": "DTWEXBGS",
"condition": "above",
"threshold": 125.0,
"webhook_url": "https://hooks.zapier.com/..."
}
List all alerts for a user
Delete a specific alert
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
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}")
// 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);
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