Skip to Content

Managing and Editing PCFs

⚠️
Subscription plan required
This is a paid feature. Please see our pricing page for more details.

Now you’ve estimated your first PCF, but in most cases you’re probably want to perform more estimations than just one.

This can be because:

  1. You have several products to manage PCFs for
  2. You are iterating and improving on an existing PCF for the same product.

Climatiq lets you manage both of these cases. To understand how, we first need to look at the two different kinds of IDs a PCF has: It has a product_id and a version_id. A version_id refers to the concrete PCF you just calculated, whereas the product_id represents a product. One product might have multiple versions of a PCF attached to it, e.g. when the manufacturing process changes, or when you have collected more data.

When creating a new PCF, it is automatically assigned both a random product_id and a version_id. You can get a list of all of your products, along with the latest version_id by using the list products endpoint.

curl --request GET \ --url https://preview.api.climatiq.io/pcf/v1-preview2 \ --header 'Authorization: Bearer $CLIMATIQ_API_KEY'

The endpoint might return something like this:

[ { "product_id": "cb4499a0-fbc8-4139-b80f-1fec7b598e4c", "version_id": "cb4499a0-fbc8-4139-b80f-1fec7b598e4c", "created_at": "2026-03-03T07:50:26.384538Z", "product": "croissant", "cradle_to_gate_co2e": 10.434617534144051, "use_phase_co2e": null, "end_of_life_co2e": 0.001130971405008422 }, { "product_id": "08148b80-f5c1-4352-af78-ecd4babe0972", "version_id": "08148b80-f5c1-4352-af78-ecd4babe0972", "created_at": "2026-02-25T09:15:44.908037Z", "product": "Hammer", "cradle_to_gate_co2e": 15.895248404685063, "use_phase_co2e": null, "end_of_life_co2e": 0.7121026049999999 } ]

Now, let’s dive into how versions work.

Creating a new version of a PCF

A PCF is immutable, meaning it cannot be changed after it has been created. This is to ensure you have a clear audit trail of any changes made.

However, there are many cases where you’ll want to update a PCF, e.g:

  • When performing an initial PCF, and then adjusting it.
  • As your manufacturing process changes, and you need to update what components go into your product
  • As your manufacturing process becomes more efficient, you might use less electricity per product.

To make these changes, you create a new version of a PCF. When creating a PCF initially, the API will return a random version_id and a product_id. To create a new version for an existing product, you perform a new PCF estimate, and supply an existing product_id in the request. The new estimate, will then be saved as the latest version of that product.

The below example call to the PCF estimate endpoint will result in a new version for the product ID existing_product_id

