v1.0.0 — Production ready

Forecast any time series
in one API call

ARIMA, Chronos-T5, and LSTM models behind a single REST endpoint. Send a list of numbers, get back point forecasts with calibrated 80% and 95% confidence intervals. No infrastructure, no training.

3
Forecasting models
165
Tests passing
<1s
ARIMA latency
1.13%
MAPE on FX data

Three steps to your first forecast

No ML background needed. No model training. No infrastructure to provision.

1

Subscribe on RapidAPI

Create a free account, pick a plan (BASIC is free — no credit card), and copy your API key. Takes 2 minutes.

2

POST your time series

Send a JSON array of historical values to /v1/forecast/univariate with a horizon and frequency. That's it.

3

Read the forecast

Get back point forecasts, 80% and 95% prediction intervals, diagnostics (trend, seasonality, stationarity), and credit usage.

Three models. One endpoint.

Pass "model": "auto" to let the API select, or specify one explicitly. The API automatically falls back to ARIMA if the GPU backend is unavailable.

Model ID Architecture Backend Best for Credits/call Avg latency
arima AutoARIMA (statsforecast) CPU local Short series (<200 obs), interpretable output, fast turnaround 1 <300ms
chronos Chronos-T5-Small (Amazon, zero-shot) GPU · Modal General-purpose, any domain, any frequency 1 1–4s
lstm Custom LSTM (PyTorch) GPU · Modal Long series (>500 obs) with strong seasonal patterns 2 1–3s
ensemble Weighted average (all models) GPU · Modal Maximum accuracy when cost is secondary 5 3–8s
auto Automatic model selection Unknown data — let the API decide varies varies

Automatic fallback: If the GPU backend (Modal.com) is unreachable, the API silently falls back to ARIMA and sets fallback_used: true in the response. Your request always completes.

Real numbers. Published results.

Rolling-window backtesting — 5 windows per dataset. Source code and raw JSON results are available in the GitHub repository. No cherry-picked metrics.

Dataset Domain Frequency Model Horizon MAE RMSE MAPE sMAPE
ETT-h1 Electricity Hourly arima 24h 2.4524 2.9405 10.12% 10.74%
Exchange Rate Finance (FX) Daily arima 30d 0.0085 0.0100 1.13% 1.13%
M5-sample Retail demand Daily arima 14d 9.0427 10.5617 7.63% 7.43%

ETT-h1: ETDataset — Exchange Rate: Time-Series-Library — M5-sample: synthetic retail demand with M5-style weekly seasonality. Methodology: 5-window rolling backtesting, evaluated on held-out test windows.

Why TSFA over alternatives

Honest comparison. TSFA is not the right tool for every use case — but for univariate forecasting with a REST API, it's the simplest and cheapest path.

TSFA AWS Forecast Azure TSI Nixtla TimeGPT DIY (statsforecast)
Setup time <5 min Hours (IAM, S3, groups) Hours (workspace) Minutes Days (infra + tuning)
PRO-equivalent cost $49/month $200–500+/month $150–400+/month $100+/month at 10K calls $30–100/month + your time
Confidence intervals 80% + 95% Yes Limited Yes Manual
Zero-shot (no training) Chronos TimeGPT
Public benchmarks Reproducible Partial N/A
Auto ARIMA fallback Automatic Manual
Multivariate (covariates) Phase 2 Yes Yes Yes Manual

Honest caveat: TSFA does not yet support multivariate forecasting with covariates (Phase 2). If you need exogenous variables today, Nixtla or AWS Forecast are better fits.

Built for real forecasting problems

Three domains where TSFA is production-ready today.

📦

Retail demand forecasting

Forecast weekly demand for hundreds of SKUs simultaneously using the batch endpoint. Each product's history is independent — perfect for concurrent processing.

Endpoint: POST /v1/forecast/batch
Model: auto (typically selects ARIMA on daily retail data)
Cost: 1 credit × N products

Energy consumption prediction

Forecast hourly electricity consumption for the next 24 hours. Use frequency: "H" and horizon: 24. The 80% prediction interval directly translates to reserve scheduling requirements.

Endpoint: POST /v1/forecast/univariate
Model: chronos (zero-shot, handles hourly patterns)
Benchmark: ARIMA achieves MAE=2.45 on ETT-h1 hourly data
💹

Financial time series

Forecast FX rates, stock indices, or economic indicators. Exchange rate data is near-stationary — ARIMA achieves 1.13% MAPE on this type of series. Use /v1/validate to backtest before deploying in production.

Endpoint: POST /v1/forecast/univariate
Model: arima (1.13% MAPE on FX benchmark)
Validate first: POST /v1/validate

Endpoints

