Changelog

Numbers checked against the live data on

What changed in the data model, in the served view open_ef.factors_flat, in the libraries and in these docs, newest first. Each month lists one entry per change. Where a column gains a successor, the entry names it and says what to read instead. How we change things is the standing policy behind that list: what gets an entry, and what notice you get before something you query moves.

How we change things#

This page is the record of a change, and for the served view it is the only one. There is no factor search version number to pin to: a release is a publisher's own edition label, so DESNZ at 2026 and ADEME at 23.6 advance on their own schedules, and neither moves when the shared model or the served view changes shape.

What gets an entry#

surface what is recorded what moves it
The served view open_ef.factors_flat Every column added or superseded, and every change to a closed code list A rebuild of the view
The data model New tables, fields and vocabularies, and rules that were tightened A migration
The libraries A library added, and mapping or classification work inside one An ingest
These docs A new page, or a reorganisation of the ones that exist A docs release

The numbers are deliberately not listed change by change. A new edition moves values under the same addresses, with no notice before the switch: What a refresh changes for you is the policy, a library's own Changelog section is where an edition is written up, and source_key is how you detect the move (Pin a factor value to a release).

The four kinds of change#

kind what it does to a query that works today what to do
Addition Nothing. A new column, a new code, a new table or library Nothing, except handle codes you have not seen: a closed list can gain a member
New edition The number moves, the address does not Compare source_key against the one you stored
Supersession Nothing. A column gains a clearer successor beside it, and the one you query keeps its name and its meaning Move to the successor when it suits you: the entry names it
Retired code The code stops being written. A filter on it matches nothing Take the surviving codes from the view itself, not from a literal you wrote last year

A column you query does not disappear under you, so the loud failure, column ... does not exist, is not the one to plan for. A retired code is the one that can cost you a number. WHERE system_boundary = 'well_to_wheel' does not error once that code is retired; it matches nothing, and an aggregate over nothing returns no total rather than a wrong one, which reads like a zero. September's boundary merges retired codes that way. So check that a code filter matched anything before you trust what it adds up to, and take the surviving codes from the view itself (SELECT DISTINCT system_boundary) or from System boundaries, not from a literal you wrote last year.

Slugs do not cover you here, and it is worth being exact about why. A slug is frozen when it is minted, so a renamed code leaves the old word standing inside it: the DESNZ diesel total still reads well_to_wheel in its slug while its system_boundary says well_to_use (Identifiers and stability). Nothing in the slug moved, so nothing needed an alias. emission_factor_alias answers the other question, a factor that was merged or re-keyed (A published slug always resolves).

The notice you get#

  • Identifiers are promised, not merely recorded. A published slug always resolves, and a source_key never changes. Store those rather than a column list or a row's position.
  • Every entry from now on carries the date it landed and says where you meet the change: in the view, in factor search, in an export, or only in these docs. The launch list carries no dates because it is not a running log: it is the state of the model written in one batch on 17 September 2026, and every change in it landed on or before that day.
  • This page is the record. A library's Versions and Changelog sections carry the same news for one edition, in more detail than an entry here has room for.

Where this sits against the guarantees#

Schema evolution is additive covers the names as well as the meanings. A column you query keeps its name, and it keeps meaning what it meant: a genuine change of meaning arrives as a new column beside the old one, and so does a better name. The old column stays served, unchanged, and an entry here says what supersedes it and from when. That is the whole of the word "deprecated" on this page.

The renames in the launch list are from before the site opened, and they are the shape this promise rules out from now on: September renamed the year-window pair on the served view, renamed the quality columns on the value record, of which two are served, and dropped the publisher's validity pair from it.