{ "product": "Hammer", "location": "Frankfurt", "product_id": "existing_product_id" // ...rest of PCF }

A few things to keep in mind:

  • The API response for a PCF is not guaranteed to hold all the information you sent. If you want to update a PCF, you should save the requests you send on your side.
  • While different versions are meant to represent the same underlying product, this is not something that Climatiq validates.
  • You cannot roll back to a previous version, you can only roll-forward by creating a new version, that matches an older version.

Managing PCFs

As you go along, you will probably have many products, and PCF versions for each product. Climatiq gives you some tools to help manage this:

Listing Products

You can list all products using the List Products Endpoint.

curl --request GET \ --url https://preview.api.climatiq.io/pcf/v1-preview2 \ --header 'Authorization: Bearer $CLIMATIQ_API_KEY'

This will return all products along with the latest version, and a short breakdown of each boundary for that latest version.

[ { "product_id": "cb4499a0-fbc8-4139-b80f-1fec7b598e4c", "version_id": "cb4499a0-fbc8-4139-b80f-1fec7b598e4c", "created_at": "2026-03-03T07:50:26.384538Z", "product": "croissant", "cradle_to_gate_co2e": 10.434617534144051, "use_phase_co2e": null, "end_of_life_co2e": 0.001130971405008422 }, { "product_id": "08148b80-f5c1-4352-af78-ecd4babe0972", "version_id": "08148b80-f5c1-4352-af78-ecd4babe0972", "created_at": "2026-02-25T09:15:44.908037Z", "product": "Hammer", "cradle_to_gate_co2e": 15.895248404685063, "use_phase_co2e": null, "end_of_life_co2e": 0.7121026049999999 } ]

Listing Versions For a Product

You can list all versions for a given product ID by using the List Versions endpoint.

curl --request GET \ --url https://preview.api.climatiq.io/pcf/v1-preview2/product/{product_id}/versions \ --header 'Authorization: Bearer $CLIMATIQ_API_KEY'

This will return all versions for that product ID, with the newest revision first.

[ { "product_id": "aa594624-f3b2-463e-aeca-9209ad496afc", "version_id": "444013d1-26e8-4dd8-bc6f-41e2adae6463", "created_at": "2026-02-20T10:53:46.007717Z", "product": "Hammer", "cradle_to_gate_co2e": 2926.502093351476, "use_phase_co2e": null, "end_of_life_co2e": 0.022046226218487758 }, { "product_id": "aa594624-f3b2-463e-aeca-9209ad496afc", "version_id": "0b04c99c-5c7a-4480-8dc3-cd29b422dc28", "created_at": "2026-03-01T08:15:34.008812Z", "product": "Hammer", "cradle_to_gate_co2e": 2425.735492740162, "use_phase_co2e": null, "end_of_life_co2e": 0.022046226218487758 } ]

Viewing Previously Calculated PCF

If you want to view the previously calculated PCF, you can use the Get Estimation endpoint.

curl --request GET \ --url https://preview.api.climatiq.io/pcf/v1-preview2/{version_id} \ --header 'Authorization: Bearer $CLIMATIQ_API_KEY'

This will return a specific version of a PCF, with the same schema as if you had just estimated it yourself.

Ensuring Consistency Across Versions

If you resubmit a PCF with the same information, Climatiq might change the emission factors matched for simple components, due to either:

  • The underlying machine learning matching being improved, resulting in a better match.
  • The emission factor database being expanded, meaning there is now an emission factor that matches better.

If you want the emission factors to not be changed in a revision, you must specify them via the emission_factor parameter on each simple component.

As an example, if a simple component returns the following;

{ "type": "simple", "product": "iron", "production": { "estimate": { "co2e": 2.34, "co2e_unit": "kg", "emission_factor": { "name": "Steel", "activity_id": "metals-type_steel", "id": "d29c593d-2adb-4e4e-a458-b76f48d3f1c2" } }, "data_quality": { "scaled": { "technological_representativeness_data_quality_rating": 11.7, "geographical_representativeness_data_quality_rating": 11.7, "temporal_representativeness_data_quality_rating": 11.7 }, "normalized": { "technological_representativeness_data_quality_rating": 5.0, "geographical_representativeness_data_quality_rating": 5.0, "temporal_representativeness_data_quality_rating": 5.0 } } // some fields omitted }

And when creating a new version of a PCF, you want to make sure the same emission factor is picked, you can lock the picked factor like this:

{ "type": "simple", "product": "iron", "emission_factor": { "id": "d29c593d-2adb-4e4e-a458-b76f48d3f1c2" } }

The emission_factor field makes sure that the same emission factor is selected as before.


When an emission_factor is explicitly specified, Climatiq changes the technological_representativeness_data_quality_rating, as we assume that this emission factor was picked by a human, and not automated mapping.

If you’re simply specifying the emission_factor to avoid changes, you should also specify the technological_representativeness_data_quality_rating to be the same as the one you got originally.

In which case your component would look like this:

{ "type": "simple", "product": "iron", "emission_factor": { "id": "d29c593d-2adb-4e4e-a458-b76f48d3f1c2" }, "production_data_quality": { "technological_representativeness_data_quality_rating": 5 } }
⚠️

For normalized values the API currently returns a float between 1 and 5, but only accepts an integer between 1 and 5. We recommend rounding the float you get back to the nearest integer.

This will be fixed in a future version of the API.

When you’re ready to dive further into PCFs you can:

Last updated on