Measurement Methodology · 2026.1

How one inference becomes carbon measured

This page documents the exact per-query carbon contract emitted by GET /api/v1/inference/attest: the operational-energy boundary, regional grid attribution, verified CDR assignment, and receipt proof that lets another system round-trip the result.

A versioned operational-energy estimate

METHODOLOGY_VERSION is 2026.1. The endpoint emits a versioned, operational-energy, market-based Scope 2 estimate for a request an external AI provider ran. It is a reproducible disclosure number, not a live meter reading from the provider's GPU or data centre.

Version2026.1
BoundaryScope 2
Unitkg CO₂e

The endpoint surface is the API Docs; the proof surface is /verify; and the verified removals being calculated against are shown in the CDR portfolio.

Declared energy boundary and grid factors

The declared boundary is 0.3 kWh × PUE 1.6 ≈ 0.48 kWh: an inference-workload energy estimate with power usage effectiveness applied. The global market-based grid baseline in public/data/grid-intensity.json is 0.432 kg CO₂/kWh, or 432 g CO₂/kWh, sourced from Ember Global Electricity Review 2025.

declared workload energy   0.3 kWh × PUE 1.6 ≈ 0.48 kWh
global grid baseline       0.432 kg CO₂/kWh = 432 g CO₂/kWh
authoritative live baseline CO2_PER_QUERY_KG = 0.0007 kg

Implementation note. CO2_PER_QUERY_KG = 0.0007 is the authoritative per-query baseline used by the live endpoint. The literal 0.48 × 0.432 multiplication is not claimed to evaluate to 0.0007; this page documents the constants as implemented and does not reconcile them in a separate calculation change.

Region lookup is exact and lower-case. A recognized row supplies the grid intensity used to scale the total; the selected row's source label is returned separately as grid_intensity_source. The current human-readable methodology.basis string ends with the literal (Ember 2025), while the source table below preserves each row's own source and date.

Lookup keyg CO₂/kWhkg CO₂/kWhSourceSource date
global_average4320.432Ember Global Electricity Review 20252025-05-01
us_avg3730.373EIA eGRID 2024 summary2025-02-01
eu_avg2310.231EEA 2023 final2024-06-01
uk2070.207DEFRA GHG Conversion Factors 20242024-06-01
fr560.056EEA 20232024-06-01
de3380.338EEA 20232024-06-01
in6320.632CEA / Ember 20242024-12-01
ie2960.296SEAI 20242025-01-01

From request inputs to the emitted number

The route recognizes gpt-4-class. Any other non-empty model string falls through to the same current default baseline, 0.0007 kg; missing model, region, or tokens is a 400. Region matching uses the exact lower-case keys above. An unknown region uses the global baseline for both the coefficient and the displayed intensity.

base = MODEL_KG_PER_QUERY[model] || CO2_PER_QUERY_KG
if grid[region] exists:
  perQueryKg = base × (grid[region].kgPerKWh / 0.432)
else:
  perQueryKg = base
kg_co2e_estimated = tokens × perQueryKg
kg_co2_removed    = kg_co2e_estimated

tokens must parse as a finite, non-negative number. The implementation floors it and then caps it at 1e12: tokens = Math.min(Math.floor(parsedTokens), 1e12).

Baseline versus total. The response's methodology.per_query_kg_co2e field is always the baseline 0.0007. The kg_co2e_estimated total uses the region-scaled coefficient above. Those are intentionally distinct fields; the response does not relabel the scaled total as the baseline.

Worked example: region=eu_avg

For model=gpt-4-class, region=eu_avg, and tokens=10000, the selected row is 0.231 kg/kWh and the global denominator is 0.432 kg/kWh.

perQueryKg = 0.0007 × (0.231 / 0.432)
            = 0.00037430555555555557 kg/query
kg_co2e_estimated = 10000 × perQueryKg
                  = 3.743055555555556 kg
kg_co2_removed    = 3.743055555555556 kg

The response also returns grid_intensity_g_per_kwh: 231 and grid_intensity_source: "EEA 2023 final". Its current basis string uses grid 0.231 kg/kWh (Ember 2025) because that suffix is literal in the route.

The removed amount follows the measured amount

The current attestation contract assigns kg_co2_removed = kg_co2e_estimated. It names TAO-UKR-HEMP-MRV-2026 in removal_project_id, connecting the request to the verified CDR project and inventory surface at /portfolio.

kg_co2e_estimatedRegion-aware estimate for this request, in kg CO₂e.
kg_co2_removedEqual to the estimate in the current contract.
removal_project_idTAO-UKR-HEMP-MRV-2026, the named project backing the attestation.

This page documents the fields emitted by the attestation route. The portfolio page remains the source for the verified project list and live GET /api/co2-removals?status=verified inventory; no new removal query runs here.

A deterministic hash with a public round-trip

Before the response is persisted, the route builds a disclosureCore containing the request values, calculated amounts, issue timestamp, and methodology version. canonicalize recursively sorts object keys and emits JSON without whitespace. The receipt hash is then h_ plus the SHA-256 digest of that canonical string.

disclosureCore = {
  model,
  region,
  tokens,
  kg_co2e_estimated,
  kg_co2_removed,
  issued_at,
  methodology_version
}
receipt.hash = "h_" + SHA256(canonicalize(disclosureCore))

The response's receipt carries hash, the chain marker hashbon:taoclimate:v1, and an absolute receipt.verifyUrl. When the database is available, the payload is stored in ai_receipt_certificates with source inference-attest and a server created_at timestamp; the response may also include receipt.attached_at.

Opening the verify URL in a browser renders the existing /verify proof surface. Its client requests /verify/:hash with Accept: application/json, receives the stored payload and certificate envelope, and renders the same fields for inspection. The endpoint surface and response shape remain documented in /docs.

Current Hashbon boundary. hashbon:taoclimate:v1 is the receipt and chain contract represented by this app. The current implementation is an anchor-agnostic hash and database round-trip; it does not promise an external on-chain Hashbon anchor. The migration explicitly leaves actual chain anchoring for a later plug-in.

The proof still points back to the named CDR project and verified inventory at /portfolio, so the measurement, attribution, and verification surfaces can be reviewed together.