GHG Impact Report

This page covers the GHG impact report for an assessment — the calculated emissions/removals result produced by Cool Farm Tool (CFT), available as JSON or as a downloadable PDF. See RegenScope3 API for the base URL, authentication, and response envelope, and Completeness and Submission for how an assessment gets submitted for calculation in the first place — that submission step is what this report depends on.

Once an assessment has been submitted and Cool Farm Tool has produced a completed calculation, this endpoint makes a real, live call to the Cool Farm Tool API and returns the genuine calculated result. It only falls back to a fixed, all-zero template in the one specific case where the assessment hasn't been submitted for calculation yet — and that case is always labeled with an explanatory message, never presented as a real result.

Endpoints

MethodPathPurpose
GETassessments/ASSESSMENT_ID/impact-report/Retrieve the impact report as JSON
GETassessments/ASSESSMENT_ID/impact-report/pdf/Retrieve the same report as a downloadable PDF

Required permission: assessment.view for both endpoints.

Response shape (JSON, once calculated)

{
  "status": "success",
  "data": {
    "summary": { "balance", "emissions", "removals", "unit" },
    "category": { "chart": {...}, "table": [...] },
    "co_product": { "chart": [...], "table": [...] },
    "flag_category": { "chart": {...}, "table": [...] }
  }
}
FieldNotes
summaryHeadline totals — emissions, removals, their net balance, and the unit (tCO2e).
categoryEmissions broken down by Cool Farm model/category, as both a chart series and a detail table.
co_productEmissions allocated across co-products, as both a chart series and a detail table.
flag_categoryEmissions broken down by Cool Farm "flag category," as both a chart series and a detail table.

Three distinct states, with different status codes/shapes

StateJSON endpointPDF endpoint
Not yet submitted for calculation200, with an all-zero summary/category/co_product/flag_category template and "message": "Assessment has not been submitted for calculation."400
Submitted, but Cool Farm hasn't produced a result yet404, {"message": "GHG report has not been generated."}404
Calculated200, real Cool Farm Tool data200, binary application/pdf with a Content-Disposition: attachment header

Watch for the zero-value response looking like "real zero emissions." The "not yet submitted" state returns 200 with every numeric field at 0 — always check the accompanying message field before treating a report as genuine; a message present means the numbers aren't real yet, not that the assessment truly has zero emissions.

The JSON and PDF endpoints disagree on status code for the "not yet submitted" case (200 vs 400) — this asymmetry is a known quirk of the current implementation, not something you should build defensive logic to normalize away. Just handle both codes as "not ready yet" for their respective endpoint.

A 500 can also occur on either endpoint from an unhandled internal error — for example a Cool Farm API timeout or a malformed upstream response. Treat a 500 here as transient/retryable, not a definitive failure.

Examples

JSON — not yet submitted

curl "https://backend.spacenus.de/api/v1.2/regen-scope-3/assessments/ASSESSMENT_ID/impact-report/" \
  -H "Authorization: Bearer YOUR_TOKEN"

Response (200):

{
  "status": "success",
  "message": "Assessment has not been submitted for calculation.",
  "data": {
    "summary": { "balance": 0, "emissions": 0, "removals": 0, "unit": "" },
    "category": {
      "chart": { "labels": [], "values": [] },
      "table": [
        {
          "category": "",
          "co2_kg": 0,
          "n2o_kg": 0,
          "ch4_kg": 0,
          "total_co2e_kg": 0,
          "emissions_per_ha": 0,
          "emissions_per_t": 0,
          "notes": null
        }
      ]
    },
    "co_product": {
      "chart": [{ "name": "", "value": 0, "color": "" }],
      "table": [
        {
          "category": "",
          "co2_kg": 0,
          "n2o_kg": 0,
          "ch4_kg": 0,
          "co2e_unspecified_kg": 0,
          "total_co2e_kg": 0,
          "emissions_per_ha": 0,
          "emissions_per_t": 0
        }
      ]
    },
    "flag_category": {
      "chart": { "labels": [], "values": [] },
      "table": [
        {
          "flag_category": "",
          "co2_kg": 0,
          "co2e_unspecified_kg": 0,
          "ch4_kg": 0,
          "n2o_kg": 0,
          "total_co2e_kg": 0
        }
      ]
    }
  }
}

JSON — calculated

curl "https://backend.spacenus.de/api/v1.2/regen-scope-3/assessments/ASSESSMENT_ID/impact-report/" \
  -H "Authorization: Bearer YOUR_TOKEN"

Response (200):

{
  "status": "success",
  "data": {
    "summary": { "balance": 12.4, "emissions": 18.9, "removals": 6.5, "unit": "tCO2e" },
    "category": {
      "chart": { "labels": ["Fertiliser", "Soil Carbon", "Machinery"], "values": [9.1, -3.2, 4.6] },
      "table": [
        {
          "category": "Fertiliser",
          "co2_kg": 120.0,
          "n2o_kg": 3.4,
          "ch4_kg": 0.0,
          "total_co2e_kg": 9100.0,
          "emissions_per_ha": 21.5,
          "emissions_per_t": 3.1,
          "notes": null
        }
      ]
    },
    "co_product": {
      "chart": [{ "name": "Grain", "value": 18.9, "color": "#4CAF50" }],
      "table": [
        {
          "category": "Grain",
          "co2_kg": 18900.0,
          "n2o_kg": 0.0,
          "ch4_kg": 0.0,
          "co2e_unspecified_kg": 0.0,
          "total_co2e_kg": 18900.0,
          "emissions_per_ha": 21.5,
          "emissions_per_t": 3.1
        }
      ]
    },
    "flag_category": {
      "chart": { "labels": ["On-farm energy"], "values": [4.6] },
      "table": [
        {
          "flag_category": "On-farm energy",
          "co2_kg": 4600.0,
          "co2e_unspecified_kg": 0.0,
          "ch4_kg": 0.0,
          "n2o_kg": 0.0,
          "total_co2e_kg": 4600.0
        }
      ]
    }
  }
}

PDF

curl "https://backend.spacenus.de/api/v1.2/regen-scope-3/assessments/ASSESSMENT_ID/impact-report/pdf/" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -o impact-report.pdf

On success (200) the response body is a binary PDF, with:

Content-Type: application/pdf
Content-Disposition: attachment; filename="impact-report-assessment-ASSESSMENT_ID.pdf"

If the assessment hasn't been submitted yet, the PDF endpoint returns 400 (not 200, unlike the JSON endpoint) with a JSON error body:

{
  "status": "error",
  "message": "Assessment has not been submitted for calculation."
}