self-host →

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.

  • Requests: GET on https://go.runs-on.com, except POST /api/facets; every GET endpoint answers HEAD too. 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. 400 for an invalid parameter, 404 for an unknown endpoint, instance type or family, 405 for another method (with an Allow header), 500 when 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 (or linux/unix), windows and macos (or mac), in any case. Responses name them Linux/UNIX, Windows and macOS.
  • Zones: prefer zone IDs such as use1-az4. AWS maps zone names such as us-east-1b to 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/finder answer holds every priced type, a few megabytes.

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-az2 in 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 to avgSpotPrice, which is 0 when no spot price counts at all.
  • typicalSpotRuns - Runs averaged in typicalSpotPrice: 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, where typicalSpotPrice mostly comes from; typicalSpotZoneRuns is in how many of the typicalSpotRuns. 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 spotPriceNow from 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. minSpotPrice is 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 behind avgSpotPrice and 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 regions avgOnDemandPrice averages.

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.

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

Parameters of GET /api/finder
ParameterValuesMeaning
regionregion names, allregion names, allAWS 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, alllinux, windows, macos, allThe 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, integersrange, integersvCPUs.
ramrangerangeMemory in GiB. A single value matches exactly that much (15.25 for i3.large).
gpurange, integersrange, integersWhole GPUs (gpus). A type with a fraction of a GPU has 0: select those with accelerator=gpu.
passmarkrangerangePassMark single-thread score. A single value is a minimum. Types without a score never match.
archx86_64, arm64, allx86_64, arm64, allArchitectures, 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, inferencegpu, neuron, fpga, media, inferenceAccelerator kinds (acceleratorKind), separated by commas or plus signs.
familytermstermsFamilies 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

Fields of the GET /api/finder response
FieldTypeMeaning
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.
top3PriceBasisstringstringThe 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"
}

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

Type and CPU fields
FieldTypeUnitMay be absentMeaning
instanceTypestringstringnoThe instance type, such as m8a.large.
instanceFamilystringstringnoIts family, the part before the dot.
providerstringstringnoAlways ec2.
architecturestringstringnox86_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 · vCPUsintegervCPUsnoA 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 absentstringyesThe 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 absentstringyesThe 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 absentnumberGHzyesThe 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 absentbooleanyestrue 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 absentnumberscoreyesThe family's PassMark single-thread score. Absent when the family has none: not benchmarked, not slow.
passmarkSourcestring · may be absentstringyesmeasured (benchmarked on the family) or estimated (copied from a family with the same processor). Absent without a score.
passmarkSourceFamilystring · may be absentstringyesThe 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 absentstringRFC 3339yesThe 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 absentstringyesHow 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

