Provider price data
From data/providers/README.md in the repository, rendered 2026-10-12.
Machine-readable price and capability profiles for storage providers. They feed the cost estimates and the provider comparison, so they must be accurate and traceable.
| File | Purpose |
|---|---|
schema.json |
JSON Schema (draft 2020-12) every profile must satisfy |
aws-s3.json |
Amazon S3, region eu-central-1 (Frankfurt) |
scaleway-object-storage.json |
Scaleway Object Storage, region fr-par (Paris) |
hetzner-storage-box.json |
Hetzner Storage Box (prices not yet verified, see below) |
Rules
- No price without a source and a date. Every numeric value carries
source_url(anhttps://URL of the official page or machine-readable price list) andlast_verified(ISO date,YYYY-MM-DD, the day a person or tool actually read the value there). The schema rejects a number without both. - Unknown means
nullplus a note. If a value cannot be verified from an official source, set"value": nulland explain innotewhy. Never fill a gap from memory, from a third-party listing or from an estimate. Anullis a statement that the value is unknown, not that it is zero. - Use official sources first: the provider's own pricing page, price-list API or documentation. State the exact item (page section, usage type, SKU) in
noteso the next person can re-check it. - Warn when older than 90 days.
scripts/data/validate-providers.shprints a warning for everylast_verifiedolder than 90 days. Re-verify before relying on the number, then update the value and the date together. - Say what a profile covers. Prices are only valid for the regions listed in
applies_to_regions. Do not extend a price to other regions without verifying them. - One currency per profile, in
currency, as the provider lists it. Do not convert. State whether tax is included inprices_include_tax(nullif unknown). - Absence is not zero. If a price list simply has no line for a fee, record
nullwith a note (or0only when the source says the item is free or included). - Do not copy prices elsewhere. Planning documents link to these files instead of repeating numbers.
Units
- Storage: price per GB-month, as the provider bills it.
storage_price_per_gb_monthis a list of volume bands (from_gb,up_to_gb; the last band hasup_to_gb: null). Providers with a flat plan usepricing_model: "fixed_plan"andplans. - Requests: price per 1000 requests. If the provider lists a price per 10,000 requests, divide and say so in
note. - Egress: price per GB after the free allowance (
free_allowance_gb_per_month), by volume band. - Retrieval: price per GB for cold classes, with the typical delay as quoted by the provider (
typical_delay). minimum_storage_duration_days,minimum_billable_object_size_kb,per_object_overhead_kb: as published; early deletion is normally billed pro rata for the remaining days.- Other fields:
protocols(s3,sftp,webdav,rcloneand a few more),regions(code, city, ISO country),object_lock(immutability support).
Validating
scripts/data/validate-providers.sh # all profiles
scripts/data/validate-providers.sh data/providers/aws-s3.json
scripts/data/validate-providers.sh --max-age-days 30 --fail-on-staleThe script uses the first validator it finds: check-jsonschema, ajv (with ajv-formats) or Python 3 with the jsonschema package, and prints install instructions if none is available. Exit codes: 0 valid, 1 invalid (or stale with --fail-on-stale), 2 usage error or no validator.
Adding or updating a provider
- Copy the closest existing profile and adjust it.
- Read each value from an official source on the day you record it; write the source and date next to it.
- Run the validator. Fix errors; read the age warnings.
- In the pull request, list what you could not verify.
Known gaps
hetzner-storage-box.json: the monthly plan prices arenull. The official product page renders prices with client-side scripts and no official static source could be read. Fill them in from the product page and verify before using this profile in estimates.- Request prices for archive classes (LIST in particular), per-request retrieval fees and the cold-class delay for bulk retrievals are modelled only where verified; see the notes in each profile.