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
| Method | Path | Purpose |
|---|---|---|
| GET | assessments/ASSESSMENT_ID/impact-report/ | Retrieve the impact report as JSON |
| GET | assessments/ASSESSMENT_ID/impact-report/pdf/ | Retrieve the same report as a downloadable PDF |
Required permission:
assessment.viewfor 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": [...] }
}
}
| Field | Notes |
|---|---|
summary | Headline totals — emissions, removals, their net balance, and the unit (tCO2e). |
category | Emissions broken down by Cool Farm model/category, as both a chart series and a detail table. |
co_product | Emissions allocated across co-products, as both a chart series and a detail table. |
flag_category | Emissions broken down by Cool Farm "flag category," as both a chart series and a detail table. |
Three distinct states, with different status codes/shapes
| State | JSON endpoint | PDF endpoint |
|---|---|---|
| Not yet submitted for calculation | 200, 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 yet | 404, {"message": "GHG report has not been generated."} | 404 |
| Calculated | 200, real Cool Farm Tool data | 200, 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
200with every numeric field at0— always check the accompanyingmessagefield 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 (
200vs400) — 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
500can also occur on either endpoint from an unhandled internal error — for example a Cool Farm API timeout or a malformed upstream response. Treat a500here 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.pdfOn 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."
}