---
title: "Create the memo for a year"
method: POST
path: "/net-zero/action-memos"
---

# Create the memo for a year

`POST /net-zero/action-memos`

Carries over every planned and in_progress action of the latest earlier memo, in order, re-estimated on the new memo's base year (carriedFromActionId and carriedFromYear are set; typed estimates are copied as they are). The earlier memo is not changed. 409 ACTION_MEMO_EXISTS when the workspace already has a memo for the year; 400 VALIDATION_ERROR for a year outside 2000-2100. Requires org.edit_dashboard.

## Request body

- NetZeroActionMemoCreate
  - `year` integer, required

## Response `201`

The new memo

- NetZeroActionMemoResponse
  - `data` NetZeroActionMemo, required
    - `actions` 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
    - `carryOverSkipped` integer — Only in the response to creating a memo: how many planned or in-progress actions of the earlier memo stayed there because their site is outside the workspace. Left out when none. They are not carried again later.
    - `createdAt` string, date-time, required
    - `createdBy` string, required
    - `id` string, uuid, required
    - `reviews` NetZeroActionReview[], required — Newest first, at most 20.
      - `changes` NetZeroActionReviewChange[], required
        - `actionId` string, uuid, required
        - `fromStatus` 'planned' | 'in_progress' | 'done' | 'dropped', required
        - `progressNote` string, required
        - `title` string, required — The action's title when the review was recorded.
        - `toStatus` 'planned' | 'in_progress' | 'done' | 'dropped', required
      - `id` string, uuid, required
      - `notes` string, required
      - `period` 'Q1' | 'Q2' | 'Q3' | 'Q4' | 'annual', required
      - `reviewedAt` string, date-time, required
      - `reviewedBy` string, required
      - `reviewedByName` string — The reviewer's display name (else their name) as Greentally knows them; left out when it has neither. Never an email address.
    - `summary` NetZeroActionMemoSummary, required
      - `baseYear` integer, required
      - `baseYearComplete` boolean, required
      - `byStatus` NetZeroActionStatusCounts, required
        - `done` integer, required
        - `dropped` integer, required
        - `in_progress` integer, required
        - `planned` integer, required
      - `combined` NetZeroActionCombined, required — Combined savings of the actions that are not dropped, overlaps removed and each scope capped at the base year's total.
        - `capped` boolean, required — A scope's saving was held at its base-year total.
        - `scope1KgCo2e` number, double, required
        - `scope2KgCo2e` number, double, required
        - `scope3KgCo2e` number, double, required
        - `totalKgCo2e` number, double, required
      - `gaps` NetZeroActionGap[], required — One per near-term target of the active target set, from its stored figures.
        - `baseKgCo2e` number, double, required — The memo base year's emissions in the target's boundary (not the SBTi baseline's).
        - `boundary` 's1' | 's2' | 's1s2' | 's3', required
        - `coveragePct` number, double, required
        - `coveredKgCo2e` number, double, required — Combined savings of the memo's actions in the boundary (not dropped; overlaps counted once).
        - `gapKgCo2e` number, double, required — baseKgCo2e − targetKgCo2e, floored at 0.
        - `horizon` 'near_term', required — The target's horizon; only near-term targets have a gap.
        - `over` boolean, required — The savings exceed the gap.
        - `targetKgCo2e` number, double, required — The target's allowed emissions in its target year.
        - `targetYear` integer, required — The year the target's allowed emissions apply to.
      - `gapsUnavailable` boolean, required — The active target set could not be read, so gaps is empty although the workspace may have targets.
      - `lastReview` NetZeroActionReview
        - `changes` NetZeroActionReviewChange[], required
          - `actionId` string, uuid, required
          - `fromStatus` 'planned' | 'in_progress' | 'done' | 'dropped', required
          - `progressNote` string, required
          - `title` string, required — The action's title when the review was recorded.
          - `toStatus` 'planned' | 'in_progress' | 'done' | 'dropped', required
        - `id` string, uuid, required
        - `notes` string, required
        - `period` 'Q1' | 'Q2' | 'Q3' | 'Q4' | 'annual', required
        - `reviewedAt` string, date-time, required
        - `reviewedBy` string, required
        - `reviewedByName` string — The reviewer's display name (else their name) as Greentally knows them; left out when it has neither. Never an email address.
    - `year` integer, required

## Other responses

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

## Changes

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

[Change history](https://skmtc.dev/greentally/apis/esgai-api/changes/net-zero/action-memos/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)
