API Documentation
Find, compare and price every AWS EC2 instance type. Each endpoint below is read-only and needs no key: its parameters, every field of its response, and cURL examples.
Conventions#
- Requests:
GETonhttps://go.runs-on.com, exceptPOST /api/facets; everyGETendpoint answersHEADtoo. Responses are JSON unless stated otherwise, and allow every origin (Access-Control-Allow-Origin: *). - Errors: a JSON object
{"error": "..."}whose message names the faulty parameter.400for an invalid parameter,404for an unknown endpoint, instance type or family,405for another method (with anAllowheader),500when the database fails. - Units: prices in USD per instance-hour, rounded to 6 decimals; memory in GiB; instance storage in decimal GB, as AWS sizes it; network bandwidth in Gbit/s; EBS bandwidth in Mbit/s; times in RFC 3339, UTC.
- Absent fields: a field that does not apply (no GPU, no instance storage, no PassMark score, no spot price) is left out of the object, not set to
null, unless its table says otherwise. Test for its presence. - Platforms:
linux(orlinux/unix),windowsandmacos(ormac), in any case. Responses name themLinux/UNIX,WindowsandmacOS. - Zones: prefer zone IDs such as
use1-az4. AWS maps zone names such asus-east-1bto physical zones separately in each account, so a name here may be another zone in yours. Your instance's zone ID is in its metadata (placement/availability-zone-id). - Coverage: the instance types AWS offers in each region the site's AWS account can use. Prices refresh about every 90 minutes. The finder, facets and compare endpoints list the types priced in the last 7 days.
- Rate limits: none, but please be gentle and cache: an unfiltered
/api/finderanswer holds every priced type, a few megabytes.
Price figures#
The pricing fetcher records the current spot price of every availability zone (a zone below) and the on-demand price of every region; each of those passes is a run. Runs start 90 to 95 minutes apart, about 15 a day. Runs are told apart by gaps of more than 15 minutes between rows. The figures below cover the requested regions and platforms (Linux/UNIX unless you pass platform) over the 7 days that end at the start of the current 10-minute window (UTC, starting at :00, :10, :20...): prices recorded since count from the next window, and a run counts in the typical spot figures from the first window that starts at least 10 minutes after its last row. So the finder, facets and compare endpoints, the family exports and the site's pages move to a new run together.
Three kinds of spot price never count in the spot figures below, in the averages of /api/instances or on the site's pages:
- $0 prices: the type has no spot in that zone (macOS has none), or the spot fetch failed.
- Zones AWS stopped pricing: no AWS spot price for more than 3 days, measured from the newest price of their region and platform. AWS publishes the price of a live zone every few hours, and its history keeps returning the last price of a zone it stopped pricing.
- Zones AWS no longer gives to new accounts: today
usw1-az2in us-west-1, which sells old types (m1, m2, m4, r4, c1) at 10% of on-demand to the accounts that already had it.
Their on-demand prices and their regions still count. /api/instances/{type} lists them, flagged.
Spot figures
typicalSpotPrice- What spot typically costs: for each run of the last 7 days, the spot price of the cheapest zone of the requested regions (and platforms), averaged over those runs, after the glitch rule below. Quote this figure: it moves little from day to day. A missing value means unknown, not "no spot": the type had no counted spot price in a settled run (a type without spot, macOS, a type first priced minutes ago), or the figure could not be computed. Fall back toavgSpotPrice, which is 0 when no spot price counts at all.typicalSpotRuns- Runs averaged intypicalSpotPrice: about 15 a day, so about 105 for a full week, fewer for a type that was not priced in every run.typicalSpotSince- Start of the oldest run averaged.typicalSpotRegion,typicalSpotZoneId- The zone that was the cheapest in the most runs, wheretypicalSpotPricemostly comes from;typicalSpotZoneRunsis in how many of thetypicalSpotRuns. A run whose cheapest zone the glitch rule skipped counts for no zone; a tie goes to the first zone in region and zone ID order.spotPriceNow- Spot price of the cheapest zone in the newest run, after the glitch rule.spotZoneAvgNow- Mean spot price across the zones of the newest run, without a zone skipped by the glitch rule.spotPriceNowAt- Start of the newest run.- Glitch rule - A run's cheapest zone is skipped, in favour of the run's next cheapest zone, when it is below half of that next zone and below half of the cheapest price of each neighbouring run. The oldest and the newest run of the 7 days have one neighbour and are checked against it alone, so a real drop of one zone to below half of every other price shows in
spotPriceNowfrom the run after it. A run with a single zone and a type with a single run are never checked. avgSpotPrice- Mean of every counted spot price of the 7 days: all zones of the requested regions, all runs. 0 when none counts.minSpotPrice,maxSpotPrice- Lowest and highest spot price of a single zone and run in the 7 days, with no glitch rule, and the region (minSpotRegion,maxSpotRegion) and platform (minSpotPlatform,maxSpotPlatform) it was seen in.minSpotPriceis a one-off low, below what spot typically costs.
On-demand figures
avgOnDemandPrice- Mean of the requested regions' on-demand prices, each region counted once: AWS sets one on-demand price per region, so a region with six zones weighs no more than one with two. A region's price is its mean over the 7 days. 0 when AWS lists none.minOnDemandPrice,maxOnDemandPrice- The cheapest and dearest region's price, with that region (minOnDemandRegion,maxOnDemandRegion) and platform (minOnDemandPlatform,maxOnDemandPlatform).
Region counts
regions- The requested regions in which the type has a spot or an on-demand price in the 7 days.spotRegionCount- How many of them have a spot price that counts: the regions behindavgSpotPriceand the other spot figures. A type can be sold in a region without spot.onDemandRegionCount- How many of them have an on-demand price: the regionsavgOnDemandPriceaverages.
Several platforms
With several platforms, or platform=all, each platform keeps its own figures in platformPrices, while the top-level figures mix them: avgSpotPrice and spotZoneAvgNow average the platforms' prices together, and avgOnDemandPrice each platform's regions (Windows prices include the license, so this inflates them); minSpotPrice, minOnDemandPrice, typicalSpotPrice and spotPriceNow take the cheapest price of any of them, in practice the Linux price; the region counts count a region once, whatever its platforms. Read platformPrices, or ask for one platform per request.
Find instances#
GET /api/finder
Every instance type priced in the last 7 days that matches the filters, with its specs and prices, and three Top 3 rankings. Every parameter is optional.
Parameters
| Parameter | Values | Meaning |
|---|---|---|
regionregion names, all | region names, all | AWS regions, separated by commas or plus signs. With several, only the types priced in every one are returned, priced over those regions. Default: every region. |
platformlinux, windows, macos, all | linux, windows, macos, all | The platforms of the prices, also linux/unix and mac. Several, separated by commas or plus signs, each keep their own platformPrices; all mixes every platform (see Several platforms). Only the types priced on them are returned. Default: linux. |
cpurange, integers | range, integers | vCPUs. |
ramrange | range | Memory in GiB. A single value matches exactly that much (15.25 for i3.large). |
gpurange, integers | range, integers | Whole GPUs (gpus). A type with a fraction of a GPU has 0: select those with accelerator=gpu. |
passmarkrange | range | PassMark single-thread score. A single value is a minimum. Types without a score never match. |
archx86_64, arm64, all | x86_64, arm64, all | Architectures, repeated or separated by commas or plus signs. Aliases: amd64, x64, x86-64, x86, intel and i386 mean x86_64; aarch64, arm and graviton mean arm64. |
acceleratorgpu, neuron, fpga, media, inference | gpu, neuron, fpga, media, inference | Accelerator kinds (acceleratorKind), separated by commas or plus signs. |
familyterms | terms | Families and types, as RunsOn labels name them, separated by commas or plus signs, in any case: a family prefix (m7 selects m7a, m7g, m7i, m7i-flex...; c7 does not select hpc7g), a family's types (m7a.* or m7a.), one type (m7a.large), or a pattern with * anywhere: of families without a dot (*-flex), of types with one (*.metal, m7i.metal-*). _ and % match themselves. |
A range is min-max (both bounds included), one value, or min+ for no maximum. In a raw query string a + decodes to a space, which reads the same, or send it as %2B. An empty value or all means no filter. An unknown value, a malformed, negative, NaN or reversed range, a decimal cpu or gpu value and a malformed region name are a 400; a well-formed region the site does not price matches nothing.
Examples
curl -sG "https://go.runs-on.com/api/finder" | jq '.results | length'
arm64 types with 4 to 8 vCPUs in us-east-1, the most PassMark per dollar first:
curl -sG "https://go.runs-on.com/api/finder" \
-d region=us-east-1 -d cpu=4-8 -d arch=arm64 \
| jq -c '.top3[] | {instanceType, passmark, typicalSpotPrice}'
{"instanceType":"c6gd.2xlarge","passmark":1105,"typicalSpotPrice":0.0317}
{"instanceType":"c8g.xlarge","passmark":1945,"typicalSpotPrice":0.0582}
{"instanceType":"m9gd.xlarge","passmark":2475,"typicalSpotPrice":0.0784}
64 vCPUs or more, in both us-east-1 and us-west-2:
curl -sG "https://go.runs-on.com/api/finder" \
-d region=us-east-1,us-west-2 --data-urlencode "cpu=64+" | jq '.results | length'
The c8 and m8 families, the -flex families, one family's types:
curl -sG "https://go.runs-on.com/api/finder" -d region=us-east-1 -d "family=c8,m8" | jq '.results | length'
curl -sG "https://go.runs-on.com/api/finder" -d region=us-east-1 -d "family=*-flex" | jq '[.results[].instanceFamily] | unique'
curl -sG "https://go.runs-on.com/api/finder" -d region=us-east-1 -d "family=m7a.*" | jq '[.results[].instanceType]'
Types with AWS Inferentia or Trainium, and Windows prices:
curl -sG "https://go.runs-on.com/api/finder" -d accelerator=neuron | jq '[.results[].instanceType]'
curl -sG "https://go.runs-on.com/api/finder" -d region=us-east-1 -d platform=windows -d cpu=2 | jq '.top3ByPrice[0]'
The typical spot price of one type, and the zone it mostly comes from:
curl -sG "https://go.runs-on.com/api/finder" \
-d region=us-east-1 -d platform=linux -d family=m8a.large \
| jq '.results[0] | {instanceType, typicalSpotPrice, typicalSpotRuns, typicalSpotZoneId, spotPriceNow, spotZoneAvgNow}'
Response fields
| Field | Type | Meaning |
|---|---|---|
resultsobject[] | object[] | The matching types, with the instance type fields, in price order: the types with a spot price first, by typicalSpotPrice (avgSpotPrice without one), then the others by avgOnDemandPrice. Ties go to the higher PassMark score, then fewer vCPUs, then the name. [] when nothing matches. |
top3ByPriceobject[] | object[] | The 3 cheapest types. |
top3ByPerformanceobject[] | object[] | The 3 highest PassMark single-thread scores, one type per family: its cheapest size. |
top3object[] | object[] | Best PassMark per dollar: the 3 highest PassMark scores divided by the hourly price, one type per family. The types that sustain all their vCPUs (not the burstable t families, cpuBurstable) and have 2 GiB of memory or more rank first, each family by its cheapest such size; the others only fill the list when fewer than 3 families qualify. |
top3PriceBasisstring | string | The price the three lists use: spot (typicalSpotPrice, else avgSpotPrice), or onDemand (avgOnDemandPrice) when no result has a spot price, as on macOS. |
A type without a price on that basis is left out of the three lists, and a type without a PassMark score out of the last two. Ties go to the cheaper type, then as in results. A list holds fewer than 3 types when fewer qualify, and top3PriceBasis is spot when nothing matches.
m8a.large in us-east-1, as of 2026-10-08, trimmed:
{
"results": [
{
"instanceType": "m8a.large",
"instanceFamily": "m8a",
"provider": "ec2",
"architecture": "x86_64",
"vcpus": 2,
"memoryGiB": 8,
"gpus": 0,
"cpuSpeedGhz": 4.5,
"passmark": 3801,
"cpuModel": "AMD EPYC 9R45",
"cpuManufacturer": "AMD",
"networkPerformanceGbps": 12.5,
"networkBaselineGbps": 0.937,
"networkBurstable": true,
"networkPerformanceGiBps": 12.5,
"ebsMaxBandwidthMbps": 10000,
"ebsMaxIOPS": 40000,
"ebsBaselineBandwidthMbps": 650,
"ebsBaselineIOPS": 3600,
"avgSpotPrice": 0.04266,
"avgOnDemandPrice": 0.12172,
"minSpotPrice": 0.0365,
"minSpotRegion": "us-east-1",
"minSpotPlatform": "Linux/UNIX",
"maxSpotPrice": 0.0488,
"maxSpotRegion": "us-east-1",
"maxSpotPlatform": "Linux/UNIX",
"minOnDemandPrice": 0.12172,
"minOnDemandRegion": "us-east-1",
"minOnDemandPlatform": "Linux/UNIX",
"platformPrices": [...],
"regions": ["us-east-1"],
"spotRegionCount": 1,
"onDemandRegionCount": 1,
"passmarkSource": "measured",
"passmarkSourceFamily": "m8a",
"passmarkMeasuredAt": "2026-10-08T00:00:00Z",
"passmarkBasis": "ec2-cpu",
"typicalSpotPrice": 0.0365,
"typicalSpotRuns": 1,
"typicalSpotSince": "2026-10-08T20:44:17Z",
"spotPriceNow": 0.0365,
"spotZoneAvgNow": 0.04266,
"spotPriceNowAt": "2026-10-08T20:44:17Z",
"typicalSpotRegion": "us-east-1",
"typicalSpotZoneId": "use1-az5",
"typicalSpotZoneRuns": 1
}
],
"top3ByPrice": [...],
"top3ByPerformance": [...],
"top3": [...],
"top3PriceBasis": "spot"
}
Instance type fields#
The fields of each result of /api/finder and /api/facets, of their Top 3 lists, and of /api/compare. /api/instances/{type} uses the same spec fields. "May be absent" fields are left out when they do not apply.
Type and CPU
| Field | Type | Unit | May be absent | Meaning |
|---|---|---|---|---|
instanceTypestring | string | no | The instance type, such as m8a.large. | |
instanceFamilystring | string | no | Its family, the part before the dot. | |
providerstring | string | no | Always ec2. | |
architecturestring | string | no | x86_64 or arm64. Types that also run 32-bit code are x86_64; Macs use their processor's (Apple silicon is arm64, mac1 x86_64). | |
vcpusinteger · vCPUs | integer | vCPUs | no | A vCPU is a whole core on Graviton and on AMD's 7th generation and later, a hyperthread on most Intel and older AMD types. |
cpuModelstring · may be absent | string | yes | The processor, as the family page names it: the model the family's benchmarks report (AMD EPYC 9R45, Intel Xeon Platinum 8375C; an Arm core names its Graviton, AWS Graviton4 (Neoverse-V2)), a Mac's Apple chip (Apple M2 Pro), else the vendor alone (cpuManufacturer). Absent when neither is known. | |
cpuManufacturerstring · may be absent | string | yes | The processor vendor AWS lists: Intel, AMD, AWS (Graviton) or Apple. A cpuModel equal to it means the model is not known. | |
cpuSpeedGhznumber · GHz · may be absent | number | GHz | yes | The sustained clock speed AWS states for the type. AWS gives a base clock for some processors and a peak for others, so it does not compare across families: use passmark for speed. |
cpuBurstableboolean · may be absent | boolean | yes | true for the burstable t families (t2, t3, t3a, t4g...): they sustain a share of their vCPUs and spend CPU credits above it. Absent for the others. | |
passmarknumber · score · may be absent | number | score | yes | The family's PassMark single-thread score. Absent when the family has none: not benchmarked, not slow. |
passmarkSourcestring · may be absent | string | yes | measured (benchmarked on the family) or estimated (copied from a family with the same processor). Absent without a score. | |
passmarkSourceFamilystring · may be absent | string | yes | The family the benchmarks ran on: the family itself when measured. Absent without a score, and for an estimated score whose origin was not recorded. | |
passmarkMeasuredAtstring · RFC 3339 · may be absent | string | RFC 3339 | yes | The newest benchmark run behind the score, kept after its runs expire. For a score recorded before October 2026, the first time the site recorded it. Absent when unknown. |
passmarkBasisstring · may be absent | string | yes | How the score was computed: ec2-cpu (runs-on.com's per-type figures) or runs-median (the median of the family's runs). Absent for scores recorded before October 2026. |
Memory, GPUs and accelerators
| Field | Type | Unit | May be absent | Meaning |
|---|---|---|---|---|
memoryGiBnumber · GiB | number | GiB | no | Memory. |
gpusinteger · GPUs | integer | GPUs | no | Whole GPUs only: g6f.large, with an eighth of a GPU, has 0 (see acceleratorCount). |
gpuModelstring · may be absent | string | yes | The GPU, as AWS names it: H100, L4. | |
gpuMemoryGiBnumber · GiB · may be absent | number | GiB | yes | The memory of all the type's GPUs together (p5.48xlarge: 640), or of its slice of a GPU. |
acceleratorKindstring · may be absent | string | yes | gpu (whole or fractional GPUs), neuron (AWS Inferentia and Trainium), fpga, media (vt1's Xilinx U30) or inference (dl2q's Qualcomm AI 100). Set for whole GPUs too; absent without an accelerator. | |
acceleratorCountnumber · may be absent | number | yes | How many; may be a fraction: g6f.large has 0.125 of an NVIDIA L4. | |
acceleratorManufacturerstring · may be absent | string | yes | As AWS reports it: NVIDIA, AMD, AWS, Xilinx, Qualcomm. | |
acceleratorModelstring · may be absent | string | yes | As AWS reports it: H100, Inferentia2. | |
acceleratorMemoryGiBnumber · GiB · may be absent | number | GiB | yes | The memory of all the accelerators together, or of the slice of a fractional GPU. |
Storage and network
| Field | Type | Unit | May be absent | Meaning |
|---|---|---|---|---|
instanceStorageGBnumber · GB · may be absent | number | GB | yes | Total instance store in decimal GB, as AWS sizes it: i3en.24xlarge has 60000 GB, which is 54.6 TiB. Absent for EBS-only types. |
storageDisksinteger · disks · may be absent | integer | disks | yes | Number of instance store disks. |
storageDiskTypestring · may be absent | string | yes | nvme-ssd, ssd or hdd. | |
storageTypestring · may be absent | string | yes | The label of storageDiskType: NVMe SSD, SSD or HDD. | |
storageSpaceGiBnumber · GB · may be absent | number | GB | yes | Deprecated: the same decimal GB value as instanceStorageGB, despite its name. |
networkPerformanceGbpsnumber · Gbit/s · may be absent | number | Gbit/s | yes | Peak network bandwidth, AWS's figure: "Up to 12.5 Gigabit" is 12.5, "4x 100 Gigabit" is 400. Where AWS cuts the figure short ("3.12 Gigabit" for 3.125), the network cards' precise one. For older types AWS rates only as Low, Moderate or High, the network cards' peak (t2.micro: 1.024). |
networkBaselineGbpsnumber · Gbit/s · may be absent | number | Gbit/s | yes | The bandwidth the type sustains (m8a.large: 0.937). |
networkBurstableboolean · may be absent | boolean | yes | true when the baseline is below the peak: the type reaches the peak in bursts only. Absent when unknown. | |
networkPerformanceGiBpsnumber · Gbit/s · may be absent | number | Gbit/s | yes | Deprecated: the same Gbit/s value as networkPerformanceGbps. Read as GiB/s, as its name says, it is 8.6 times too high. |
ebsMaxBandwidthMbpsnumber · Mbit/s · may be absent | number | Mbit/s | yes | Peak EBS bandwidth. |
ebsBaselineBandwidthMbpsnumber · Mbit/s · may be absent | number | Mbit/s | yes | EBS bandwidth the type sustains. |
ebsMaxIOPSinteger · IOPS · may be absent | integer | IOPS | yes | Peak EBS IOPS. |
ebsBaselineIOPSinteger · IOPS · may be absent | integer | IOPS | yes | EBS IOPS the type sustains. |
Prices
Defined in Price figures, for the requested regions and platforms.
| Field | Type | Unit | May be absent | Meaning |
|---|---|---|---|---|
regionsstring[] | string[] | no | The requested regions in which the type has a price in the last 7 days. | |
spotRegionCountinteger · regions | integer | regions | no | How many of regions have a spot price that counts, the regions behind the spot figures; 0 without one. |
onDemandRegionCountinteger · regions | integer | regions | no | How many of regions have an on-demand price, the regions avgOnDemandPrice averages. |
typicalSpotPricenumber · USD/h · may be absent | number | USD/h | yes | What spot typically costs: the figure to quote. Absent means unknown: fall back to avgSpotPrice. |
typicalSpotRunsinteger · runs · may be absent | integer | runs | yes | Runs averaged, about 105 for a full week. |
typicalSpotSincestring · RFC 3339 · may be absent | string | RFC 3339 | yes | Start of the oldest run averaged. |
typicalSpotRegionstring · may be absent | string | yes | Region of the zone that was the cheapest in the most runs. | |
typicalSpotZoneIdstring · may be absent | string | yes | That zone's ID, such as use1-az5. | |
typicalSpotZoneRunsinteger · runs · may be absent | integer | runs | yes | In how many of the typicalSpotRuns that zone was the cheapest. |
spotPriceNownumber · USD/h · may be absent | number | USD/h | yes | The cheapest zone's spot price in the newest run. |
spotZoneAvgNownumber · USD/h · may be absent | number | USD/h | yes | Mean spot price of the zones in the newest run. |
spotPriceNowAtstring · RFC 3339 · may be absent | string | RFC 3339 | yes | Start of the newest run. |
avgSpotPricenumber · USD/h | number | USD/h | no | Mean of every counted spot price of the 7 days; 0 without one. |
minSpotPrice, maxSpotPricenumber · USD/h · may be absent | number | USD/h | yes | Lowest and highest spot price of one zone and run. |
minSpotRegion, maxSpotRegionstring · may be absent | string | yes | Their regions. | |
minSpotPlatform, maxSpotPlatformstring · may be absent | string | yes | Their platforms. | |
avgOnDemandPricenumber · USD/h | number | USD/h | no | Mean on-demand price of the regions, each counted once; 0 when AWS lists none. |
minOnDemandPrice, maxOnDemandPricenumber · USD/h · may be absent | number | USD/h | yes | The cheapest and dearest region's on-demand price. |
minOnDemandRegion, maxOnDemandRegionstring · may be absent | string | yes | Those regions. | |
minOnDemandPlatform, maxOnDemandPlatformstring · may be absent | string | yes | Their platforms. | |
platformPricesobject[] | object[] | no | One object per platform the type is priced on among the requested ones (every platform with platform=all), in name order, with that platform's own figures: platform, then the spot, on-demand, region count and typical spot fields above, without regions and the *Platform fields. |
| Field | Type | Unit | May be absent | Meaning |
|---|---|---|---|---|
platformstring | string | no | Linux/UNIX, Windows or macOS. |
PassMark score#
passmark is the family's PassMark single-thread score, measured by RunsOn's open benchmark harness (runs-on.com/benchmarks). Every size of a family has the same score. The finder, the compare page, the family pages and the ranking show the same figure.
- Measured: runs-on.com publishes one figure per benchmarked instance type (
passmarkSinglein ec2-cpu.json). A family's score is the median of its benchmarked types' newest figures (passmarkBasisec2-cpu), or, without such figures, of its benchmark runs of the last 180 days (runs-median); with an even count, the higher of the two middle values (i7i's types score 3021, 3054, 3105 and 3239: i7i scores 3105). A measured score stays after its runs expire, with its date. - Estimated: a family without benchmarks takes the score of a measured family with the same AWS processor: same manufacturer, same architecture and a sustained clock in common. The source is, in order, a fixed pairing (x2gd, g5g, i4g, im4gn and is4gen from m6g; i4i, x2idn and x2iedn from m6i; x2iezn from m5zn; x8aedz from m8azn), a sibling (r8gd from r8g), or a family of the same generation, preferring the m family (c9g from m9g). A few scores recorded before October 2026 are estimated with an unknown origin: they have no
passmarkSourceFamily. - None: a family whose processor no measured family shares has no score, and no
passmarkfield.
The provenance fields are passmarkSource, passmarkSourceFamily, passmarkMeasuredAt and passmarkBasis (see Type and CPU). cpuSpeedGhz is AWS's stated clock, not a benchmark.
Faceted search#
POST /api/facets
The query behind the finder page: the results and Top 3 lists of /api/finder for a JSON body of filters, with the number of matching types per family and every value of each facet. Its facets follow the page and may change; for scripts, prefer /api/finder.
Request body
A JSON object of at most 64 KiB; every field is optional. Ranges take the forms of /api/finder, and several ranges of one field select the types in any of them.
| Field | Type | Meaning |
|---|---|---|
regionsstring[] | string[] | AWS regions. Default: every region. |
regionModestring | string | AND (the default) keeps the types priced in every selected region, OR those priced in any of them. |
platformsstring[] | string[] | As /api/finder's platform; ["all"] mixes every platform. Default: Linux/UNIX. |
architecturesstring[] | string[] | As arch, aliases included. |
acceleratorsstring[] | string[] | As accelerator. |
textstring | string | As family: c8+m8, m7i.*, *-flex. |
cpuBucketsstring[] | string[] | vCPU ranges. |
ramBucketsstring[] | string[] | Memory ranges, GiB. |
gpuBucketsstring[] | string[] | Whole GPU ranges. |
passmarkBucketsstring[] | string[] | PassMark ranges; a single value is a minimum, and types without a score never match. |
networkBucketsstring[] | string[] | Peak network bandwidth, Gbit/s: the exact values of availability.network, such as 1.024. |
storageBucketsstring[] | string[] | Instance storage, decimal GB. A range leaves out its maximum: 100-500 holds 100 GB but not 500. |
spotPriceBucketsstring[] | string[] | USD per hour, on typicalSpotPrice (avgSpotPrice without one), as the response rounds it; maximum left out. A range never keeps a type without a spot price, even from 0. |
onDemandPriceBucketsstring[] | string[] | USD per hour, on avgOnDemandPrice, or with several platforms on the lowest avgOnDemandPrice of platformPrices (the top-level one mixes them); maximum left out, and never a type without an on-demand price. |
An invalid JSON body or value is a 400, a larger body a 413, another method than POST a 405.
Response fields
| Field | Type | Meaning |
|---|---|---|
resultsobject[] | object[] | The matching types, as in /api/finder. |
top3ByPrice, top3ByPerformance, top3, top3PriceBasis | As in /api/finder. | |
familyCountsobject | object | Matching types per family: {"m8g": 2}. |
availabilityobject | object | Every value of each facet, whatever the filters: regions (those priced in the last 7 days, and the selected ones), architectures, platforms (with an all item), accelerators, passmarks, cpus, rams, gpus, storage, network, spotPrices and onDemandPrices, each a list of the items below (the two price lists hold the page's former price buttons, kept for older clients: deprecated); passmarkBounds {min, max}, the lowest and highest score of the families priced in the last 7 days; and spotPriceHistogram and onDemandPriceHistogram, the price histograms of the page's price sliders, absent when no type has that price. |
Each facet item:
| Field | Type | Meaning |
|---|---|---|
valuestring | string | The value to send back: a region, an architecture, or a range such as 0.05-0.1 or 64000+. |
labelstring | string | How the page shows it: 1.024Gbps, < 100 GB. |
min, maxnumber | number | The numeric range of a numeric facet's value; max is absent for a bucket with no maximum. |
countinteger | integer | Regions only, in AND mode without a price range: how many matching types are also priced in that region. Absent elsewhere. |
selectedboolean | boolean | true when the request selects it; absent otherwise. |
availableboolean | boolean | Whether a matching type has this value. Always true for platforms, and for regions without a count. |
unpricedboolean | boolean | Regions only: true for a selected region without a price in the last 7 days (a typo, or a region the site does not price); absent otherwise. |
curl -s -X POST "https://go.runs-on.com/api/facets" \
-H "Content-Type: application/json" \
-d '{"regions":["us-east-1"],"architectures":["arm64"],"cpuBuckets":["4-8"],"text":"m8"}' \
| jq '{familyCounts, top3: [.top3[].instanceType], cpus: .availability.cpus[2:4]}'
{
"familyCounts": {"m8g": 2, "m8gb": 2, "m8gd": 2, "m8gn": 2},
"top3": ["m8g.xlarge", "m8gd.xlarge", "m8gn.xlarge"],
"cpus": [
{"value": "4", "label": "4", "min": 4, "max": 4, "selected": true, "available": true},
{"value": "8", "label": "8", "min": 8, "max": 8, "selected": true, "available": true}
]
}
Price histograms
A price histogram counts the types that match every filter but that price's own range: on the typical spot price (avgSpotPrice without one) for spotPriceHistogram, on avgOnDemandPrice (the cheapest platform's, with several) for onDemandPriceHistogram. The other price's range applies, so a range of one price narrows the other's histogram, never its own. Bins leave out their maximum, as the ranges do: the bins between two edges hold the types a range between them keeps.
| Field | Type | Meaning |
|---|---|---|
min, maxnumber | number | The lowest and highest price of those types, USD per hour. |
countinteger | integer | How many of them have that price. |
edgesnumber[] | number[] | The bounds of the bins, ascending, on a log scale: round prices, ten a decade (1, 1.2, 1.5, 2, 2.5, 3, 4, 5, 6 and 8 times a power of ten), from the one at or below min to the one above max. The bounds of the request's range of that price are added, each with a bin on either side. |
countsinteger[] | integer[] | One fewer than edges: counts[i] types are priced from edges[i] to under edges[i+1]. |
A typical spot range off the ladder, in the m8 families: 0.033 is an edge, and the bins from 0.033 to under 0.07 hold the 15 results.
curl -s -X POST "https://go.runs-on.com/api/facets" \
-H "Content-Type: application/json" \
-d '{"text":"m8","spotPriceBuckets":["0.033-0.07"]}' \
| jq -c '{results: (.results | length), spot: (.availability.spotPriceHistogram | {min, max, count, edges: .edges[8:15], counts: .counts[8:14]})}'
{"results":15,"spot":{"min":0.0048,"max":6.2929,"count":160,"edges":[0.025,0.03,0.033,0.04,0.05,0.06,0.07],"counts":[5,1,3,4,4,4]}}
A mistyped region, in OR mode (no counts):
curl -s -X POST "https://go.runs-on.com/api/facets" \
-H "Content-Type: application/json" \
-d '{"regions":["us-east-1","us-esat-1"],"regionMode":"OR"}' \
| jq -c '.availability.regions[] | select(.selected)'
{"value":"us-east-1","label":"us-east-1","selected":true,"available":true}
{"value":"us-esat-1","label":"us-esat-1","selected":true,"available":true,"unpriced":true}
Compare instance types#
GET /api/compare
Two or three instance types side by side, as on the compare page, with the prices of /api/finder.
Parameters
| Parameter | Values | Meaning |
|---|---|---|
instances2 or 3 types | 2 or 3 types | Required. Instance types in lower case, separated by commas; duplicates are dropped. Fewer than 2 or more than 3 different types, or a malformed name, is a 400. |
regionone region, all | one region, all | The region of the prices. Without one (or with all), every type is priced over the regions they are all sold in, so that none looks cheaper only for being sold in cheaper regions. |
platformas /api/finder | as /api/finder | Default: linux. |
Response fields
| Field | Type | Meaning |
|---|---|---|
resultsobject[] | object[] | The requested types priced for the selection, in the requested order, with the instance type fields and the one below. |
missingobject[] | object[] | The other requested types, in the requested order, with the reason (below). |
regionsstring[] | string[] | The regions behind the prices: the requested region, or without one the regions every result is sold in. Empty when the results share no region (each type then keeps its own regions) or when no type has a price. |
suggestionsstring[] | string[] | Up to 4 types worth adding, priced for the selection: the same size on the other architecture or x86 vendor, then the next and the previous generation, then the family without its variant letters. Empty with 3 types or no result. |
Each result adds:
| Field | Type | Meaning |
|---|---|---|
pricedRegionsstring[] | string[] | Every region where the type has a price on the requested platforms in the last 7 days, whatever region was asked. |
Each missing item:
| Field | Type | Meaning |
|---|---|---|
instanceTypestring | string | The requested type. |
instanceFamilystring | string | Its family; absent for an unknown type. |
reasonstring | string | unknown (no such type), unpriced (no price in the last 7 days), platform (no price on the requested platform) or region (not sold in the requested region). |
platformsstring[] | string[] | With platform: the platforms the type has prices on. |
regionsstring[] | string[] | With region: the regions the type is sold in. |
curl -sG "https://go.runs-on.com/api/compare" \
-d instances=m7a.large,m7g.large -d region=eu-west-3 \
| jq '{results: [.results[] | {instanceType, cpuModel, passmark, typicalSpotPrice}], missing, regions, suggestions}'
{
"results": [
{
"instanceType": "m7g.large",
"cpuModel": "AWS Graviton3 (Neoverse-V1)",
"passmark": 1557,
"typicalSpotPrice": 0.0417
}
],
"missing": [
{
"instanceType": "m7a.large",
"instanceFamily": "m7a",
"reason": "region",
"regions": ["ap-northeast-1", "ap-southeast-2", "eu-central-1", "eu-north-1", "eu-west-1", "eu-west-2", "us-east-1", "us-east-2", "us-west-2"]
}
],
"regions": ["eu-west-3"],
"suggestions": ["m7i.large", "m8g.large", "m6a.large", "m6g.large"]
}
Without a region the prices cover only the regions shared by every compared type, so they can differ from /api/finder's for the same type.
List instance types#
GET /api/instances
Every known instance type in name order, with its average prices over the last 24 hours per platform. These are plain means over every zone and run (for spot, of the prices that Price figures counts), not the typical spot price: for prices to quote, use /api/finder.
Parameters
| Parameter | Values | Meaning |
|---|---|---|
typename | name | A family (m7a), a family's types (m7a.* or m7a.) or one type (m7a.large), in lower case. Also instanceType. |
regionone region | one region | Only the types priced there, with that region's prices. |
zoneIdzone ID | zone ID | Only the types priced in that zone (use1-az4). Also zone_id. |
azzone name | zone name | The same by zone name, as the site's AWS account names it: prefer zoneId. |
platformlinux, windows, macos, all | linux, windows, macos, all | One platform, also linux/unix and mac, in any case: only the types priced on it, with its prices. Default: every platform. |
lifecyclespot | spot | Only the types with a spot price that counts (Price figures). Also instanceLifecycle. Other values are ignored. |
archx86_64, arm64, all | x86_64, arm64, all | One architecture, with /api/finder's aliases (amd64, x64, aarch64, graviton...). |
An unknown platform or architecture is a 400, with /api/finder's message; an unknown region, zone or type matches nothing. Without a region, zone, platform or lifecycle=spot, the list includes the types without a price, with empty regions, platforms and pricing.
Result fields
| Field | Type | Meaning |
|---|---|---|
instanceType, instanceFamilystring | string | As in Type and CPU. |
vcpus, memoryGiB, gpusnumber | number | vCPUs, GiB and whole GPUs. |
passmarknumber | number | The family's PassMark score; absent without one. |
cpuSpeednumber | number | The same PassMark score, 0 without one, kept for older clients. Not a clock speed. |
cpuSpeedGhznumber | number | AWS's sustained clock; may be absent. |
cpuModel, cpuManufacturerstring | string | The processor and its vendor, as in Type and CPU (AMD EPYC 9R14, AMD); each may be absent. |
regions, platformsstring[] | string[] | Where the type was priced in the last 24 hours, for the filters. |
pricingobject | object | Per platform, avgSpot: the mean of the spot prices that count (Price figures) of every zone and run of the last 24 hours, and avgOnDemand: the mean on-demand price above $0 of every zone and run. USD/h, rounded to 6 decimals, 0 without one. |
linksobject | object | self: the type's /api/instances/{type} path. |
curl -sG "https://go.runs-on.com/api/instances" -d type=m7a.xlarge
{
"results": [
{
"instanceType": "m7a.xlarge",
"instanceFamily": "m7a",
"vcpus": 4,
"memoryGiB": 16,
"gpus": 0,
"cpuSpeed": 2875,
"passmark": 2875,
"cpuSpeedGhz": 3.7,
"cpuModel": "AMD EPYC 9R14",
"cpuManufacturer": "AMD",
"regions": ["ap-northeast-1", "ap-southeast-2", "eu-central-1", "eu-north-1", "eu-west-1", "eu-west-2", "us-east-1", "us-east-2", "us-west-2"],
"platforms": ["Linux/UNIX", "Windows"],
"pricing": {
"Linux/UNIX": {"avgSpot": 0.103587, "avgOnDemand": 0.256712},
"Windows": {"avgSpot": 0.221, "avgOnDemand": 0.440712}
},
"links": {"self": "/api/instances/m7a.xlarge"}
}
]
}
Zone prices of an instance type#
GET /api/instances/{type}
The latest spot and on-demand price of each zone and platform for one instance type (m7a.xlarge, or m7a.xlarge.json), or for every type of a family (m7a.* or m7a.). Names are lower case: another spelling, and a trailing slash, redirect (301) to the lower-case path, with its .json and its query. A name without a dot is the family export.
Parameters
| Parameter | Values | Meaning |
|---|---|---|
zoneIdzone ID | zone ID | One zone, such as use1-az4: the same physical zone in every AWS account. Recommended. |
azzone name | zone name | One zone, by its name in the site's AWS account: us-east-1b may be another zone in yours, or absent here (no results). |
regionone region | one region | The zones of one region. |
platformlinux, windows, macos, all | linux, windows, macos, all | As /api/instances's; an unknown platform is a 400. Default: every platform. |
Each result is the latest price of the last 24 hours for one zone and platform. Every zone is listed, so that you can look up your own, in this order:
- the spot prices that count in the finder's figures, lowest first;
- then the prices that do not (see Price figures): the last price of a zone AWS stopped pricing (
spotPriceStale), and the prices ofusw1-az2(legacyZone); - then the rows with a
spotPriceof 0: the zone had no spot price in its latest run (no spot there, or a failed fetch).
results is [] when the type has no price for the filters; a type that does not exist is a 404 ({"error": "unknown instance type: zz9.large"}).
Result fields
| Field | Type | Meaning |
|---|---|---|
timestampstring | string | When the price was recorded, RFC 3339. |
region, azstring | string | The zone's region and name (in the site's AWS account). |
zoneIdstring | string | The zone's ID; may be absent for old rows. |
platformstring | string | Linux/UNIX, Windows or macOS. |
spotPrice, onDemandPricenumber | number | USD/h; 0 when there is none. |
spotPriceAtstring | string | When AWS published that spot price, RFC 3339; absent when unknown, as without a spot price. |
spotPriceStaleboolean | boolean | true when AWS stopped pricing the zone: no spot price for more than 3 days, measured from the newest spot price of its region and platform. spotPrice is then its last one, which the finder does not count. |
legacyZoneboolean | boolean | true for usw1-az2, a zone AWS no longer gives to new accounts, whose spot prices the finder does not count. |
cpuModelstring | string | The processor, as in Type and CPU; empty when unknown. |
cpuSpeednumber | number | The family's PassMark score, 0 without one, kept for older clients; passmark is the same, absent without one. |
The other fields (instanceType, cpuManufacturer, vcpus, memoryGiB, gpus, cpuSpeedGhz, architecture, and the GPU, accelerator, storage, network and EBS fields) mean what they mean in Instance type fields.
curl -sG "https://go.runs-on.com/api/instances/m7a.xlarge" \
-d zoneId=use1-az4 -d platform=linux
{
"results": [
{
"timestamp": "2026-10-08T20:44:18Z",
"region": "us-east-1",
"az": "us-east-1b",
"zoneId": "use1-az4",
"instanceFamily": "m7a",
"instanceType": "m7a.xlarge",
"platform": "Linux/UNIX",
"cpuModel": "AMD EPYC 9R14",
"cpuManufacturer": "AMD",
"vcpus": 4,
"memoryGiB": 16,
"gpus": 0,
"cpuSpeed": 2875,
"passmark": 2875,
"cpuSpeedGhz": 3.7,
"onDemandPrice": 0.23184,
"spotPrice": 0.0941,
"spotPriceAt": "2026-10-08T17:00:00Z",
"spotPriceStale": false,
"legacyZone": false,
"architecture": "x86_64",
"networkPerformanceGiBps": 12.5,
"ebsMaxBandwidthMbps": 10000,
"ebsMaxIOPS": 40000,
"ebsBaselineBandwidthMbps": 1250,
"ebsBaselineIOPS": 6000,
"networkPerformanceGbps": 12.5,
"networkBaselineGbps": 1.562,
"networkBurstable": true
}
]
}
Every zone of us-east-1 for t2.2xlarge: AWS stopped pricing use1-az3 in September, so its last price comes after the others.
curl -sG "https://go.runs-on.com/api/instances/t2.2xlarge" \
-d region=us-east-1 -d platform=linux \
| jq -c '.results[] | {zoneId, spotPrice, spotPriceAt, spotPriceStale}'
{"zoneId":"use1-az5","spotPrice":0.0881,"spotPriceAt":"2026-10-08T20:00:00Z","spotPriceStale":false}
{"zoneId":"use1-az6","spotPrice":0.1142,"spotPriceAt":"2026-10-08T17:00:00Z","spotPriceStale":false}
{"zoneId":"use1-az1","spotPrice":0.1155,"spotPriceAt":"2026-10-08T19:00:00Z","spotPriceStale":false}
{"zoneId":"use1-az4","spotPrice":0.1192,"spotPriceAt":"2026-10-08T12:00:00Z","spotPriceStale":false}
{"zoneId":"use1-az2","spotPrice":0.124,"spotPriceAt":"2026-10-08T16:00:00Z","spotPriceStale":false}
{"zoneId":"use1-az3","spotPrice":0.3712,"spotPriceAt":"2026-09-15T21:00:00Z","spotPriceStale":true}
CPU of a family#
GET /api/cpu-info
The processor and PassMark score of one family: family is required (400 without it), in lower case, and a family the site has no CPU record for is a 404.
Response fields
| Field | Type | Meaning |
|---|---|---|
instanceFamilystring | string | The family. |
cpuModelstring | string | The processor as the benchmarks report it, with its architecture, not cleaned up as in the other endpoints' cpuModel; empty when unknown. |
cpuPerformancenumber or null | number or null | The PassMark single-thread score, null without one. |
passmarkSource, passmarkSourceFamily, passmarkMeasuredAt, passmarkBasisstring | string | As in Type and CPU; absent without a score. |
recordedAtstring | string | When the site last recorded the family's CPU, RFC 3339. |
curl -sG "https://go.runs-on.com/api/cpu-info" -d family=c8i
{
"cpuInfo": {
"instanceFamily": "c8i",
"cpuModel": "Intel(R) Xeon(R) 6975P-C (x86_64)",
"cpuPerformance": 3256,
"passmarkSource": "estimated",
"passmarkSourceFamily": "m8i",
"passmarkMeasuredAt": "2026-10-08T00:00:00Z",
"passmarkBasis": "ec2-cpu",
"recordedAt": "2026-10-08T20:44:18Z"
}
}
Family exports#
Each family page, such as /instances/ec2/m8a, has its data in three other formats. Family names are lower case: another spelling, and a trailing slash, redirect (301) to the lower-case URL, and {family}.html to the page. The exports quote their page's figures, its PassMark score included, and may be cached for 5 minutes.
- GET /api/instances/{family}.json - JSON, the default without an extension. An unknown family is a
404with close matches:{"error": "instance family 'zz9' not found", "close_matches": []}. - GET /api/instances/{family}.md - Markdown, also served for
Accept: text/markdown: specs and a table of the types, prices per platform in each type's cheapest region and in every region, and the regions. A retired family says so under its summary. An unknown family is a404in Markdown. - GET /instances/ec2/{family}/regions.atom - an Atom feed with one entry per region the family was first priced in after the site started tracking regions, newest first, linking to the page's region list. Unknown families are a
404.
JSON fields
The JSON export uses snake_case names. Prices follow Price figures, per region.
| Field | Type | Meaning |
|---|---|---|
cpu_modelstring | string | The processor (AMD EPYC 9R45, AWS Graviton4 (Neoverse-V2), Apple M2 Pro), else AWS's vendor. |
cpu_model_is_vendorboolean | boolean | true when cpu_model is only the vendor; absent otherwise. |
cpu_manufacturerstring | string | AWS's processor vendor; may be absent. |
cpu_clock_ghznumber | number | AWS's sustained clock, GHz, the highest of the family's types; may be absent. |
architecturestring | string | x86_64 or arm64. |
instance_typesstring[] | string[] | The family's types, in size order. |
instance_type_specsobject | object | Per type, its specs (next table). |
regionsstring[] | string[] | Regions with a price in the last 7 days. |
platformsstring[] | string[] | Platforms with a price in the last 7 days or in the history. |
min_vcpus, max_vcpusinteger | integer | vCPU range of the family. |
min_memory, max_memorynumber | number | Memory range, GiB. |
max_gpusinteger | integer | Most whole GPUs of a type. |
acceleratorobject | object | The largest accelerator set of the family's types (below); absent without one. |
cpu_speednumber | number | The PassMark score, 0 without one. Not a clock speed. |
passmark_source, passmark_source_family, passmark_measured_at, passmark_basisstring | string | As passmarkSource, passmarkSourceFamily, passmarkMeasuredAt and passmarkBasis; absent without a score. |
description, source_urlstring | string | A description written by Gemini from web sources, and its source. Only its form and the figures AWS lists (vCPUs, network and EBS bandwidth, instance storage) are checked: empty when there is none, or when it contradicts them. |
pricesobject | object | Per platform, then per type, one price per region, cheapest first (regions with spot by typical spot price, then the others by on-demand price). |
regions_first_seenobject | object | Per region, when the site first priced the family there, RFC 3339. The day it started recording the family (the first day of tracking, or the family's first price when that came later) holds every region the family had then. |
pricing_time_seriesobject | object | Per type, the daily prices of the last 15 days on Linux/UNIX (or the family's first platform without Linux prices). |
pricing_time_series_by_platformobject | object | The same, per platform. |
retiredboolean | boolean | true when the family has no price in the 15 days before the site's newest price: AWS retired it, or no longer sells it in the regions the site prices. Its page then says so and is not indexed, and it leaves the sitemap, the ranking and the finder. |
last_pricedstring | string | A retired family's last day with a price, YYYY-MM-DD; absent for an active family and for one never priced. |
An instance_type_specs entry:
| Field | Type | Meaning |
|---|---|---|
vcpus, memory_gib, gpusnumber | number | vCPUs, GiB and whole GPUs (gpus absent at 0). |
cpu_clock_ghznumber | number | AWS's sustained clock, GHz. |
acceleratorobject | object | The type's accelerators (below). |
instance_storage_gb, storage_disks, storage_disk_typenumber, integer, string | number, integer, string | Instance store: decimal GB, disks, nvme-ssd, ssd or hdd. |
network_gbps, network_baseline_gbpsnumber | number | Peak and sustained network bandwidth, Gbit/s. |
ebs_bandwidth_mbps, ebs_baseline_mbpsnumber | number | Peak and sustained EBS bandwidth, Mbit/s. |
A spec field is absent when it does not apply.
An accelerator:
| Field | Type | Meaning |
|---|---|---|
kind, count, manufacturer, model, memory_gibstring, number | string, number | As acceleratorKind, acceleratorCount, acceleratorManufacturer, acceleratorModel and acceleratorMemoryGiB. |
A prices entry:
| Field | Type | Meaning |
|---|---|---|
regionstring | string | The region. |
typical_spot_pricenumber or null | number or null | The typicalSpotPrice of the type in that region, null without spot. |
on_demand_pricenumber | number | The mean on-demand price of the last 7 days, 0 when AWS lists none. |
A pricing_time_series entry:
| Field | Type | Meaning |
|---|---|---|
timestampstring | string | The UTC day, RFC 3339. |
regionstring | string | The region. |
on_demand_pricenumber | number | The day's mean on-demand price. |
spot_pricenumber or null | number or null | The day's mean spot price over every zone and run, null on a day without a counted spot price. Days recorded before October 2026 may count the zones that Price figures leaves out. |
curl -s "https://go.runs-on.com/api/instances/m8a.json" \
| jq '{cpu_model, cpu_clock_ghz, cpu_speed, passmark_source, regions, retired, large: .prices["Linux/UNIX"]["m8a.large"][0:2]}'
{
"cpu_model": "AMD EPYC 9R45",
"cpu_clock_ghz": 4.5,
"cpu_speed": 3801,
"passmark_source": "measured",
"regions": ["ap-northeast-1", "ap-south-1", "eu-central-1", "eu-west-1", "us-east-1", "us-east-2", "us-west-2"],
"retired": false,
"large": [
{"region": "us-east-2", "typical_spot_price": 0.0212, "on_demand_price": 0.12172},
{"region": "ap-south-1", "typical_spot_price": 0.0247, "on_demand_price": 0.12806}
]
}
curl -s "https://go.runs-on.com/api/instances/m8a.md" | head -12
# m8a EC2 instance family
AMD EPYC 9R45 at 4.5 GHz, x86_64, 1 to 192 vCPUs, 4 to 768 GiB.
## Specs
- **Architecture:** x86_64
- **Processor:** AMD EPYC 9R45 (4.5 GHz sustained)
- **vCPUs:** 1 to 192
- **Memory:** 4 to 768 GiB
- **Single-thread PassMark:** 3801, measured on m8a, 2026-10-08: the median of its types in [runs-on.com benchmarks](https://runs-on.com/benchmarks/aws-ec2-instances/)
- **Platforms:** Linux/UNIX, Windows
In the Atom feed, an entry's title is the region, its updated the time the family was first priced there, its summary names the region's location, and its link points to the page's #available-regions. The regions of the day the site started recording the family (the first day of tracking, or the family's first price) are left out: that day says nothing of when AWS launched them. The feed is empty for a family that has gained no region since.
Sitemap and robots.txt#
GET /sitemap.xml
The home page, /finder, /instances/ranking, /compare, /api, and the page of every active family, with the day of its newest price as lastmod. A family is active while it has a price less than 15 days older than the site's newest price; a retired family keeps its page, marked retired and not indexed, but leaves the sitemap, the ranking and the finder.
curl -s "https://go.runs-on.com/sitemap.xml" | grep -c "<loc>"
GET /robots.txt
Crawlers may read every page, and of the JSON API only the two endpoints the finder and compare pages load their content from.
User-agent: *
Allow: /api/facets
Allow: /api/compare
Disallow: /api/
Sitemap: https://go.runs-on.com/sitemap.xml