Catalog and availability
Objective
Section titled “Objective”Both endpoints on this page are public. No account, no key, no signature — build a price page, a size picker or a comparison against us without signing up.
GET https://storefront.job-rss-processor.workers.dev/v1/catalogGET https://storefront.job-rss-processor.workers.dev/v1/pricesGET https://storefront.job-rss-processor.workers.dev/v1/prices/comparisonAll three are cached for 60 seconds at the edge, keyed on the URL. A burst of traffic costs one round trip to the cloud, not one per request.
GET /v1/catalog
Section titled “GET /v1/catalog”One entry per purchasable shape:
| Field | Type | Meaning |
|---|---|---|
name | string | Our name, e.g. cd-standard-2-8 |
vcpus | number | |
ramMiB | number | |
diskGiB | number | Root disk included with the shape |
aliases | object | Cloud → comma-joined names, e.g. {"aws": "m5.large", …} |
inStock | boolean | Live. See below |
priceEurHour | number or null | Euros per hour |
The catalog reads the cloud itself — the compute service’s flavors and the compute service’s capacity — rather than a list maintained beside it. That is the point: it cannot disagree with what an order would actually get. A flavor that does not exist on the box is not in the catalog, and a shape the box cannot currently fit says so.
inStock is computed, not declared
Section titled “inStock is computed, not declared”inStock ⟺ shape.vcpus ≤ freeVCPUs and shape.ramMiB ≤ freeRamMiBIn stock iff the remaining capacity fits one more of it. freeVCPUs and
freeRamMiB come from the compute service’s live hypervisor statistics on every call, not from
a number someone updates.
This is why the site can say it sometimes declines to quote and say why: a large shape goes out of stock before a small one, because the box genuinely cannot fit another.
Two things to know when you consume it:
- It is a snapshot, not a reservation.
inStock: truemeans the capacity existed when the call was answered — up to 60 seconds ago, given the cache. Another customer can take it before you do. A launch can still fail withInsufficientInstanceCapacity; treat that as the authoritative answer. vcpus_usedcan exceedvcpuson the real box — an inconsistent but observed upstream state, from overcommit accounting lag or a stale aggregate. Free capacity is clamped at zero rather than left negative, so nothing here ever reports negative stock, even transiently.
priceEurHour: null means unpriced, not free
Section titled “priceEurHour: null means unpriced, not free”A null price means the rating service has no rating mapping for that flavor.
The shape exists and can be launched; nothing will bill for it.
That is a defect in the rating configuration, not a discount, and it will be
fixed. Do not build a cost model on a null.
Where the price comes from
Section titled “Where the price comes from”Prices are read live from the rating service’s hashmap module, in three hops: find
the instance service, find its flavor_name field, read that field’s
{flavor → cost} mappings.
This matters because it is the same number that bills you. Metering’s ledger carries whatever the rating service rated, so the storefront reads prices from the rating service rather than keeping a copy — there is no second price list to drift out of step with the first.
A cloud with no instance service configured in the hashmap module yields an
empty map rather than an error: no price is a fact about the cloud, not a
failure of the call.
For the rule that decides what those numbers are, see How prices are set.
GET /v1/prices/comparison
Section titled “GET /v1/prices/comparison”What the same machine costs elsewhere, one row per shape per provider:
| Field | Meaning |
|---|---|
shape | Our shape name |
provider | aws, azure, ovh |
usd_hour | Their price for the cheapest equivalent |
egress_included_gb | Their monthly allowance |
egress_usd_per_gb | Their rate beyond it |
method | How the figure was arrived at |
source | The URL it was read from |
as_of | The date it was read |
usd_to_eur | The rate used to convert |
Every row carries source, as_of and method, so a comparison we publish can
be checked rather than believed. The rows are written by the infrastructure repository’
rating play, from the same computation that sets our own price — the cheapest
current-generation AWS type at least as large — with the egress terms the
catalog declares. The storefront only reads them.
This is what the calculator on the pricing page runs on.
Worked example
Section titled “Worked example”curl -s https://storefront.job-rss-processor.workers.dev/v1/catalog \ | jq '.[] | select(.inStock) | {name, vcpus, ramMiB, priceEurHour, aws: .aliases.aws}'curl -s https://storefront.job-rss-processor.workers.dev/v1/prices/comparison \ | jq '.comparisons[] | select(.shape=="cd-memory-2-16")'What it will not tell you
Section titled “What it will not tell you”- Not how much capacity is left, only whether one more of a given shape fits. The absolute free vCPU and RAM figures are not published.
- Not your own quota — that is
cloud quota show, see Quotas and limits. - Not storage price. Attached volumes are not rated at all yet, so no volume appears in either endpoint.
Go further
Section titled “Go further”- How prices are set
- Metering and invoicing
- Instance types — the full alias table
- Account API