Framework answers page
Produced by POST /api/v2/bulk/framework-answers/search; the task reports "requestType": "BulkGetFrameworkAnswers". One file per page of companies, each a complete document — see Result files for how pages are delivered and the conventions they share. The framework answers workflow walks through a job end to end.
Datapoint and custom-property descriptions are declared once at the top of the page and referenced by id from every company; answers are grouped into reporting periods rather than repeating their period on each row.
Top level
| Field | Type | Notes |
|---|---|---|
dataPoints | DataPoint[] | Every datapoint that carries an answer anywhere in the page. |
customProperties | CustomProperty[] | Names for the requested properties your profile owns. Drawn from that list rather than from the values, so it is identical on every page and can name a property no company in the export holds a value for; every key in this page's companies[].fields still resolves here. A requested id your profile does not own is silently left out rather than rejected. Absent when the request asked for no custom properties. |
companies | Company[] | The page's companies. |
DataPoint
| Field | Type | Notes |
|---|---|---|
id | uuid | What answers[].dataPointId points to. |
questionId | uuid | The question this datapoint belongs to; several datapoints can share one. |
inFrameworks | uuid[] | The requested frameworks whose data produced this entry. Answers for it appear only under framework entries listed here. When merging frameworks that share a datapoint, use it to count such an answer once. |
listOptions | ListOption[] | The options of a list datapoint: { id, title }. A list answer carries option ids only; the titles live here. Absent for other datapoint types. |
CustomProperty
| Field | Type | Notes |
|---|---|---|
id | uuid | What a key in companies[].fields resolves against. |
name | string |
Company
| Field | Type | Notes |
|---|---|---|
id | uuid | The company id the rest of the API uses. |
name | string | |
fields | object | Keyed by custom-property id, each value a string[] of that property's values for the company. Holds only the ids the request listed in customPropertyIds; absent when none apply. |
frameworks | Framework[] | One entry per framework and reporting-period start. |
Framework
One company's assignment to a framework for a reporting period.
| Field | Type | Notes |
|---|---|---|
frameworkId | uuid | |
startYear | integer | The reporting period's start year — what the request's period.years selects on. |
startMonth | month name | "January" … "December". A yearly period covers twelve months from here; "April" with startYear: 2026 is April 2026 through March 2027. |
isComplete | boolean | Whether the company finished the framework for this period. |
progress | Progress | The question counts behind isComplete. |
periods | Period[] | The answers, bucketed by reporting period. |
hiddenQuestionIds | uuid[] | Questions the framework's visibility rules hide for this company — its other answers make them inapplicable. Absent when nothing is hidden. |
omittedQuestionIds | uuid[] | Questions the company declared it will not answer for this period. Absent when nothing is omitted. |
periods carries no answer under a hidden or omitted question. The two lists are disjoint: a question that is both hidden and omitted is listed as hidden only.
Progress
| Field | Type | Notes |
|---|---|---|
totalQuestions | integer | |
totalRequiredQuestions | integer | |
addressedQuestions | integer | |
addressedRequiredQuestions | integer | |
scoreCategories | FrameworkScoreCategory[] | { id, name, attainedScore, attainableScore } per scoring category. Only on frameworks that score; absent otherwise. |
Period
| Field | Type | Notes |
|---|---|---|
periodType | "Yearly" or "Monthly" | |
year | integer | |
month | month name | Present on monthly periods only. |
answers | AnswerEntry[] |
A single framework entry can carry a yearly period and several monthly ones side by side. Neither is derived from the other — a consumer that reads only one kind is reading a subset of the data. A search whose period.reportingPeriodTypes is ["Yearly"] receives yearly buckets only, including the yearly totals BeCause computes for companies that reported monthly figures without entering a yearly one.
AnswerEntry
| Field | Type | Notes |
|---|---|---|
dataPointId | uuid | Resolves in the page's dataPoints. |
answer | AnswerValue | |
unitId | uuid | The unit a numeric answer is expressed in; resolve through GET /api/v1/unit-types. Absent when the datapoint has no unit. |
scoreCategories | AnswerScoreCategory[] | { id, name, attainedScore } — what this answer contributed per scoring category. Only on scored frameworks. |
AnswerValue
Exactly one key is present; the others are absent.
| Key | Type | Notes |
|---|---|---|
text | string | |
number | decimal | |
boolean | boolean | |
dateIso | string | ISO 8601 calendar date. |
dateRangeFromDateIso / dateRangeToDateIso | string | A date range; both keys present together. |
list | uuid[] | Option ids, resolved in the datapoint's listOptions. |
tuple | Tuple | A table answer: { rows: [ { columns: [ TupleCell, … ] }, … ] }. Each TupleCell carries exactly one of text, number, boolean, dateIso, dateRangeFromDateIso / dateRangeToDateIso or list. |
fileUrl | string | The URL of an uploaded file. |
Example
{
"dataPoints": [
{
"id": "f12ed4cd-9a3b-4e7c-8d21-5b6a7c8d9e01",
"questionId": "2cc6d60c-1f4a-4b8e-9c3d-7e8f9a0b1c02",
"inFrameworks": [
"8f21b3c6-4e5d-4a2b-9c7e-1b3a5d7f0001",
"8f21b3c6-4e5d-4a2b-9c7e-1b3a5d7f0002"
]
},
{
"id": "7294d68d-3c5e-4f9a-b1d2-8e9f0a1b2c03",
"questionId": "9a41c7be-6d2f-4a8b-9e0c-1d2e3f4a5b04",
"inFrameworks": ["8f21b3c6-4e5d-4a2b-9c7e-1b3a5d7f0002"]
},
{
"id": "5069e92e-8b1c-4d6e-a3f4-9c0d1e2f3a05",
"questionId": "d1f82a55-4e7b-4c9d-8a1e-2f3a4b5c6d06",
"inFrameworks": ["8f21b3c6-4e5d-4a2b-9c7e-1b3a5d7f0002"],
"listOptions": [
{ "id": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c07", "title": "Solar" },
{ "id": "e5f6a7b8-9c0d-4e1f-a2b3-4c5d6e7f8a08", "title": "Wind" }
]
}
],
"customProperties": [
{ "id": "0992e704-5c3b-4b6e-8a1d-7f2e9c4b6d18", "name": "Property code" }
],
"companies": [
{
"id": "9c56d3a1-8b0f-4c7a-9e2d-5b1a7f3e0c11",
"name": "Hotel Aurora",
"fields": {
"0992e704-5c3b-4b6e-8a1d-7f2e9c4b6d18": ["HA-2041"]
},
"frameworks": [
{
"frameworkId": "8f21b3c6-4e5d-4a2b-9c7e-1b3a5d7f0002",
"startYear": 2025,
"startMonth": "January",
"isComplete": false,
"progress": {
"totalQuestions": 39,
"totalRequiredQuestions": 30,
"addressedQuestions": 24,
"addressedRequiredQuestions": 21
},
"periods": [
{
"periodType": "Yearly",
"year": 2025,
"answers": [
{
"dataPointId": "f12ed4cd-9a3b-4e7c-8d21-5b6a7c8d9e01",
"answer": { "boolean": true }
},
{
"dataPointId": "5069e92e-8b1c-4d6e-a3f4-9c0d1e2f3a05",
"answer": { "list": ["a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c07"] }
}
]
},
{
"periodType": "Monthly",
"year": 2025,
"month": "March",
"answers": [
{
"dataPointId": "7294d68d-3c5e-4f9a-b1d2-8e9f0a1b2c03",
"answer": { "number": 3120 },
"unitId": "b1c9e0a4-2d3e-4f5a-8b6c-7d8e9f0a1b12"
}
]
}
],
"omittedQuestionIds": ["3e8b5f2a-7c1d-4e9f-a0b1-2c3d4e5f6a13"]
}
]
}
]
}