Memory, GPU and accelerator fields
FieldTypeUnitMay be absentMeaning
memoryGiBnumber · GiBnumberGiBnoMemory.
gpusinteger · GPUsintegerGPUsnoWhole GPUs only: g6f.large, with an eighth of a GPU, has 0 (see acceleratorCount).
gpuModelstring · may be absentstringyesThe GPU, as AWS names it: H100, L4.
gpuMemoryGiBnumber · GiB · may be absentnumberGiByesThe memory of all the type's GPUs together (p5.48xlarge: 640), or of its slice of a GPU.
acceleratorKindstring · may be absentstringyesgpu (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 absentnumberyesHow many; may be a fraction: g6f.large has 0.125 of an NVIDIA L4.
acceleratorManufacturerstring · may be absentstringyesAs AWS reports it: NVIDIA, AMD, AWS, Xilinx, Qualcomm.
acceleratorModelstring · may be absentstringyesAs AWS reports it: H100, Inferentia2.
acceleratorMemoryGiBnumber · GiB · may be absentnumberGiByesThe memory of all the accelerators together, or of the slice of a fractional GPU.

Storage and network

Storage, network and EBS fields
FieldTypeUnitMay be absentMeaning
instanceStorageGBnumber · GB · may be absentnumberGByesTotal 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 absentintegerdisksyesNumber of instance store disks.
storageDiskTypestring · may be absentstringyesnvme-ssd, ssd or hdd.
storageTypestring · may be absentstringyesThe label of storageDiskType: NVMe SSD, SSD or HDD.
storageSpaceGiBnumber · GB · may be absentnumberGByesDeprecated: the same decimal GB value as instanceStorageGB, despite its name.
networkPerformanceGbpsnumber · Gbit/s · may be absentnumberGbit/syesPeak 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 absentnumberGbit/syesThe bandwidth the type sustains (m8a.large: 0.937).
networkBurstableboolean · may be absentbooleanyestrue when the baseline is below the peak: the type reaches the peak in bursts only. Absent when unknown.
networkPerformanceGiBpsnumber · Gbit/s · may be absentnumberGbit/syesDeprecated: 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 absentnumberMbit/syesPeak EBS bandwidth.
ebsBaselineBandwidthMbpsnumber · Mbit/s · may be absentnumberMbit/syesEBS bandwidth the type sustains.
ebsMaxIOPSinteger · IOPS · may be absentintegerIOPSyesPeak EBS IOPS.
ebsBaselineIOPSinteger · IOPS · may be absentintegerIOPSyesEBS IOPS the type sustains.

Prices

Defined in Price figures, for the requested regions and platforms.

Price fields
FieldTypeUnitMay be absentMeaning
regionsstring[]string[]noThe requested regions in which the type has a price in the last 7 days.
spotRegionCountinteger · regionsintegerregionsnoHow many of regions have a spot price that counts, the regions behind the spot figures; 0 without one.
onDemandRegionCountinteger · regionsintegerregionsnoHow many of regions have an on-demand price, the regions avgOnDemandPrice averages.
typicalSpotPricenumber · USD/h · may be absentnumberUSD/hyesWhat spot typically costs: the figure to quote. Absent means unknown: fall back to avgSpotPrice.
typicalSpotRunsinteger · runs · may be absentintegerrunsyesRuns averaged, about 105 for a full week.
typicalSpotSincestring · RFC 3339 · may be absentstringRFC 3339yesStart of the oldest run averaged.
typicalSpotRegionstring · may be absentstringyesRegion of the zone that was the cheapest in the most runs.
typicalSpotZoneIdstring · may be absentstringyesThat zone's ID, such as use1-az5.
typicalSpotZoneRunsinteger · runs · may be absentintegerrunsyesIn how many of the typicalSpotRuns that zone was the cheapest.
spotPriceNownumber · USD/h · may be absentnumberUSD/hyesThe cheapest zone's spot price in the newest run.
spotZoneAvgNownumber · USD/h · may be absentnumberUSD/hyesMean spot price of the zones in the newest run.
spotPriceNowAtstring · RFC 3339 · may be absentstringRFC 3339yesStart of the newest run.
avgSpotPricenumber · USD/hnumberUSD/hnoMean of every counted spot price of the 7 days; 0 without one.
minSpotPrice, maxSpotPricenumber · USD/h · may be absentnumberUSD/hyesLowest and highest spot price of one zone and run.
minSpotRegion, maxSpotRegionstring · may be absentstringyesTheir regions.
minSpotPlatform, maxSpotPlatformstring · may be absentstringyesTheir platforms.
avgOnDemandPricenumber · USD/hnumberUSD/hnoMean on-demand price of the regions, each counted once; 0 when AWS lists none.
minOnDemandPrice, maxOnDemandPricenumber · USD/h · may be absentnumberUSD/hyesThe cheapest and dearest region's on-demand price.
minOnDemandRegion, maxOnDemandRegionstring · may be absentstringyesThose regions.
minOnDemandPlatform, maxOnDemandPlatformstring · may be absentstringyesTheir platforms.
platformPricesobject[]object[]noOne 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.
Fields of a platformPrices item that the result has not
FieldTypeUnitMay be absentMeaning
platformstringstringnoLinux/UNIX, Windows or macOS.

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 (passmarkSingle in ec2-cpu.json). A family's score is the median of its benchmarked types' newest figures (passmarkBasis ec2-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 passmark field.

The provenance fields are passmarkSource, passmarkSourceFamily, passmarkMeasuredAt and passmarkBasis (see Type and CPU). cpuSpeedGhz is AWS's stated clock, not a benchmark.

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.

Fields of the POST /api/facets body
FieldTypeMeaning
regionsstring[]string[]AWS regions. Default: every region.
regionModestringstringAND (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.
textstringstringAs 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

Fields of the POST /api/facets response
FieldTypeMeaning
resultsobject[]object[]The matching types, as in /api/finder.
top3ByPrice, top3ByPerformance, top3, top3PriceBasisAs in /api/finder.
familyCountsobjectobjectMatching types per family: {"m8g": 2}.
availabilityobjectobjectEvery 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:

Fields of a facet item
FieldTypeMeaning
valuestringstringThe value to send back: a region, an architecture, or a range such as 0.05-0.1 or 64000+.
labelstringstringHow the page shows it: 1.024Gbps, < 100 GB.
min, maxnumbernumberThe numeric range of a numeric facet's value; max is absent for a bucket with no maximum.
countintegerintegerRegions only, in AND mode without a price range: how many matching types are also priced in that region. Absent elsewhere.
selectedbooleanbooleantrue when the request selects it; absent otherwise.
availablebooleanbooleanWhether a matching type has this value. Always true for platforms, and for regions without a count.
unpricedbooleanbooleanRegions 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.

Fields of a price histogram
FieldTypeMeaning
min, maxnumbernumberThe lowest and highest price of those types, USD per hour.
countintegerintegerHow 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}

GET /api/compare

Two or three instance types side by side, as on the compare page, with the prices of /api/finder.

Parameters

Parameters of GET /api/compare
ParameterValuesMeaning
instances2 or 3 types2 or 3 typesRequired. 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, allone region, allThe 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/finderas /api/finderDefault: linux.

Response fields

Fields of the GET /api/compare response
FieldTypeMeaning
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:

Fields of a compare result beyond the instance type fields
FieldTypeMeaning
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:

Fields of a missing item
FieldTypeMeaning
instanceTypestringstringThe requested type.
instanceFamilystringstringIts family; absent for an unknown type.
reasonstringstringunknown (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.

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

Parameters of GET /api/instances
ParameterValuesMeaning
typenamenameA family (m7a), a family's types (m7a.* or m7a.) or one type (m7a.large), in lower case. Also instanceType.
regionone regionone regionOnly the types priced there, with that region's prices.
zoneIdzone IDzone IDOnly the types priced in that zone (use1-az4). Also zone_id.
azzone namezone nameThe same by zone name, as the site's AWS account names it: prefer zoneId.
platformlinux, windows, macos, alllinux, windows, macos, allOne platform, also linux/unix and mac, in any case: only the types priced on it, with its prices. Default: every platform.
lifecyclespotspotOnly the types with a spot price that counts (Price figures). Also instanceLifecycle. Other values are ignored.
archx86_64, arm64, allx86_64, arm64, allOne 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

Fields of a GET /api/instances result
FieldTypeMeaning
instanceType, instanceFamilystringstringAs in Type and CPU.
vcpus, memoryGiB, gpusnumbernumbervCPUs, GiB and whole GPUs.
passmarknumbernumberThe family's PassMark score; absent without one.
cpuSpeednumbernumberThe same PassMark score, 0 without one, kept for older clients. Not a clock speed.
cpuSpeedGhznumbernumberAWS's sustained clock; may be absent.
cpuModel, cpuManufacturerstringstringThe 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.
pricingobjectobjectPer 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.
linksobjectobjectself: 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"}
    }
  ]
}

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

