Sustainability Data Reference Gateway

A reference deployment of /.well-known/sustainability-data (draft-besleaga-sustainability-wellknown).

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. The declarations about third parties are ILLUSTRATIVE MAPPINGS, prepared by the gateway operator from those organizations' own published reports. They are NOT published, reviewed, authorized or endorsed by their reporting subjects, and this gateway is not an authoritative source for them. Every figure is read from, or is the stated sum of figures read from, the public source document named in the declaration's methodology-uri member; nothing is estimated or apportioned on a subject's behalf. Subjects with a reserved .example name are synthetic and describe nothing real.

How this gateway produces a conformant document Heterogeneous source data passes through adapters, unit and period normalization, and schema validation, and is served over HTTPS at /.well-known/sustainability-data with the media type application/sustainability-data+json. Sources files, APIs, exporters Adapters per-source mapping Normalize units, period, reporting subject Validate CDDL and JTD schemas Serve HTTPS, ETag, conditional GET GET /.well-known/sustainability-data 200 → Content-Type: application/sustainability-data+json · X-Content-Type-Options: nosniff
Every declaration below is produced by this path. The media type and the HTTPS requirement are those of draft revision -07; a deployment kept on the generic application/json type is still served, and flagged as such.

Subjects served (15)

EndpointReporting subjectPeriodMethodProvenance
akamai.com sourced Akamai Technologies, Inc. (organization) 2025 hardware-estimated source document
automattic.com sourced Automattic Inc. (data centre operations) (organization) 2020 hardware-estimated source document
cloud-demo.example synthetic t-7f3a9c41 (tenant) 2025 cloud-billing source document
cloudflare.com sourced Cloudflare, Inc. (organization) 2024 hardware-estimated source document
fastly.com sourced Fastly, Inc. (organization) 2024 hardware-estimated source document
hetzner.com sourced Hetzner Online GmbH (organization) 2024 hardware-estimated source document
microsoft.com sourced Microsoft Corporation (organization) 2025 hardware-estimated source document
mozilla.org sourced Mozilla Foundation and Mozilla Corporation (organization) 2025 hardware-estimated source document
ovhcloud.com sourced OVH Groupe SA (OVHcloud) (organization) 2025 hardware-estimated source document
retailer.example synthetic retailer.example (organization) 2025 third-party-modeled source document
saas-platform.example synthetic saas-platform.example (service) 2025 hardware-metered source document
sfc-network.example synthetic sfc-network.example (service) 2025 third-party-modeled source document
sfc-operator.example synthetic sfc-operator.example (origin) 2025 hardware-metered source document
tenant-demo.example synthetic Tenant Demo Ltd (organization) 2025 third-party-modeled source document
wikimedia.org sourced Wikimedia Foundation (organization) 2024 hardware-estimated source document

Adapter demonstrations (8)

One subject per upstream-backed adapter of the published sustainability-wellknown-publisher package, 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.

EndpointAdapterUpstream & attributionPeriod
carbontxt-demo.example live carbontxt-api (LIVE GWF validator API, daily) GWF carbon.txt validator API (free key) / recorded carbon.txt
carbon.txt self-published by its organization; validator by GWF
2025
climatiq-demo.example live climatiq (LIVE under operator key) Climatiq estimate API (replay by default; see terms note)
replay default: Climatiq 2026 terms restrict redistribution
2026-08
co2js-demo.example live co2js (local SWD model, live Greencheck, daily) CO2.js locally (Ember data) + GWF Greencheck
CO2.js Apache-2.0; Ember CC BY 4.0; GWF Green Domains ODbL
2026-08
grid-intensity-demo.example live computed (LIVE NESO grid intensity, daily) NESO Carbon Intensity API (api.carbonintensity.org.uk)
NESO Carbon Intensity API, CC BY 4.0
2026-08
kepler-demo.example replay kepler-prometheus (recorded fixture, replay mode) 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) 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) Salesforce Net Zero Cloud (30-day trial orgs exist; replay here)
synthetic figures; field names per NZC developer guide
2025
watershed-demo.example replay watershed (documented footprint shape, replay) Watershed API (customer-only keys, no sandbox; replay)
synthetic figures; shape per api-docs.watershed.com
2025

Wire-format examples (22)

Every case of the specification's canonical example-responses set, served live. Trend cases follow the draft's rule: the parameterless request answers the most recent entry, and the sorted array is returned only for a period sliced by a finer granularity, on documents that declare capabilities:extended. All figures are synthetic; the subjects are reserved .example names.