Base URL: https://api.eymdey-network.com/v1 — all requests require X-RapidAPI-Key header.

POST
/v1/forecast/univariate
Forecast a single time series. Returns point forecast + 80%/95% prediction intervals + diagnostics. Minimum 10 observations, maximum 50,000. Horizon 1–365.
All plans
POST
/v1/forecast/batch
Forecast multiple series concurrently in a single request. Each series can have a different horizon. PRO: max 50 series. ULTRA/MEGA: max 500 series. Partial errors are isolated per series.
PRO+
POST
/v1/validate
Sliding-window cross-validation (backtesting). Returns per-window MAE, RMSE, MAPE, sMAPE, and empirical 80%/95% prediction interval coverage. 1–20 windows.
All plans
GET
/v1/models
List all available models, their status (available / Phase 2), credit cost, and description.
All plans
GET
/v1/usage
Current billing period credit consumption: credits_used, credits_remaining, credits_limit, requests_count, period (YYYY-MM).
All plans
POST
/v1/forecast/multivariate
Forecast with covariates using TiDE. Phase 2 — returns HTTP 501 today. Coming in the next major release.
Phase 2

Integrate in minutes

Copy-paste examples for the three most common use cases. Replace YOUR_KEY with your RapidAPI key.

Python
JavaScript
cURL
import requests

# Install: pip install requests
url = "https://api.eymdey-network.com/v1/forecast/univariate"
headers = {
    "X-RapidAPI-Key": "YOUR_KEY",
    "Content-Type": "application/json",
}
payload = {
    "series": [120, 132, 128, 145, 139, 152, 148, 160, 155, 168, 163, 175],
    "horizon": 7,
    "frequency": "D",
    "model": "auto",
    "confidence_levels": [0.80, 0.95],
}

resp = requests.post(url, json=payload, headers=headers)
resp.raise_for_status()
data = resp.json()

print(data["model_used"])             # "arima" or "chronos"
print(data["forecast"]["mean"])      # [176.3, 179.1, ...]
print(data["forecast"]["lower_95"]) # 95% lower bound
print(data["diagnostics"]["trend"])  # "upward"
print(data["meta"]["credits_used"]) # 1
// Node.js or browser fetch
const resp = await fetch("https://api.eymdey-network.com/v1/forecast/univariate", {
  method: "POST",
  headers: {
    "X-RapidAPI-Key": "YOUR_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    series: [120, 132, 128, 145, 139, 152, 148, 160, 155, 168, 163, 175],
    horizon: 7,
    frequency: "D",
    model: "auto",
    confidence_levels: [0.80, 0.95],
  }),
});

if (!resp.ok) throw new Error(`HTTP ${resp.status}`);
const data = await resp.json();

console.log(data.model_used);            // "arima"
console.log(data.forecast.mean);         // [176.3, ...]
console.log(data.forecast.lower_95);     // 95% lower bound
console.log(data.diagnostics.trend);     // "upward"
console.log(data.meta.credits_used);     // 1
# Basic forecast
curl -X POST "https://api.eymdey-network.com/v1/forecast/univariate" \
  -H "X-RapidAPI-Key: YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "series": [120, 132, 128, 145, 139, 152, 148, 160, 155, 168, 163, 175],
    "horizon": 7,
    "frequency": "D",
    "model": "auto",
    "confidence_levels": [0.80, 0.95]
  }'

# Check your credit usage
curl "https://api.eymdey-network.com/v1/usage" \
  -H "X-RapidAPI-Key: YOUR_KEY"

# List available models
curl "https://api.eymdey-network.com/v1/models" \
  -H "X-RapidAPI-Key: YOUR_KEY"

Response structure

JSON Response — POST /v1/forecast/univariate
{
  "status": "success",
  "model_used": "arima",                       // model that actually ran
  "forecast": {
    "timestamps": ["2024-01-13", "2024-01-14", "..."],
    "mean":      [178.2, 181.5, 184.8, "..."],   // point forecast
    "lower_80":  [171.0, 173.5, 176.0, "..."],   // 80% lower bound
    "upper_80":  [185.4, 189.5, 193.6, "..."],   // 80% upper bound
    "lower_95":  [164.5, 166.8, 169.2, "..."],   // 95% lower bound
    "upper_95":  [191.9, 196.2, 200.4, "..."]    // 95% upper bound
  },
  "diagnostics": {
    "trend": "upward",                          // "upward" | "downward" | "stable"
    "seasonality_detected": false,
    "seasonality_period": null,
    "series_length": 12,
    "missing_values": 0,
    "stationarity": "non_stationary"           // ADF test result
  },
  "meta": {
    "inference_time_ms": 234.0,
    "request_id": "req_abc123",               // use in bug reports
    "credits_used": 1
  }
}