Parameters of GET /api/instances/{type}
ParameterValuesMeaning
zoneIdzone IDzone IDOne zone, such as use1-az4: the same physical zone in every AWS account. Recommended.
azzone namezone nameOne 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 regionone regionThe zones of one region.
platformlinux, windows, macos, alllinux, windows, macos, allAs /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 of usw1-az2 (legacyZone);
  • then the rows with a spotPrice of 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

Fields of a GET /api/instances/{type} result
FieldTypeMeaning
timestampstringstringWhen the price was recorded, RFC 3339.
region, azstringstringThe zone's region and name (in the site's AWS account).
zoneIdstringstringThe zone's ID; may be absent for old rows.
platformstringstringLinux/UNIX, Windows or macOS.
spotPrice, onDemandPricenumbernumberUSD/h; 0 when there is none.
spotPriceAtstringstringWhen AWS published that spot price, RFC 3339; absent when unknown, as without a spot price.
spotPriceStalebooleanbooleantrue 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.
legacyZonebooleanbooleantrue for usw1-az2, a zone AWS no longer gives to new accounts, whose spot prices the finder does not count.
cpuModelstringstringThe processor, as in Type and CPU; empty when unknown.
cpuSpeednumbernumberThe 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}

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

Fields of cpuInfo
FieldTypeMeaning
instanceFamilystringstringThe family.
cpuModelstringstringThe processor as the benchmarks report it, with its architecture, not cleaned up as in the other endpoints' cpuModel; empty when unknown.
cpuPerformancenumber or nullnumber or nullThe PassMark single-thread score, null without one.
passmarkSource, passmarkSourceFamily, passmarkMeasuredAt, passmarkBasisstringstringAs in Type and CPU; absent without a score.
recordedAtstringstringWhen 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"
  }
}

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 404 with 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 a 404 in 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.