If you wrote queries against the view before then, check their names against the view as served. information_schema.columns, for table_schema = 'open_ef' and table_name = 'factors_flat', is that list. Today it holds applies_from_year; it holds neither start_year, the name that pair carried before September, nor publisher_valid_from, which is read from the value record instead (The publisher's validity window).

September 2026#

22 September#

  • Docs. The site is cut by the reader's job rather than by whether they write SQL: five sections, and a badge that marks the pages asking you to write SQL, HTTP or code, so a page with no badge needs none. URLs move with it: /docs/developers/ becomes /docs/guides/quickstart/. New pages cover the standardisation story, editions, reporting, geography and waste routes. Nothing in the data or on factors_flat changed.

21 September#

  • Docs. /factors/open-data/ gets a page, covering the credit dialog every download goes through and when there is no download at all. Facts that move, such as the search allowance and factor search's default columns, each get one owning page and are linked from the rest rather than restated.

At launch, 17 September#

The state of the shared model, the served view and the libraries on the day the site opened, written in one batch rather than logged as it happened.

  • Docs. The docs site opens on 17 September, with a track for using factors, a track for building on the data, and shared methodology pages and a glossary.
  • Licences. Every licence code now answers five questions: using the data for your own footprint, publishing results, sharing it with customers, embedding it in a product, and modifying or combining it. Each answer is yes, yes if, ask, unclear or no. See Licences.
  • Libraries. Each library is described as a generalist or a specialist, from how its factors spread across categories, and the checks run on its data are recorded so a library page can show them.
  • Units. Every unit code has a display name that can be translated.
  • Years. You can filter on several accounting years at once. A factor is kept if any chosen year is inside its window, and shows the value for the latest one. See Applicable years.
  • EPDs. is_epd marks factors that come from an Environmental Product Declaration, and has_supplier marks factors that name a supplier. A generic dataset no longer names a supplier.
  • Decomposition. Every row names the top of its tree in root_slug.
  • Boundaries. EN 15804 declarations get a whole-declaration boundary, epd_total, and module D (benefits beyond the system boundary) is reported beside the declaration with parent_relation reported_beside_parent, never summed into it. The EN 15804 boundaries also state what the standard excludes.
  • Boundaries. well_to_use now covers both a fuel's full cycle and delivered energy such as grid electricity, where they were two boundaries before. The two full life-cycle energy boundaries merge into energy_lifecycle.
  • Boundaries. Each boundary states which life-cycle phases it covers.
  • Publishers. Every publisher declares a short name, a home region, a kind and tags.
  • Licences. license_url and license_notice are served beside attribution_text, which now holds only the credit line to reproduce.
  • Vocabularies. license_tier and data_type accept only their listed values. data_type has three: specific, average and generic.
  • Data quality. The tier for a rated value is read from the cut-offs stored with each rating scheme. A zero from a green electricity contract is no longer marked down for being zero. See Data quality.
  • Boundaries. Electricity transmission and distribution losses get their own upstream boundary, transmission_distribution_upstream.
  • Waste. Where a publisher gives several treatment routes for one waste stream, one is elected the default for "route unknown", served as is_route_default.
  • Years. The window columns are now applies_from_year and applies_to_year. The publisher's own validity dates are no longer on the served view; read them from the value record. See The publisher's validity window.
  • Units. Gas volumes are stored in litres, with the publisher's reference conditions.
  • Regions. region_is_publisher_default says when a region was filled in from the library's default rather than stated on the row.
  • Data quality. The quality columns are named for whose quality they are: data_quality_rating_native and data_quality_scheme_native for the publisher's, data_quality_normalized and data_quality_reason_normalized for ours. The API's quality filter and field use the same name.
  • Spend factors. A spend factor is re-priced to each accounting year in its own currency, rather than in its economy's. See Currency year.
  • Years. A physical value carries its whole window of accounting years on one row, with open ends, instead of one row per year; a spend value keeps one row per year. The newest row is flagged is_latest_activity_year.
  • GWP. Every value and every gas leg carries a normalised version on AR6 GWP100. A value with no exact conversion keeps the publisher's number there and is labelled unconverted in gwp_normalization_basis. See GWP values.
  • Categories. The served view carries our category axis, category and sub_category, one column per gas leg, and is_top_parent for counting without double counting.
  • Spend factors. Monetary factors are deflated to each accounting year from price indices of their economy.
  • Boundaries. The EN 15804 modules are grouped as life-cycle stages of an asset, and cradle_to_grave_embodied covers the embodied whole life: modules A1 to A5 and C1 to C4, without the use phase.
  • ADEME. A fuel printed on two energy bases is one factor, not two. Avoided-emission credits get their own boundary, avoided_credit. Factors are no longer given a data quality rating ADEME did not score.
  • AGRIBALYSE. Stage-by-stage slices are filed under the total they widen.
  • DESNZ. Transmission and distribution losses are added into a delivered-electricity total. Sea freight is recorded as global, not as a UK factor.
  • ÖKOBAUDAT. Each declaration gets a full tree with cradle-to-grave and whole-declaration totals and module D beside them. A process dataset carries the boundary it prices.
  • Data type. Values a supplier discloses, or that represent a group, are typed average rather than specific.

August 2026#

  • Years and methods. The served view carries every year and every method of a factor. The default row is flagged with is_default_indicator and the latest year with a flag, rather than everything else being filtered out.
  • Identifiers. source_key is served, so a value can be traced to its source line. See Trace a served value.
  • MITECO. The default method of a factor is no longer used to pick its year.
  • Decomposition. is_derived marks a total assembled from parts the publisher printed separately. See Glossary: derived total.
  • Validity. The publisher's own validity window is exposed.
  • DESNZ. Each factor records the edition it came from.
  • Decomposition. parent_relation is closed to sums_to_parent and contained_by_parent.
  • AGRIBALYSE. Every stage boundary above the farm gate states that land-use change is inside it, as the farm gate does.
  • Boundaries. EN 15804 modules A1, A2 and A3 add up exactly to cradle-to-gate.
  • Categories. One category axis, the same for every library, classifies every factor. See Glossary: category.
  • Classifications. The BEA 2017 commodity code becomes a standard classification on both USEEIO and Open CEDA, so the two libraries can be joined on it.
  • Licences. license_tier and license_code are served on every row. See Licences.

July 2026#

  • GWP. Each value gets an AR6 version beside the one the publisher printed.
  • Suppliers. A supplier registry names the counterparty behind supplier-specific electricity (MITECO) and EPDs (ÖKOBAUDAT). A supplier is a description of the factor, never part of its identifier.
  • Fit. Four additions help you judge whether a factor fits: its classification in the publisher's and standard trees with native codes, the publisher's descriptive text, what its boundary includes, and what a publisher's quality rating means.
  • Serving. One default value per factor, a typed price basis and currency year for spend factors, and change tracking on every value.
  • Identity. A factor's identity is anchored in its source. Improving a region, unit or boundary mapping never changes a factor's identifier. See Identifiers and stability.
  • Ingest. Every library loads through the same framework, one adapter per library.