Linux EC2 spot history + on-demand list prices
This service stores spot price-change events (not a fixed 5-minute grid).
Each series is one instance type in one availability zone:
region/availability_zone/instance_type.
It also stores Linux on-demand list prices per region and instance type
(from AWS’s public price list) so you can compare spot vs on-demand in the chart tooltip.
Cheapest current spot for one instance type across all tracked regions/AZs.
curl -sS "$BASE/aws/latest/cheapest?instance_type=g5.2xlarge"
Open /aws/chart. Each line is one instance type in one
availability zone (label looks like g5.2xlarge @ us-east-1a).
Filter panels start collapsed — expand the section you need.
Filters stack: type groups → family → instance type →
region → series (fine-tune).
g5, inf2, g4ad, p3, etc.
Shows every size in that family (e.g. all g5.* types). Combines with other filters.
GPU families are highlighted like the GPU group button.
87 hidden (45 by instance type · 30 by region · 12 by series checkbox).
p3.2xlarge) to plot that type in
every region and AZ you track. Leave all unchecked for no type limit.
All types / Clear set or remove this filter.
Each row has a tiny only button to select just that type and clear the rest.
us-west-2) to plot every instance type
in that region (all AZs). Combine with instance type to narrow further — e.g.
only p3.2xlarge lines in us-west-2.
Leave all unchecked for no region limit. only works the same as in instance type.
GET /aws/latest?group=gpu.g5, or API
GET /aws/latest?family=g5.p4d.24xlarge
(or check the type manually).us-west-2.p3.2xlarge + region us-west-2; series panel to drop one AZ.GET /aws/api/history?since=… then GET /aws/api/history).
Filters are ANDed: type ∩ region ∩ series checkboxes.
On-demand data is region + instance type only (not per AZ). Source: AWS public
price list (pricing.us-east-1.amazonaws.com) — Linux, shared tenancy, standard
BoxUsage — no EC2 API or extra IAM permissions.
spot-on-demand-sync runs
collector.py --on-demand-once and records the current publication.
spot-on-demand-backfill imports monthly offer snapshots whose effective
date falls in the last 90 days (same window as spot history). Re-run with
--on-demand-backfill-force if needed.
Series IDs look like:
us-east-1/us-east-1a/g5.2xlarge
In URLs you can use slashes or pipe separators:
/aws/series/us-east-1|us-east-1a|g5.2xlarge/history
Groups are defined in config.yaml (instance_types_gpu,
instance_types_kubernetes_low_density,
instance_types_kubernetes_high_density, …). Families are derived from
configured types (g5.2xlarge → family g5). GPU types can be extended via
SPOT_GPU_INSTANCE_TYPES on the server pod.
instance_type_groups, instance_type_families,
gpu_instance_types, group_labels, regions.
curl -sS "$BASE/aws/groups"
Filter with group, family (repeat either for unions within that dimension),
gpu_only=true, and/or instance_type — all intersected.
Each response is JSON unless noted. Query params can be repeated where noted.
Liveness probe.
curl -sS "$BASE/health"
series_count, updated_at, database — no per-series payload.
curl -sS "$BASE/aws/summary"
Full snapshot: latest price per series plus
instance_types, instance_type_groups,
gpu_instance_types, group_labels, updated_at.
Each series includes is_gpu.
curl -sS "$BASE/aws/"
Alias for /aws/groups (used by the chart UI).
curl -sS "$BASE/aws/chart/config"
Latest prices with server-side filter, sort, and limit.
group — repeat: gpu, kubernetes_low_density,
kubernetes_high_density, …family — repeat: g5, inf2, g4ad, …gpu_only — true for GPU types onlyinstance_type — repeat to filter types (intersects with group/family/gpu)region — repeat to filter regionsavailability_zone — repeat to filter AZssort — price, recorded_at, region,
availability_zone, instance_type, idorder — asc or desclimit — max rows (1–10000)curl -sS "$BASE/aws/latest?group=gpu&sort=price&order=asc"
curl -sS "$BASE/aws/latest?family=g5&family=inf2"
curl -sS "$BASE/aws/latest?gpu_only=true®ion=us-west-2"
curl -sS "$BASE/aws/latest?instance_type=g5.2xlarge&sort=price&order=asc"
Cheapest series right now. Provide exactly one of
instance_type, group, or family.
Optional region, gpu_only.
curl -sS "$BASE/aws/latest/cheapest?instance_type=g5.2xlarge"
curl -sS "$BASE/aws/latest/cheapest?group=gpu®ion=us-east-1"
curl -sS "$BASE/aws/latest/cheapest?family=g5"
Flat list of series IDs (no prices).
curl -sS "$BASE/aws/series"
{"count": N} — distinct series in the database.
curl -sS "$BASE/aws/series/count"
JSON time series for one AZ + instance type. Includes point_count.
since — optional ISO8601 lower boundlimit — optional max points (1–100000), most recent N if setSeries key: slashes or pipes — us-east-1/us-east-1a/g5.2xlarge
curl -sS "$BASE/aws/series/us-east-1/us-east-1a/g5.2xlarge/history?since=2026-05-01T00:00:00Z"
curl -sS "$BASE/aws/series/us-east-1/us-east-1a/g5.2xlarge/history?limit=100"
Tab-separated recorded_at and price_usd_per_hour (same query params as history).
curl -sS "$BASE/aws/series/us-east-1/us-east-1a/g5.2xlarge/history/tsv"
OHLC-style CSV download (Open/High/Low/Close = price, Volume = 0) for Fidelity / strawberry-market import.
curl -sS "$BASE/aws/series/us-east-1/us-east-1a/g5.2xlarge/csv" -o g5-us-east-1a.csv
Per-series point_count, is_gpu, labels — no price arrays.
Optional since, group, family,
gpu_only, instance_type.
curl -sS "$BASE/aws/api/history/meta?group=gpu"
curl -sS "$BASE/aws/api/history/meta?family=inf2"
curl -sS "$BASE/aws/api/history/meta?since=2026-05-25T00:00:00Z&gpu_only=true"
Bulk history (chart shape). Optional since,
group, family, gpu_only, instance_type.
Each series includes parallel arrays timestamps, prices (spot), and
on_demand_hover (strings for the chart tooltip, e.g.
On-demand: $1.2120/hr, or empty when unknown).
curl -sS "$BASE/aws/api/history?since=2026-05-01T00:00:00Z&group=kubernetes_low_density"
curl -sS "$BASE/aws/api/history?family=g5"
curl -sS "$BASE/aws/api/history?instance_type=g5.2xlarge" | jq '.series[0] | {id, on_demand_hover: .on_demand_hover[0:3]}'
Interactive chart UI (loads 2 days first, then full history; series draw as they stream in).
$BASE with your server root. It is TLS only:
https://spotplot.fraise.farm/, or
https://spot-prices.nandling.internal:8787 on the tailnet.