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.
application/json type is still served, and flagged as such.Subjects served (15)
| Endpoint | Reporting subject | Period | Method | Provenance |
|---|---|---|---|---|
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.
| Endpoint | Adapter | Upstream & attribution | Period |
|---|---|---|---|
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.
| Endpoint | Case | Shape | Demonstrates |
|---|---|---|---|
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.
- Media type. Successful responses use
application/sustainability-data+json, the type draft -07 requires, withX-Content-Type-Options: nosniff. Error responses (400,404,405,503) useapplication/json, also withnosniff. - Caching.
Cache-Control: public, max-age=86400for the relayed subjects andmax-age=3600for the gateway's own report and this page; a strongETagandLast-Modified;If-None-Matchanswers304. Responses carryAccess-Control-Allow-Origin: *. The signature is inside the body, so there is no second resource whose cache entry could drift out of step with the declaration's. - Methods.
GETandHEADonly; any other method answers405withAllow: GET, HEAD. An unknown subject answers404. - Generic media type. The service-wide default can be switched to the
generic
application/jsontype (not conformant publishing, but a type a consumer MAY still process) with theSUSTAINABILITY_MEDIA_TYPEvariable, and one subject can be pinned to it regardless of the default, to show such a subject next to conformant ones; this deployment pins none (operator guide). - Extensions. The top-level member set is closed, so data this specification
does not define travels inside the OPTIONAL
extensionsmember, an object whose keys are absolute URIs (RFC 3986, ASCII, scheme in lowercase, no fragment): either anhttpsURI under the definer's control, which should identify documentation of the extension, orurn:uuid:plus a lowercase hyphenated UUID (RFC 9562) for a definer without a domain. A key is an identifier compared as a string, never dereferenced, and there is no registry; a consumer that does not implement one ignores its value. The names this gateway uses are listed in its methodology document. Seven documents served here carry the member:tenant-demo.example,device.example,extended.example,microsoft.com,ovhcloud.com,sfc-network.exampleandsfc-operator.example.
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.
| Request | Demonstrates | Expected |
|---|---|---|
/.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
- draft-besleaga-sustainability-wellknown — the Internet-Draft this gateway implements (IETF Datatracker).
- The Digital Sustainability Data Protocol — the author's article introducing the idea and its motivation (an earlier name for this convention).
- Specification repository — draft sources, schemas, reference publisher and consumer, this gateway, and its documentation.
- sustainability-wellknown-publisher and sustainability-wellknown-consumer — the reference implementations on npm.
- RFC 8615 — Well-Known URIs, the registry the path belongs to (IANA registry).
- RFC 9110 — HTTP Semantics (methods, conditional requests, caching headers used here).
- RFC 8927 (JSON Type Definition) and RFC 8610 (CDDL) — the two schema languages the declaration is defined in.
- RFC 3986 — URI Generic Syntax; the keys of the
extensionsmember are absolute URIs, compared as strings and never dereferenced. - RFC 9562 — UUIDs; the lowercase, hyphenated text form an
extensionskey takes afterurn:uuid:, for a definer without a domain. - RFC 7515 — JSON Web Signature; §7.1 defines the Compact Serialization the
signedmember carries, and §4.1.10 thectythat types its payload. - RFC 8414 — OAuth 2.0 Authorization Server Metadata; its
signed_metadataparameter is the precedent for a signature embedded in the object it secures, whose payload takes precedence over the members around it where the verifier trusts the key independently of the declaration. - W3C Verifiable Credentials Data Model 2.0 and Securing Verifiable Credentials using JOSE and COSE — the shape of the attestation.
- GHG Protocol — the scope and accounting definitions the carbon members follow; Software Carbon Intensity — the
sci-scoremember.