Reports API
Base path for all endpoints below:
Reports are nested under a project. A report has pages; each page has sections (layout tiles). Sections may include reportSectionContents (text or linked resources) and reportSectionSensors (linked sensors).
Endpoints
Reports
| Method | Path | Description |
|---|---|---|
GET |
/reports |
List all reports in the project |
GET |
/reports/{id} |
Get a single report (pages, sections, recipients) |
POST |
/reports |
Create a report |
PUT |
/reports/{id} |
Update report settings and recipients |
DELETE |
/reports/{id} |
Delete a report |
Report pages
| Method | Path | Description |
|---|---|---|
GET |
/report-pages/{id} |
Get a page and its sections |
POST |
/report-pages |
Create a page |
PUT |
/report-pages/{id} |
Update page order |
DELETE |
/report-pages/{id} |
Delete a page |
Report sections
| Method | Path | Description |
|---|---|---|
GET |
/report-sections/{id} |
Get a section |
POST |
/report-sections |
Create a section |
PUT |
/report-sections/{id} |
Update section layout / type |
DELETE |
/report-sections/{id} |
Delete a section |
Report section contents
| Method | Path | Description |
|---|---|---|
GET |
/report-section-contents/{id} |
Get a content row |
POST |
/report-section-contents |
Create a content row |
PUT |
/report-section-contents/{id} |
Update a content row (e.g. TextBox HTML) |
DELETE |
/report-section-contents/{id} |
Delete a content row |
Report section sensors
| Method | Path | Description |
|---|---|---|
GET |
/report-section-sensors/{id} |
Get a sensor link |
POST |
/report-section-sensors |
Link a sensor to a section |
PUT |
/report-section-sensors/{id} |
Update a sensor link |
DELETE |
/report-section-sensors/{id} |
Remove a sensor link |
Resource shapes
Report
{
"id": 5,
"name": "Weekly Report",
"period": "7 Days",
"periodStartTime": "",
"customPeriodDays": null,
"scheduled": true,
"startDay": "Friday",
"startTime": "11:01",
"frequency": "Weekly",
"header": true,
"footer": true,
"projectId": 22,
"reportPages": [],
"recipients": [],
"createdAt": "2023-12-18T01:27:13.366651Z",
"updatedAt": "2026-04-14T07:09:13.437005Z"
}
| Field | Type | Notes |
|---|---|---|
id |
number | |
name |
string | |
period |
string | null | Reporting period label (e.g. "7 Days") |
periodStartTime |
string | |
customPeriodDays |
number | null | |
scheduled |
boolean | |
startDay |
string | null | e.g. "Friday" |
startTime |
string | null | e.g. "11:01" |
frequency |
string | null | e.g. "Weekly" |
header |
boolean | null | |
footer |
boolean | null | |
projectId |
number | |
reportPages |
ReportPage[] | Nested pages and sections |
recipients |
User[] | Users who receive the report |
createdAt |
string | ISO 8601 |
updatedAt |
string | ISO 8601 |
Report page
{
"id": 13,
"reportId": 5,
"order": 1,
"reportSections": [],
"createdAt": "2023-12-18T01:31:07.064586Z",
"updatedAt": "2026-07-30T00:52:23.919426Z"
}
Report section
{
"id": 1857,
"x": 0,
"y": 9,
"w": 12,
"h": 7,
"content": "",
"contentType": "TextBox",
"reportSectionContents": [],
"reportSectionSensors": [],
"reportPageId": 13,
"createdAt": "2025-02-20T06:23:04.66634Z",
"updatedAt": "2026-05-28T04:42:16.891698Z"
}
x / y are grid position; w / h are grid size.
contentType values:
CoverPageTextBoxChartXYChartWindRoseChartCustomChartReadingsTableAlarmTableLocationLocationSatelliteMapImageSensorImageImageSensorField
Report section content
{
"id": 2051,
"content": "<p>Commentary for this reporting period.</p>",
"contentId": 0,
"reportSectionId": 1857,
"createdAt": "2025-02-20T06:23:04.667686Z",
"updatedAt": "2026-05-28T04:42:16.997865Z"
}
| Field | Notes |
|---|---|
content |
For TextBox, an HTML string. For other types, often unused or secondary. |
contentId |
For TextBox, typically 0. For charts/dashboards, the linked resource id. |
Report section sensor
{
"id": 4575,
"sensorId": 103,
"reportSectionId": 3203,
"createdAt": "2025-10-27T11:06:49.437482Z",
"updatedAt": "2025-10-27T11:06:49.437482Z"
}
Example: list reports
GET /api/v1/org/7/proj/22/reports
Returns an array of reports. Each report includes schedule settings, recipients, and nested reportPages → reportSections → reportSectionContents/reportSectionSensors.
[
{
"id": 5,
"name": "Weekly Report",
"period": "7 Days",
"periodStartTime": "",
"customPeriodDays": null,
"scheduled": true,
"startDay": "Friday",
"startTime": "11:01",
"frequency": "Weekly",
"header": true,
"footer": true,
"projectId": 22,
"reportPages": [
{
"id": 14,
"reportId": 5,
"order": 0,
"reportSections": [
{
"id": 21,
"x": 0,
"y": 0,
"w": 12,
"h": 16,
"content": "",
"contentType": "CoverPage",
"reportSectionContents": [],
"reportSectionSensors": [],
"reportPageId": 14,
"createdAt": "2023-12-18T01:31:07.07955Z",
"updatedAt": "2026-05-28T04:42:16.891077Z"
}
],
"createdAt": "2023-12-18T01:31:07.07889Z",
"updatedAt": "2026-07-30T00:52:23.916805Z"
},
{
"id": 13,
"reportId": 5,
"order": 1,
"reportSections": [
{
"id": 1857,
"x": 0,
"y": 9,
"w": 12,
"h": 7,
"content": "",
"contentType": "TextBox",
"reportSectionContents": [
{
"id": 2051,
"content": "<h1><u>Introduction</u></h1><p>Lorem ipsum dolor sit amet...</p>",
"contentId": 0,
"reportSectionId": 1857,
"createdAt": "2025-02-20T06:23:04.667686Z",
"updatedAt": "2026-05-28T04:42:16.997865Z"
}
],
"reportSectionSensors": [],
"reportPageId": 13,
"createdAt": "2025-02-20T06:23:04.66634Z",
"updatedAt": "2026-05-28T04:42:16.891698Z"
},
{
"id": 3203,
"x": 0,
"y": 0,
"w": 12,
"h": 9,
"content": "",
"contentType": "LocationSatellite",
"reportSectionContents": [],
"reportSectionSensors": [
{
"id": 4575,
"sensorId": 103,
"reportSectionId": 3203,
"createdAt": "2025-10-27T11:06:49.437482Z",
"updatedAt": "2025-10-27T11:06:49.437482Z"
}
],
"reportPageId": 13,
"createdAt": "2025-10-27T11:06:49.430849Z",
"updatedAt": "2026-05-28T04:42:16.879213Z"
}
],
"createdAt": "2023-12-18T01:31:07.064586Z",
"updatedAt": "2026-07-30T00:52:23.919426Z"
}
],
"recipients": [
{
"id": 1061,
"name": "Luka Peric",
"email": "luka@sensly.io",
"phoneNumber": "+61400939574",
"lastLogin": "2025-12-10T07:08:57.721439Z",
"projectUsers": null,
"organizationUsers": null,
"createdAt": "2025-07-27T14:36:03.702622Z",
"updatedAt": "2025-12-10T07:08:57.722012Z"
}
],
"createdAt": "2023-12-18T01:27:13.366651Z",
"updatedAt": "2026-04-14T07:09:13.437005Z"
}
]
Create a report
POST /api/v1/org/7/proj/22/reports
{
"name": "Weekly Report",
"period": "7 Days",
"periodStartTime": "",
"customPeriodDays": null,
"scheduled": true,
"startDay": "Friday",
"startTime": "11:01",
"frequency": "Weekly",
"header": true,
"footer": true,
"projectId": 22
}
name and projectId are required.
Update a report
PUT /api/v1/org/7/proj/22/reports/5
{
"name": "Weekly Report",
"period": "7 Days",
"periodStartTime": "",
"customPeriodDays": null,
"scheduled": true,
"startDay": "Friday",
"startTime": "11:01",
"frequency": "Weekly",
"header": true,
"footer": true,
"recipients": [1061, 1062]
}
name is required. recipients is an array of user ids (not full user objects).
Update page order
PUT /api/v1/org/7/proj/22/report-pages/13
Page update only accepts order — not sections or content.
To change section layout or text, use the report-sections / report-section-contents / report-section-sensors endpoints below.
Update a section
PUT /api/v1/org/7/proj/22/report-sections/1857
{
"x": 0,
"y": 9,
"w": 12,
"h": 7,
"content": "",
"contentType": "TextBox",
"reportSectionContents": [],
"reportSectionSensors": [],
"reportPageId": 13
}
w, h, contentType, and reportPageId are required. Nested reportSectionContents / reportSectionSensors on this request are not applied as nested updates — change those via their own endpoints.
Updating TextBox content
Text boxes are the usual target when changing report commentary via the API.
GETthe report (/reports/{id}) and find the section wherecontentTypeis"TextBox".
{
"id": 191,
"x": 0,
"y": 0,
"w": 4,
"h": 2,
"content": "",
"contentType": "TextBox",
"reportSectionContents": [
{
"id": 323,
"content": "<p>This is a text box.</p>",
"contentId": 0,
"reportSectionId": 191,
"createdAt": "2026-07-31T12:14:46.808198+08:00",
"updatedAt": "2026-07-31T12:14:46.808198+08:00"
}
],
"reportSectionSensors": [],
"reportPageId": 75,
"createdAt": "2026-07-31T12:14:46.806562+08:00",
"updatedAt": "2026-07-31T12:14:46.806562+08:00"
}
- Keep note of
reportSectionContents[0].idandreportSectionId. In the above examplereportSectionIdis191andreportSectionContents[0].idis323. PUTthat content on/report-section-contents/{id}.
PUT /api/v1/org/7/proj/22/report-section-contents/323
{
"content": "<p>The piezometers within this group continue to provide stable and consistent groundwater level data.</p>",
"reportSectionId": 191
}
Notes:
contentis HTML (e.g.<p>...</p>, headings, inline styles), not plain text.reportSectionIdis required.