EndpointCaseShapeDemonstrates
basic.example example Basic response object An origin-wide monthly report in the Basic shape, with explicit units.
minimal.example example Minimal document object 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 Daily report, path target object A daily reporting period for a path-scoped target with extended capabilities declared.
partial.example example Partial reporting object 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 object A calendar-year report for a whole origin, from cloud-billing data.
signed.example example Signed declaration, internationalized origin object The embedded signed member: an EdDSA 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. 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 object An organization-level annual report with GHG Protocol scopes and no energy figure.
organization-trend.example example Yearly trend, Basic service array (4) A multi-year trend file whose document declares capabilities:basic — the Basic response therefore collapses to the most recent year, exactly as the draft requires.
comprehensive.example example Comprehensive organization report object 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) object 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 a free-text measurement-method, an omitted energy-unit (kWh applies) and an attestation link for the removals claim.
product.example example Product object A physical product as the reporting subject (per-unit footprint).
service.example example Service object A hosted application service as the reporting subject.
tenant.example example Cloud tenant object A single cloud tenant as the reporting subject.
device.example example Hardware device object A metered edge device as the reporting subject.
data-source.example example Data source / feed object A published data feed as the reporting subject.
upstream-organization.example example Organization with upstream providers object The -07 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 object 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.
upstream-multiple.example example Organization with several upstreams object 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) array (12) ?period=2025&granularity=monthly Twelve monthly entries; Basic collapses to the latest month, ?granularity=monthly returns the sorted year.
yearly-monthly-target.example example Monthly series, path target (Extended) array (2) ?period=2026&granularity=monthly A short monthly series for a path-scoped target; Basic collapses, ?granularity=monthly returns the array.
daily-trend.example example Daily series, device (Extended) array (3) ?period=2026-03&granularity=daily ?period=2026-03&granularity=daily returns every day held, here the three days since the device was commissioned; watt-hours and grams. A request for the whole month without granularity is 404: three days do not cover March, so no honest aggregate exists.
aggregate.example example Aggregate of a monthly series object What yearly.example answers to ?period=2025 when it holds only months: energy and carbon summed, capabilities extended, renewable-energy omitted because a percentage is not summed, carbon-accounting kept because every month agrees.

This gateway's own report

The gateway also reports on itself, as a service, at /.well-known/sustainability-data (target: sustainability-data-gateway). The figures are a model, not a measurement: a constant container power draw, times the hours the gateway has been live, times a cited grid intensity. The document says so (measurement-method: third-party-modeled) and every constant is in the methodology it links.

This one document offers the draft's Extended service. Any period since go-live (2026-07-30T00:00:00Z) can be requested with period (YYYY, YYYY-MM or YYYY-MM-DD) and sliced with granularity (monthly or daily). A period before go-live returns 404; a period in progress reports the completed part so far; a parameter given twice, or a period that is not a real calendar date, returns 400; a target returns 404, because one process has no path prefixes and the published prefix set is therefore empty. Without parameters the answer is the most recently completed month.

curl -s "https://sustainability.up.railway.app/.well-known/sustainability-data?period=2026-07"
curl -s "https://sustainability.up.railway.app/.well-known/sustainability-data?period=2026&granularity=monthly"
curl -s "https://sustainability.up.railway.app/.well-known/sustainability-data?period=2026-07&granularity=daily"

Integrity and attestation

Signature. The gateway's own declaration is signed in place: each object carries a signed member (EdDSA, key id DKH8kCbA0D1pjZv12xq8eGudqEHP2i0tq4h_RMYJxWo), a JWS Compact Serialization (RFC 7515 §7.1, cty: sustainability-data+json) whose payload is that same object without signed. There is no separate signature resource: the signature travels inside the body, so a cache that serves a re-encoded copy cannot separate the two, and each object of an Extended trend array carries its own. The public key is in the signature's header and also published at https://andreibesleaga.com/keys/sustainability-gateway-signing-key.jwk, so a verifier can pin it. A signature proves that the object you hold is the object this key signed, and that successive declarations came from the same key. It does not prove who holds the key, and says nothing about whether the figures are accurate: a correctly signed estimate is still an estimate. The precedent for carrying a signature as a member of the object it secures is the signed_metadata parameter of RFC 8414.

Attestation. The self document links, through verifiable-attestation-uri, to https://andreibesleaga.com/attestations/sustainability-data-gateway-2026.vc.jwt: a W3C Verifiable Credential (Data Model 2.0) secured as vc+jwt, valid five years, in which the issuer attests the model behind the report — its constants and formula — so every month's document is covered without re-issuing. This is the draft's only mechanism that speaks to authenticity. The operator of this gateway and the issuer of that credential are the same person. The credential demonstrates the mechanism — a second key, a second identity, a statement verifiable against a published key — and is not independent assurance of the figures (how signing and attestation are deployed).

The gateway's own declaration carries no upstream member: the hosting platform publishes no declaration of its own, so naming one would be false.

The third-party declarations are deliberately not signed or attested: this gateway can vouch for its own bytes, never for another organization's figures, and a signed member on a relayed declaration would suggest otherwise. The reference consumer reports a signature as verified, unsigned or unverified — never the data as "true" or "false":

