---
title: "Re-snapshot an action's base and re-estimate it"
method: POST
path: "/net-zero/actions/{id}/recalculate"
---

# Re-snapshot an action's base and re-estimate it

`POST /net-zero/actions/{id}/recalculate`

Takes the base's figure on the memo's current base year and works the estimate out again (0 when the base no longer exists). A typed estimate has no base: 400 VALIDATION_ERROR. 404 ACTION_NOT_FOUND. Requires org.edit_dashboard.

## Path parameters

- `id` string, uuid, required

## Response `200`

The recalculated action

- NetZeroActionResponse
  - `data` NetZeroAction, required
    - `baseChanged` boolean, required — The current base differs from the snapshot by more than 1% or 0.1 tCO2e, or the memo's base year has moved since.
    - `baseId` string — The base the estimate was worked out on (NetZeroActionBase.id); left out for a typed estimate.
    - `baseKgCo2e` number, double — The base's figure when the estimate was worked out (the snapshot).
    - `baseKind` 'resource' | 'scope3_category' | 'refrigerant' | 'scope'
    - `baseRef` NetZeroActionBaseRef — Narrows a base kind to one slice; fields that do not apply to the kind are left out.
      - `category` integer — Scope 3 category.
      - `resource` string
      - `scope` integer
      - `siteId` string — Site external id.
      - `usage` string
    - `baseYear` integer — The year of the snapshot.
    - `carriedFromActionId` string, uuid
    - `carriedFromYear` integer
    - `catalogueKey` string
    - `catalogueVersion` integer
    - `createdAt` string, date-time, required
    - `currentBaseKgCo2e` number, double — The base's figure on the memo's base year today (0 when the base no longer exists); left out for a typed estimate.
    - `description` string, required
    - `dueQuarter` integer — Left out when none.
    - `estimateKgCo2e` number, double, required
    - `estimateKind` 'catalogue' | 'tally' | 'typed', required
    - `id` string, uuid, required
    - `owner` string, required — Free text; empty when none.
    - `position` integer, required
    - `progressNote` string, required
    - `rationale` string, required
    - `reductionPct` number, double — Above 0 and at most 100; left out for a typed estimate.
    - `scope` integer, required
    - `scope3Category` integer
    - `siteId` string — The action's site external id, when it has one.
    - `siteName` string — The action's site, when it has one.
    - `source` 'catalogue' | 'tally' | 'manual', required
    - `status` 'planned' | 'in_progress' | 'done' | 'dropped', required
    - `title` string, required
    - `updatedAt` string, date-time, required

## Other responses

- `400` — Bad Request
- `401` — Unauthorized
- `403` — Forbidden
- `404` — Not Found
- `409` — Conflict

## Changes

- **2026-10-04** `77d466d0e73d` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/greentally/apis/esgai-api/changes/net-zero/actions/:id/recalculate/post.md)

---

[API](https://skmtc.dev/greentally/apis/esgai-api.md) · [All operations](https://skmtc.dev/greentally/apis/esgai-api/llms.txt) · [OpenAPI document](https://skmtc.dev/greentally/apis/esgai-api/revisions/77d466d0e73d?raw)
