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.
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 key | g CO₂/kWh | kg CO₂/kWh | Source | Source date |
|---|---|---|---|---|
global_average | 432 | 0.432 | Ember Global Electricity Review 2025 | 2025-05-01 |
us_avg | 373 | 0.373 | EIA eGRID 2024 summary | 2025-02-01 |
eu_avg | 231 | 0.231 | EEA 2023 final | 2024-06-01 |
uk | 207 | 0.207 | DEFRA GHG Conversion Factors 2024 | 2024-06-01 |
fr | 56 | 0.056 | EEA 2023 | 2024-06-01 |
de | 338 | 0.338 | EEA 2023 | 2024-06-01 |
in | 632 | 0.632 | CEA / Ember 2024 | 2024-12-01 |
ie | 296 | 0.296 | SEAI 2024 | 2025-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_estimated | Region-aware estimate for this request, in kg CO₂e. |
|---|---|
kg_co2_removed | Equal to the estimate in the current contract. |
removal_project_id | TAO-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.