Fields of the family JSON export
FieldTypeMeaning
cpu_modelstringstringThe processor (AMD EPYC 9R45, AWS Graviton4 (Neoverse-V2), Apple M2 Pro), else AWS's vendor.
cpu_model_is_vendorbooleanbooleantrue when cpu_model is only the vendor; absent otherwise.
cpu_manufacturerstringstringAWS's processor vendor; may be absent.
cpu_clock_ghznumbernumberAWS's sustained clock, GHz, the highest of the family's types; may be absent.
architecturestringstringx86_64 or arm64.
instance_typesstring[]string[]The family's types, in size order.
instance_type_specsobjectobjectPer 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_vcpusintegerintegervCPU range of the family.
min_memory, max_memorynumbernumberMemory range, GiB.
max_gpusintegerintegerMost whole GPUs of a type.
acceleratorobjectobjectThe largest accelerator set of the family's types (below); absent without one.
cpu_speednumbernumberThe PassMark score, 0 without one. Not a clock speed.
passmark_source, passmark_source_family, passmark_measured_at, passmark_basisstringstringAs passmarkSource, passmarkSourceFamily, passmarkMeasuredAt and passmarkBasis; absent without a score.
description, source_urlstringstringA 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.
pricesobjectobjectPer 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_seenobjectobjectPer 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_seriesobjectobjectPer 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_platformobjectobjectThe same, per platform.
retiredbooleanbooleantrue 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_pricedstringstringA 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:

Fields of an instance_type_specs entry
FieldTypeMeaning
vcpus, memory_gib, gpusnumbernumbervCPUs, GiB and whole GPUs (gpus absent at 0).
cpu_clock_ghznumbernumberAWS's sustained clock, GHz.
acceleratorobjectobjectThe type's accelerators (below).
instance_storage_gb, storage_disks, storage_disk_typenumber, integer, stringnumber, integer, stringInstance store: decimal GB, disks, nvme-ssd, ssd or hdd.
network_gbps, network_baseline_gbpsnumbernumberPeak and sustained network bandwidth, Gbit/s.
ebs_bandwidth_mbps, ebs_baseline_mbpsnumbernumberPeak and sustained EBS bandwidth, Mbit/s.

A spec field is absent when it does not apply.

An accelerator:

Fields of an accelerator object
FieldTypeMeaning
kind, count, manufacturer, model, memory_gibstring, numberstring, numberAs acceleratorKind, acceleratorCount, acceleratorManufacturer, acceleratorModel and acceleratorMemoryGiB.

A prices entry:

Fields of a prices entry
FieldTypeMeaning
regionstringstringThe region.
typical_spot_pricenumber or nullnumber or nullThe typicalSpotPrice of the type in that region, null without spot.
on_demand_pricenumbernumberThe mean on-demand price of the last 7 days, 0 when AWS lists none.

A pricing_time_series entry:

Fields of a time series entry
FieldTypeMeaning
timestampstringstringThe UTC day, RFC 3339.
regionstringstringThe region.
on_demand_pricenumbernumberThe day's mean on-demand price.
spot_pricenumber or nullnumber or nullThe 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.

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