npx -y -p sustainability-wellknown-consumer sustainability-fetch https://sustainability.up.railway.app --strict --verify-attestation
npx -y -p sustainability-wellknown-consumer sustainability-fetch https://sustainability.up.railway.app --verify --verify-attestation

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. This deployment: sustainability-wellknown-consumer@0.7.0 validated 49 documents at start-up (every subject listed above, the gateway's own report, and the Extended variants it checks).

Service level

The third-party declarations offer the Basic service: this gateway supports none of the query parameters for them, so it ignores them and returns the Basic response, never an error. Two exceptions: the gateway's own report is Extended (above), and the wire-format examples that declare capabilities: "extended" honour period and granularity, answering a sorted trend array only for a granularity finer than the period, as the draft defines.

Check any of this with a click. Each link is a working GET on this deployment (or on the operator's site, for a hosted key or credential); the right-hand column is the expected response. Headers, conditional requests and the 405 case need a client that shows them — the commands in the next section do.

RequestDemonstratesExpected
/.well-known/sustainability-data the gateway's own report, parameterless 200, the most recently completed month
/.well-known/sustainability-data?period=2026-07 Extended: one month since go-live 200, that month's figures
/.well-known/sustainability-data?period=2026&granularity=monthly Extended: a year sliced monthly 200, a sorted array, one entry per month
/.well-known/sustainability-data?period=2026-07&granularity=daily Extended: a month sliced daily 200, a sorted array, one entry per day
/.well-known/sustainability-data?period=2025 Extended: a period before go-live 404, the draft's no-data rule
/.well-known/sustainability-data?period=2026&granularity=weekly Extended: an unknown granularity value 200, the parameter is ignored
/.well-known/sustainability-data?period=2026&period=2025 Extended: a parameter given twice 400, the request is ambiguous
/.well-known/sustainability-data?target=/other Extended: the target parameter 404 — one process has no path prefixes, so the published set is empty; byte for byte the no-data 404 above
/.well-known/sustainability-data the same report, read for its `signed` member (EdDSA, 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 third-party attestation the self document links to 200, application/vc+jwt
/akamai.com/.well-known/sustainability-data a curated subject declaration (akamai.com) 200, application/sustainability-data+json
/akamai.com/.well-known/sustainability-data?period=2026 a Basic subject with a query parameter 200, the parameter is 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
/yearly.example/.well-known/sustainability-data?period=2025&granularity=monthly a wire-format example declaring Extended (yearly.example): a period sliced finer 200, its sorted trend array (12 entries)
/yearly.example/.well-known/sustainability-data?granularity=monthly the same example, granularity alone 200, one object — not finer than the default period
/nobody.example/.well-known/sustainability-data an unknown subject 404
/index.json the machine-readable index 200, application/json
/healthz the health check 200

Verify these declarations yourself

Every declaration here can be fetched and validated with the specification's reference consumer (sustainability-wellknown-consumer, 0.7.0 or later — the revision that implements -07). --strict runs the conformance battery — schema, media type, caching, conditional requests, methods, the optional embedded signature — and labels each check with the strength of the requirement: a failed MUST is a conformance failure; an unmet SHOULD, or the generic media type, is reported but does not fail the battery (consumer documentation).

The gateway's own report, at this origin's true well-known location:

npx -y -p sustainability-wellknown-consumer sustainability-fetch https://sustainability.up.railway.app --strict

Any subject — curated, adapter demonstration or wire-format example — by its path-prefixed base URL; the consumer resolves the well-known path under the prefix:

npx -y -p sustainability-wellknown-consumer sustainability-fetch https://sustainability.up.railway.app/cloudflare.com --strict
npx -y -p sustainability-wellknown-consumer sustainability-fetch https://sustainability.up.railway.app/grid-intensity-demo.example --strict
npx -y -p sustainability-wellknown-consumer sustainability-fetch https://sustainability.up.railway.app/yearly.example --strict
npx -y -p sustainability-wellknown-consumer sustainability-fetch https://sustainability.up.railway.app/<any-domain-above> --strict

An Extended trend array, by the full declaration URL with a period and a finer granularity:

npx -y -p sustainability-wellknown-consumer sustainability-fetch "https://sustainability.up.railway.app/yearly.example/.well-known/sustainability-data?period=2025&granularity=monthly"

The embedded signature, the upstream chain and the attestation, on the declarations that carry them:

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

To just fetch and read a declaration (or pipe it into your own tooling):

curl -s https://sustainability.up.railway.app/wikimedia.org/.well-known/sustainability-data | python3 -m json.tool

Independently of this project's tooling, the JSON validates against the specification's JTD and CDDL schemas.

Machine-readable index and documentation

/index.json carries the same list, notices included. Full detail: the gateway README, operator guide, methodology and provenance rules, per-subject sources, signing and attestation, and the Internet-Draft.

References