Simple, volume-based plans

All plans include confidence intervals, diagnostics, and backtesting. Upgrade or cancel anytime via RapidAPI.

Basic
$0/month
500 credits/month · 10 req/min
  • ARIMA + Chronos models
  • Univariate forecasting
  • 80% + 95% intervals
  • Backtesting (/validate)
  • No credit card required
Start for free
Ultra
$199/month
50,000 credits/month · 100 req/min
  • All models + ensemble
  • Batch forecasting (500 series)
  • 80% + 95% intervals
  • Backtesting (/validate)
  • Priority support
Subscribe
Mega
$499/month
200,000 credits/month · 300 req/min
  • All models + ensemble
  • Batch forecasting (500 series)
  • 80% + 95% intervals
  • Backtesting (/validate)
  • SLA + dedicated support
Subscribe
Credit costs per call: arima = 1 credit  ·  chronos = 1 credit  ·  lstm = 2 credits  ·  ensemble = 5 credits  ·  Batch = N series × model credits  ·  Validate = N windows × model credits

Error codes

All errors follow the same JSON structure: {"status":"error","code":"...","message":"...","details":null}

400 VALIDATION_ERROR Series contains NaN/Inf values, confidence level out of range (must be 0–1), or other input validation failure.
403 FORBIDDEN Direct API access without going through the RapidAPI gateway (production only). Always use RapidAPI.
403 PLAN_RESTRICTION Batch forecasting requires a PRO or ULTRA plan. Upgrade your subscription to access this endpoint.
422 SERIES_TOO_SHORT Series is too short for the requested backtesting configuration. Minimum required = horizon × n_windows × 2.
422 TOO_MANY_SERIES Batch request exceeds plan limit. PRO: 50 series max. ULTRA/MEGA: 500 series max.
429 RATE_LIMIT_EXCEEDED Per-minute request rate exceeded. Response includes Retry-After: 60 header. Slow down your requests.
429 CREDIT_LIMIT_EXCEEDED Monthly credit quota exhausted. Resets at the start of the next billing period. Upgrade or wait.
501 NOT_IMPLEMENTED Feature not yet available (e.g., multivariate endpoint). Coming in Phase 2.
503 INFERENCE_TIMEOUT GPU inference exceeded timeout. Safe to retry — the API will fall back to ARIMA on next attempt.
503 MODAL_UNAVAILABLE GPU backend unreachable. In most cases the API automatically falls back to ARIMA (200 with fallback_used: true).
500 INTERNAL_SERVER_ERROR Unexpected server error. Retry after a few seconds. If the error persists, contact support with the request_id.

Frequently asked questions

Answers to the most common questions.

What is a "credit"? Is it the same as a request? +
A credit is a unit of compute, not a request. One call to ARIMA or Chronos costs 1 credit. LSTM costs 2 credits. Ensemble costs 5 credits. A batch call to 10 series with ARIMA costs 10 credits. A backtest with 5 windows and ARIMA costs 5 credits. If you only use ARIMA, credits = requests.
What happens if Chronos/LSTM is unavailable? +
The API automatically falls back to ARIMA. The response still returns HTTP 200 but includes "fallback_used": true in the meta section. You are only charged 1 credit (ARIMA cost), not the GPU model cost. Your request always completes.
What frequency codes are supported? +
Supported values: T (minute), H (hourly), D (daily), W (weekly), M (monthly), Q (quarterly), Y (yearly), auto (infer from timestamps). Pass "auto" if you provide timestamps in ISO 8601 format and want the API to detect frequency automatically.
How many historical observations do I need? +
Minimum 10 observations, maximum 50,000. For ARIMA, 30–100 observations is typically sufficient. For Chronos, the model is zero-shot and works on as few as 10 observations. LSTM benefits from 500+ observations with clear seasonal patterns. The /v1/validate endpoint will tell you how well the chosen model performs on your specific data length.
Can I use my own timestamps? +
Yes. Pass an optional timestamps array of ISO 8601 strings (e.g. ["2024-01-01", "2024-01-08"]) aligned with your series array. The response forecast.timestamps will then continue from the last observed date at the correct interval. Without timestamps, the response still returns relative step indices.
Do credits reset every month? +
Yes. Credits reset at the start of each calendar month aligned with your RapidAPI billing cycle. Unused credits do not roll over. The GET /v1/usage endpoint shows your current period, credits_used, credits_remaining, and credits_limit.
Is there a trial period before paying? +
Yes — the BASIC plan is permanently free (no credit card required). It gives you 500 credits/month with access to ARIMA and Chronos. You can test the full API, including backtesting, before subscribing to a paid plan.