This gateway serves one conformant declaration per reporting subject at /{domain}/.well-known/sustainability-data, so the format can be tested against real, sourced disclosures before organizations publish their own. In real use the declaration lives on the subject's own origin; a gateway only demonstrates and tests the format.
Please read. Declarations about third parties are ILLUSTRATIVE MAPPINGS the gateway operator read from each organization's own published report, named in methodology-uri; no figure is estimated. They are not reviewed, authorized or endorsed by those organizations, and this gateway is not an authoritative source for them. Names ending .example are synthetic.
application/json type is still served, and flagged as such.Subjects served (20)
| Endpoint | Reporting subject | Period | Method | Provenance |
|---|---|---|---|---|
automattic.com sourced |
Automattic Inc. (data centre operations) (organization) | 2020 |
hardware-estimated |
source document data file |
cloud-demo.example synthetic |
t-7f3a9c41 (tenant) | 2025 |
cloud-billing |
methodology data file |
commission.europa.eu sourced |
European Commission (organization) | 2024 |
third-party-modeled |
source document data file |
eca.europa.eu sourced |
European Court of Auditors (organization) | 2024 |
third-party-modeled |
source document data file |
eea.europa.eu sourced |
European Environment Agency (organization) | 2024 |
third-party-modeled |
source document data file |
ema.europa.eu sourced |
European Medicines Agency (organization) | 2024 |
third-party-modeled |
source document data file |
go.eco sourced |
Big Room Inc. (.eco registry) (organization) | 2024-10-01T00:00:00Z/2025-10-01T00:00:00Z |
third-party-modeled |
source document data file |
hetzner.com sourced |
Hetzner Online GmbH (organization) | 2024 |
third-party-modeled |
source document data file |
hmrc.gov.uk sourced |
HM Revenue and Customs (organization) | 2025-04-01T00:00:00Z/2026-04-01T00:00:00Z |
third-party-modeled |
source document data file |
home.cern sourced |
CERN (organization) | 2024 |
third-party-modeled |
source document data file |
infomaniak.com sourced |
Infomaniak Group SA (organization) | 2024 |
third-party-modeled |
source document data file |
mozilla.org sourced |
Mozilla Foundation and Mozilla Corporation (organization) | 2025 |
third-party-modeled |
source document data file |
retailer.example synthetic |
retailer.example (organization) | 2025 |
third-party-modeled |
methodology data file |
saas-platform.example synthetic |
saas-platform.example (service) | 2025 |
hardware-metered |
methodology data file |
scottlogic.com sourced |
Scott Logic Limited (organization) | 2025 |
third-party-modeled |
source document data file |
sfc-network.example synthetic |
sfc-network.example (service) | 2025 |
third-party-modeled |
methodology data file |
sfc-operator.example synthetic |
sfc-operator.example (origin) | 2025 |
hardware-metered |
methodology data file |
tenant-demo.example synthetic |
Tenant Demo Ltd (organization) | 2025 |
third-party-modeled |
methodology data file |
thegreenwebfoundation.org sourced |
Green Web Foundation (organization) | 2023 |
third-party-modeled |
source document data file |
wikimedia.org sourced |
Wikimedia Foundation (organization) | 2024 |
third-party-modeled |
source document data file |
Adapter demonstrations (14)
One subject per upstream-backed adapter: the eight of the published sustainability-wellknown-publisher package, and the adapters that live in this gateway: DIST, the IETF GREEN power-and-energy YANG model and, experimentally, the SFC ledger bridge in two profiles with two relays of the profile's reference declarations (all SFC subjects signed with a public test key), so every adapter runs end to end here. Live subjects fetch a real upstream daily (only where the license permits attributed republication; the attribution is in the document). Replay subjects run the same adapter code against a recorded response, because no free legal live access exists; their figures are synthetic and say so in the document. All use reserved .example names and describe no real organization.
| Endpoint | Adapter | Input → declaration | Upstream & attribution | Period |
|---|---|---|---|---|
carbontxt-demo.example live |
carbontxt-api (LIVE GWF validator API, daily) |
input → declaration · live upstream (CC BY 4.0) The Green Web Foundation carbon.txt validator API's response for the Foundation's own carbon.txt, as recorded on 2026-07-30: the parsed file with its real disclosure links. |
GWF carbon.txt validator API (free key) / recorded carbon.txt carbon.txt self-published by its organization; validator by GWF |
2025 |
climatiq-demo.example replay |
climatiq (synthetic response in Climatiq's documented shape, replay) |
input → declaration An estimate response in the shape of Climatiq's published API reference. The numbers are synthetic and none of it is Climatiq data: Climatiq's terms restrict redistribution, so nothing it returns is relayed here. |
Climatiq estimate API (replay only here: its terms restrict redistribution) synthetic figures; no Climatiq data is relayed |
2026-10 |
co2js-demo.example live |
co2js (local SWD model, live Greencheck, daily) |
input → declaration The only input CO2.js needs is a byte count: one gigabyte, so the result is a score per gigabyte. The size of one crawl of this gateway, measured by serializing every document it serves when it starts, is given for scale. |
CO2.js locally (Ember data) + GWF Greencheck CO2.js Apache-2.0; Ember CC BY 4.0; GWF Green Domains ODbL |
2026-10 |
dist-demo.example live |
dist (LIVE Green Web Foundation dist.json, daily) |
input → declaration · live upstream (CC BY 4.0) The Green Web Foundation's own dist.json, as recorded. In live mode the gateway reads the current file daily; the live link shows it. |
Green Web Foundation dist.json (DIST v0.0.1) Green Web Foundation, CC BY 4.0 |
2023 |
grid-intensity-demo.example live |
computed (LIVE NESO grid intensity, daily) |
input → declaration · live upstream (CC BY 4.0) The one value this demonstration reads from the NESO response, as recorded on 2026-07-30. The full response is not stored; the live link returns the current one, which is what the live mode reads. |
NESO Carbon Intensity API (api.carbonintensity.org.uk) NESO Carbon Intensity API, CC BY 4.0 |
2026-10 |
kepler-demo.example replay |
kepler-prometheus (recorded fixture, replay mode) |
input → declaration A Prometheus instant-query response for Kepler's energy counters, in the shape the Prometheus HTTP API returns. The figures are synthetic: no public Prometheus with Kepler metrics exists to record from. |
Kepler energy counters via Prometheus (no public instance; replay) synthetic figures; recorded Prometheus query response |
2025 |
ms-sustainability-demo.example replay |
ms-sustainability (retired OData shape, replay) |
input → declaration Two pages of a Microsoft emissions API response, in the shape of the retired tenantemissions endpoint. The figures are synthetic. |
MS Cloud for Sustainability (preview API retired 2025-05-30; replay) synthetic figures; shape per the retired tenantemissions API |
2025 |
salesforce-nzc-demo.example replay |
salesforce-nzc (documented SOQL shape, replay) |
input → declaration A SOQL query result over Net Zero Cloud's annual emissions inventory object, with the field names of the Net Zero Cloud developer guide. The figures are synthetic. |
Salesforce Net Zero Cloud (30-day trial orgs exist; replay here) synthetic figures; field names per NZC developer guide |
2025 |
sfc-ledger-demo-2.example replay |
sfc-ledger-bridge (SFC profile 2.0, recorded ledger read, replay, experimental) |
input → declaration A recorded ledger read (SFC profile 2.0 excerpt, format 2) of a synthetic network: three operators, fifteen months of signed EnergyAttested and CarbonAttested events, their Registry entries and the registrar key. Every figure is invented; every signature uses the public RFC 8032 test key. The declaration's ledger-evidence-2 extension points here, so a reader can run the deep check. |
SFC profile 2.0 attestation events of a three-operator network (recorded synthetic read; no public ledger; replay) synthetic figures; events, Registry and declaration signed with the public RFC 8032 test key |
2025 |
sfc-ledger-demo.example replay |
sfc-ledger-bridge (recorded ledger excerpt, replay, experimental) |
input → declaration A recorded excerpt of a synthetic ledger: one operator's signed monthly EnergyAttested and CarbonAttested events for January to April 2026, its Registry key and its signed allocation of one retired tonne. Every figure is invented; every signature uses the public RFC 8032 test key. The declaration's ledger-evidence extension points here, so a reader can run the deep check. |
SFC ledger profile 1.2 attestation events (recorded synthetic excerpt; no public ledger; replay) synthetic figures; events and declaration signed with the public RFC 8032 test key |
2026-04 |
sfc-network-2.example replay |
sfc-reference-declaration (SFC profile 2.0 example, replay) |
input → declaration The recorded ledger read this reference declaration recomputes from (the three-operator network of the SFC 2.0 test vectors). Every figure is invented. |
SFC profile 2.0 reference network declaration (sfc-compliance/examples; synthetic) synthetic figures; signed with the public RFC 8032 test key |
2025 |
sfc-operator-2.example replay |
sfc-reference-declaration (SFC profile 2.0 example, replay) |
input → declaration The recorded ledger read this reference declaration recomputes from (the three-operator network of the SFC 2.0 test vectors). Every figure is invented. |
SFC profile 2.0 reference operator declaration (sfc-compliance/examples; synthetic) synthetic figures; signed with the public RFC 8032 test key |
2025-01 |
watershed-demo.example replay |
watershed (documented footprint shape, replay) |
input → declaration A footprint summary in the shape of Watershed's API documentation, which is open to customer keys only. The figures are synthetic. |
Watershed API (customer-only keys, no sandbox; replay) synthetic figures; shape per api-docs.watershed.com |
2025 |
yang-energy-demo.example replay |
yang-power-energy (recorded RFC 7951 snapshots, replay) |
input → declaration Two RFC 7951 JSON snapshots of the ietf-power-and-energy data model, read over RESTCONF at the start and end of the period; the energy is the difference of the counters. The figures are synthetic: no public device implements the working-group draft. |
ietf-power-and-energy over RESTCONF (IETF GREEN WG draft; no public device; replay) synthetic figures; data model per draft-ietf-green-power-and-energy-yang-04 |
2025 |
Wire-format examples (42)
Every case in the specification's example set, served live, with synthetic figures under reserved .example names. A file that holds a series answers a request without parameters with its newest object, or with the whole array where the objects belong together; a case that declares capabilities: extended answers start, end, target and granularity with the objects it holds that satisfy them (an empty array when none does), and a case that declares basic ignores them.
| Endpoint | Case | Shape | Period | Demonstrates |
|---|---|---|---|---|
basic.example example |
Basic response target example.com source file |
object | 2026-02 |
An origin-wide monthly report in the Basic shape, with explicit units. |
minimal.example example |
Minimal document target minimal.example source file |
object | 2025 |
The smallest conformant object: the seven mandatory members and a disclosure-uri. It carries no metric, so the evidence link is what the at-least-one rule requires. |
extended.example example |
One day, path target (Extended) target /app/storage source file |
object ?start=2026-03-20T00:00:00Z&end=2026-03-21T00:00:00Z&granularity=daily: array (1) |
2026-03-20 |
A whole calendar day for a path-scoped target, declaring extended capabilities: a request that names a parameter is answered with an array, here of one object, or with [] when the object does not satisfy it. |
partial.example example |
Partial reporting target partial.example source file |
object | 2026-03 |
Omission as the only not-reported mechanism. The source file omits carbon-unit; the served document carries the materialized default (gCO2e) — the pipeline resolving the draft's default-unit rule. |
origin-annual.example example |
Origin-wide annual report target example.com source file |
object | 2025 |
A calendar-year report for a whole origin, from cloud-billing data. |
signed.example example |
Signed declaration, internationalized origin target xn--grn-ioa.example source file |
object | 2025 |
The embedded signed member: an Ed25519 JWS over the object without signed, cty sustainability-data+json, public key in the header as jwk. It verifies, and proves only integrity: a key carried in the header is as self-asserted as the figures. It was signed with the public test key of RFC 8032, which protects nothing, so it verifies from its header and fails against any pinned key, as it should. The origin is an internationalized host, so target and every URI carry its A-label, while provider is UTF-8 text. |
organization.example example |
Organization report target Example Cloud Services, Inc. source file |
object | 2025 |
An organization-level annual report with GHG Protocol scopes and no energy figure. |
organization-trend.example example |
Yearly trend, Basic service target Example Annual Corp (example.org) source file |
array (4) | 2025 |
A multi-year trend file whose document declares capabilities:basic. The parameterless response is the array of every held year; a Basic subject ignores every parameter. |
comprehensive.example example |
Comprehensive organization report target Greenhost Data Centres Ltd source file |
object | 2025 |
Every optional member the format defines that fits an organization, and six https-keyed extensions for what it does not define: ISO/IEC 30134 facility KPIs, water, waste, hardware circularity, refrigerant and generator emissions, and renewable procurement. The extension names are under the example publisher's own reserved domain and their definitions are illustrative. |
removals.example example |
Negative scope (removals netted) target Upland Data Co-operative Ltd source file |
object | 2025 |
A scope member MAY be negative where the accounting method nets removals; carbon-footprint stays gross, so the scopes no longer sum to it and the methodology document explains why. Also shows an attestation link for the removals claim; the source file omits energy-unit, and the served document carries the materialized kWh. |
product.example example |
Product target Example Router Model RX-100 (GTIN 04012345678901) source file |
object | 2025 |
A physical product as the reporting subject (carbon footprint of one unit). |
service.example example |
Service target app.saas.example source file |
object | 2025 |
A hosted application service as the reporting subject. |
tenant.example example |
Cloud tenant target tenant-acme-01.cloud.example source file |
object | 2025 |
A single cloud tenant as the reporting subject. |
device.example example |
Hardware device target edge-node-014.edge.example source file |
object | 2025 |
A metered edge device as the reporting subject. |
data-source.example example |
Data source / feed target https://metrics.example/feeds/grid-sensor-network source file |
object | 2025 |
A published data feed as the reporting subject. |
upstream-organization.example example |
Organization with upstream providers target Nordwind Logistics GmbH source file |
object | 2025 |
The upstream member: an organization naming the tenant-scoped declaration of the cloud provider its figures partly derive from, with role:cloud. The URI is a reserved .example name, so the chain is illustrative — tenant-demo.example names a declaration this gateway really serves. |
upstream-tenant.example example |
Tenant-scoped upstream declaration target nordwind source file |
object ?start=2025-01-01T00:00:00Z&end=2026-01-01T00:00:00Z&granularity=yearly: array (1) |
2025 |
The other end of the same pair: what an upstream publishes about ONE customer — target-type:tenant and an identifier of the provider's choosing in target. It declares extended capabilities, so a request that names a parameter is answered with an array. |
upstream-multiple.example example |
Organization with several upstreams target Brightpath Software Ltd source file |
object | 2025 |
Three upstream entries, each compared on its own: cloud and cdn name tenant-scoped declarations about this customer, which a consumer can compare; electricity names the supplier's own totals, for which no comparison is defined. Reserved .example URIs, so the chain is illustrative. |
yearly.example example |
Monthly series (Extended) target example.com source file |
object (the file holds 12; the newest is served) ?start=2025-01-01T00:00:00Z&end=2026-01-01T00:00:00Z&granularity=monthly: array (12) |
2025-12 |
Twelve whole months of 2025; a request that names no parameter gets the latest month. ?start=2025-01-01T00:00:00Z&end=2026-01-01T00:00:00Z&granularity=monthly returns the twelve. |
yearly-monthly-target.example example |
Monthly series, path target (Extended) target /api/v1 source file |
object (the file holds 2; the newest is served) ?start=2026-01-01T00:00:00Z&end=2026-03-01T00:00:00Z&granularity=monthly: array (2) |
2026-02 |
A short monthly series for a path-scoped target; no parameter gets the latest month, ?granularity=monthly the months held. |
daily-trend.example example |
Daily series, device (Extended) target lora-gw-07.fieldnet.example source file |
object (the file holds 3; the newest is served) ?start=2026-03-29T00:00:00Z&end=2026-04-01T00:00:00Z&granularity=daily: array (3) |
2026-03-31 |
?start=2026-03-01T00:00:00Z&end=2026-04-01T00:00:00Z&granularity=daily returns every day held, here the three days since the device was commissioned; watt-hours and grams. The server returns what it holds and sums nothing: the three days are not March. |
two-targets.example example |
One array, two targets, a local accounting month target example.com source file |
array (2) ?start=2026-02-28T16:00:00Z&end=2026-03-31T16:00:00Z&granularity=monthly: array (2) |
2026-03-01T00:00:00+08:00/2026-04-01T00:00:00+08:00 |
An origin and a path of that origin, each for March 2026 in the +08:00 offset in which the operator keeps its accounts; both bounds carry the offset. ?target= selects one, and the two objects are ordered by the instant of their start, then end, then target. |
accounting-pair.example example |
Location-based and market-based target Retail Pair plc source file |
array (2) | 2025 |
Two objects for one organization and year that differ in carbon-accounting: the location-based and the market-based figure. A Basic subject serves both, and neither is the other's total. |
functional-units.example example |
Twelve functional units target api.functional-units.example source file |
array (12) | 2025 |
One service and year, twelve objects, one for each functional unit of the draft with its score. |
unit-grid.example example |
Twelve months in twelve unit pairs (Extended) target unit-grid.example source file |
object (the file holds 12; the newest is served) ?start=2025-01-01T00:00:00Z&end=2026-01-01T00:00:00Z&granularity=monthly: array (12) |
2025-12 |
Every month states the same energy and carbon in its own pair of units (Wh, kWh, MWh, GWh and gCO2e, kgCO2e, tCO2e), so a consumer converts before it adds. |
dst-month.example example |
A month across a change of clock target Paris DC 1 source file |
object | 2025-03-01T00:00:00+01:00/2025-04-01T00:00:00+02:00 |
March 2025 for a facility in Paris: the start is +01:00 and the end +02:00, so the period is 743 hours and still a whole calendar month. |
dst-days.example example |
A 23-hour and a 25-hour day (Extended) target Paris DC 1 source file |
object (the file holds 2; the newest is served) ?start=2025-03-29T23:00:00Z&end=2025-10-26T23:00:00Z&granularity=daily: array (2) |
2025-10-26T00:00:00+02:00/2025-10-27T00:00:00+01:00 |
The two days on which the clocks of Paris changed; each is a whole calendar day in its own offsets. |
local-days.example example |
Local accounting days (Extended) target Sensor 12 source file |
object (the file holds 3; the newest is served) ?start=2026-03-17T16:00:00Z&end=2026-03-20T16:00:00Z&granularity=daily: array (3) |
2026-03-20T00:00:00+08:00/2026-03-21T00:00:00+08:00 |
Three whole days kept in the +08:00 offset of the device's site; a range in UTC selects them by instant. |
mixed-offsets.example example |
Two offsets in one array (Extended) target /americas source file |
array (2) ?start=2026-03-01T00:00:00Z&end=2026-04-01T05:00:00Z&granularity=monthly: array (2) |
2026-03-01T00:00:00-05:00/2026-04-01T00:00:00-05:00 |
March 2026 twice: a path in -05:00, held first, and an origin in Z. The array is ordered by the instant of the start, which is the reverse of the order in the file. |
year-and-months.example example |
A year beside its months (Extended) target example.com source file |
array (13) ?start=2025-01-01T00:00:00Z&end=2026-01-01T00:00:00Z: array (13) |
2025-12 |
Calendar 2025 and its twelve months, held together. granularity=yearly selects the year, granularity=monthly the months; a server sums nothing, and adding all thirteen would count the year twice. |
target-types.example example |
Nine target types target types.example source file |
array (9) | 2025 |
One object for each of the nine kinds of target the draft lists, with the four measurement methods spread over them. |
upstream-roles.example example |
Upstream roles target Roles Org Ltd source file |
object | 2025 |
An organization with seven upstream entries: one for each of the six roles and one with no role. The URIs do not resolve. |
chain-org.example example |
Upstream chain, 1 of 5: organization target Chain Org Ltd source file |
object | 2025 |
The start of a chain of five declarations. The upstream is a relative reference, resolved against the URI this declaration was retrieved from; a walk of depth three stops before the fifth. |
chain-tenant.example example |
Upstream chain, 2 of 5: tenant target chain-org source file |
object | 2025 |
What the cloud provider states it delivered to the organization: 320 MWh, tenant-scoped. |
chain-host.example example |
Upstream chain, 3 of 5: hosting facility target Chain Hosting DC source file |
object | 2025 |
The facility that hosts the provider's servers; it names a colocation as its upstream. |
chain-colo.example example |
Upstream chain, 4 of 5: colocation target Chain Colo Hall 2 source file |
object | 2025 |
The colocation hall, which names the electricity supplier. |
chain-grid.example example |
Upstream chain, 5 of 5: electricity supplier target Chain Grid Utility source file |
object | 2025 |
The fifth declaration: reachable by its URL, and not by a walk from the organization, which stops at depth three. |
chain-inconsistent.example example |
Upstream figures that disagree target Chain Small Org source file |
object | 2025 |
An organization that states 100 MWh while the tenant declaration says 320 MWh were delivered to it. Two self-asserted claims that do not agree: something to look into, not a failure to conform. |
loop-a.example example |
Upstream loop, A target Loop Network A source file |
object | 2025 |
Names loop-b as its upstream. Each answers normally; only a walk stops. |
loop-b.example example |
Upstream loop, B target Loop Network B source file |
object | 2025 |
Names loop-a as its upstream: a walk refuses the second retrieval of loop-a. |
signed-array.example example |
Three signed months (Extended) target signed.example source file |
object (the file holds 3; the newest is served) ?start=2026-01-01T00:00:00Z&end=2026-04-01T00:00:00Z&granularity=monthly: array (3) |
2026-03 |
Three monthly objects, each with its own embedded signature, so a selection of them is still signed: the gateway serves the signed bytes and never signs a selection itself. Each verifies against the key in its own header (the public test key of RFC 8032). |
signed-es256.example example |
Signed with ES256 target signed-es256.example source file |
object | 2025 |
One object signed with ES256 (ECDSA P-256), the other algorithm a consumer verifies. |
This gateway's own report
At /.well-known/sustainability-data
(target sustainability-data-gateway). A model, not a measurement
(third-party-modeled): average power × hours live × a cited grid intensity. Power is
the average the operator entered for each month from the host's usage metrics, listed in the
report's provider field; a month without an entry is not reported. Every constant is in the
methodology.
- Queries (Extended service).
startandend= a UTC date-time such as2026-09-01T00:00:00Z(the range includesstartand excludesend; either may be left out);granularity=yearly,monthlyordaily(the whole years, months or days);target=sustainability-data-gateway. The answer is an array of the objects held that satisfy them, since go-live (2026-07-30T00:00:00Z): whole days of the most recent 120 days, every whole month and year, and the months at either end so far. No parameters: the last complete month, as one object. A date alone, such as2026-09-01, does not match the draft's grammar and is ignored: write2026-09-01T00:00:00Z. The consumer library andsustainability-fetch(0.8.2 and later) convert a date, month or year for you:--start=2026-09 --end=2026-09asks for September. - Nothing is repaired. A value that does not match, a parameter given twice and a name the draft
does not define are ignored, and the answer is the one for no parameter. A range that selects nothing, or a
targetthe gateway does not report, is200with an empty array.
curl -s "https://sustainability.up.railway.app/.well-known/sustainability-data?start=2026-07-01T00:00:00Z&end=2026-08-01T00:00:00Z"
curl -s "https://sustainability.up.railway.app/.well-known/sustainability-data?granularity=monthly"
curl -s "https://sustainability.up.railway.app/.well-known/sustainability-data?granularity=daily"
Integrity and attestation
- Signature. The report is signed in place: each object carries a
signedmember (Ed25519, key idDKH8kCbA0D1pjZv12xq8eGudqEHP2i0tq4h_RMYJxWo), a JWS over the same object without it (cty: sustainability-data+json); each object of a trend array carries its own. The public key is in the signature's header and athttps://andreibesleaga.com/keys/sustainability-gateway-signing-key.jwkto pin. It proves the signed copy is intact and comes from the same key as before — not who holds the key, and not that the figures are right. Precedent: RFC 8414signed_metadata. - Attestation.
https://andreibesleaga.com/attestations/sustainability-data-gateway-2026.vc.jwt(verifiable-attestation-uri): a W3C Verifiable Credential 2.0 (vc+jwt, five years) attesting the model: its constants and the months with entered power, by name. The credential is re-issued whenever a month is entered or a constant changes. Operator and issuer are the same person: it shows the mechanism, it is not independent assurance (how). - Not done, on purpose. No
upstream(the host publishes no declaration to name). Third-party declarations are never signed or attested here: the gateway can vouch for its own bytes, not for another organization's figures.
Consumer cross-validation
At start-up, every document served here is produced by the published publisher library and validated by the published consumer library — the same code a third party would run. A validation failure stops the gateway from starting.
Here: sustainability-wellknown-consumer@0.8.2,
131 documents (every
subject, this report and its Extended variants, and the trend arrays of the Extended examples).
HTTP behaviour
- Service level. Third-party declarations are Basic: query parameters are
ignored, never an error. Extended: this gateway's report, and the examples that declare
capabilities: "extended"(an array of the objects that satisfy the parameters, empty when none does). - Media type.
application/sustainability-data+json; errors (400,404,405,503)application/json; all withnosniff. A switch to the generic JSON type (SUSTAINABILITY_MEDIA_TYPE, service-wide or per subject) shows that a consumer MAY still process it; none is set here (guide). - Caching.
Cache-Control: public, max-age=86400for subjects,3600for this report and page; strongETagandLast-Modified,304on revalidation;Access-Control-Allow-Origin: *. - Methods.
GETandHEAD; anything else405withAllow: GET, HEAD. Unknown subject404. - Extensions. Data the format does not define goes in
extensions, keyed by a URI (RFC 3986): in practice anhttpsURI the definer controls, or aurn:uuidname (RFC 9562) for a definer without a domain. Compared as a string, never fetched, no registry; unknown ones are ignored; the set of top-level members stays closed. Names used here: methodology. 10 documents served here carry the member:comprehensive.example,device.example,extended.example,sfc-ledger-demo-2.example,sfc-ledger-demo.example,sfc-network-2.example,sfc-network.example,sfc-operator-2.example,sfc-operator.exampleandtenant-demo.example.
Every link below is a working GET (a few go off-site, to the documents a report
links to); the right column is the expected answer.
Headers, 304 and 405 need a client that shows them (next section).
| Request | Demonstrates | Expected |
|---|---|---|
/.well-known/sustainability-data |
the gateway's own report, parameterless | 200, one object: the latest whole month whose power was entered |
/.well-known/sustainability-data?start=2026-07-01T00:00:00Z&end=2026-08-01T00:00:00Z |
Extended: a range, the month of go-live | 200, an array: the objects held that overlap the range, ascending |
/.well-known/sustainability-data?granularity=monthly |
Extended: granularity alone | 200, an array: every whole month held |
/.well-known/sustainability-data?granularity=daily |
Extended: the days | 200, an array: the most recent whole days held |
/.well-known/sustainability-data?start=2025-01-01T00:00:00Z&end=2026-01-01T00:00:00Z&granularity=monthly |
Extended: a range before go-live | 200, [] — nothing is held before go-live |
/.well-known/sustainability-data?granularity=weekly |
Extended: an unknown granularity value | 200, the parameter is ignored: the parameterless answer |
/.well-known/sustainability-data?start=2026-08-01 |
Extended: a date without a time | 200, ignored, never read as another value: the parameterless answer |
/.well-known/sustainability-data?granularity=monthly&granularity=daily |
Extended: a parameter given twice | 200, ignored: the parameterless answer |
/.well-known/sustainability-data?target=/other |
Extended: a target the gateway does not report | 200, [] |
/.well-known/sustainability-data |
the same report, read for its `signed` member (Ed25519, embedded in the object) | 200; the declaration carries `signed`, a JWS over itself — there is no separate signature resource |
https://andreibesleaga.com/keys/sustainability-gateway-signing-key.jwk |
the signing public key, hosted out of band | 200, application/jwk+json |
https://andreibesleaga.com/attestations/sustainability-data-gateway-2026.vc.jwt |
the attestation credential the self report links to | 200, application/vc+jwt |
/automattic.com/.well-known/sustainability-data |
a curated subject declaration (automattic.com) | 200, application/sustainability-data+json |
/automattic.com/.well-known/sustainability-data?start=2026-01-01T00:00:00Z&granularity=monthly |
a Basic subject with query parameters | 200, the parameters are ignored |
https://sustainability.up.railway.app/cloud-demo.example/.well-known/sustainability-data |
the upstream chain: the declaration tenant-demo.example names as its cloud provider | 200, the tenant-scoped declaration this gateway serves for that upstream — what `--upstream` walks |
/carbontxt-demo.example/.well-known/sustainability-data |
an adapter demonstration (carbontxt-demo.example) | 200, mapped from its upstream |
/extended.example/.well-known/sustainability-data?start=2026-03-20T00:00:00Z&end=2026-03-21T00:00:00Z&granularity=daily |
a wire-format example declaring Extended (extended.example): its range | 200, a sorted array (1 objects) |
/extended.example/.well-known/sustainability-data?granularity=daily |
the same example, granularity alone | 200, a sorted array (1 objects) |
/nobody.example/.well-known/sustainability-data |
an unknown subject | 404 |
/index.json |
the machine-readable index | 200, application/json |
/healthz |
the health check | 200 |
Check a file
Type an origin that serves /.well-known/sustainability-data. The gateway fetches it once
with the published consumer library (at most once an hour per host, https only, public names
only, 64 KiB, 5 s) and says whether the bytes it got are a schema-valid declaration. That is all it
says: nothing about accuracy, no endorsement; no result is stored (the hosting provider's request log keeps the
request line for its retention period, as the legal notice says).
Badge for a README, computed from the same hourly check:

Deployments
Origins known to serve the format are listed, with their operator, in IMPLEMENTATIONS.md; a scheduled workflow fetches each one daily and checks the media type and the schema (results). Origins run by the operator of this gateway are marked as such; nobody is listed without consent. Copy-paste recipes for the most used servers, hosts and frameworks are in deploy/.
Verify it yourself
With the reference consumer
(sustainability-wellknown-consumer
0.8.0+). --strict runs the conformance battery: a failed MUST fails it,
an unmet SHOULD is reported. Signatures come back verified,
unsigned or unverified — never the data as "true"
(docs).
# this gateway's own report, full battery, plus its attestation
npx -y -p sustainability-wellknown-consumer sustainability-fetch https://sustainability.up.railway.app --strict --verify-attestation
# any subject, by its path prefix
npx -y -p sustainability-wellknown-consumer sustainability-fetch https://sustainability.up.railway.app/wikimedia.org --strict
# a trend array
npx -y -p sustainability-wellknown-consumer sustainability-fetch "https://sustainability.up.railway.app/yearly.example/.well-known/sustainability-data?start=2025-01-01T00:00:00Z&end=2026-01-01T00:00:00Z&granularity=monthly"
# the signature, and an upstream chain
npx -y -p sustainability-wellknown-consumer sustainability-fetch https://sustainability.up.railway.app --verify
npx -y -p sustainability-wellknown-consumer sustainability-fetch https://sustainability.up.railway.app/tenant-demo.example --upstream
# just read one
curl -s https://sustainability.up.railway.app/wikimedia.org/.well-known/sustainability-data | python3 -m json.tool
Without this project's tools: the JSON validates against the
JTD and CDDL schemas.
Machine-readable list: /index.json. More:
README,
guide,
methodology,
sources,
signing.
References
- draft-besleaga-sustainability-wellknown, the Internet-Draft.
- Repository; the publisher and consumer libraries on npm.
- Introductory article.
- RFC 8615, well-known URIs, and the IANA registry.
- RFC 9110, HTTP semantics.
- RFC 8927 (JTD) and RFC 8610 (CDDL), the schemas.
- RFC 7515, JWS (§7.1 compact form, §4.1.10
cty). - RFC 8414, the
signed_metadataprecedent. - RFC 3986, URIs, and RFC 9562, UUIDs (extension keys).
- VC Data Model 2.0 and VC-JOSE-COSE, the attestation.
- GHG Protocol, scopes and accounting bases.
- Software Carbon Intensity,
sci-score.