The public API pages in two ways: lists, which know how many items they hold, and dataset rows, which do not.
Every list endpoint — /v1/projects, /v1/projects/{project_id}/datasets,
/v1/projects/{project_id}/nodes — takes the same two parameters:
| Parameter | Default | Range | Meaning |
|---|---|---|---|
page | 1 | from 1 | Page number, 1-based. |
size | 50 | 1–100 | Items per page. |
curl -H "X-Api-Key: mvk_…" \
"https://dev-api-muvia.oncode.it/api/public/v1/projects?page=2&size=20"
and answers with the same page shape:
{
"items": [ … ],
"total": 37,
"page": 2,
"size": 20,
"pages": 2
}
| Field | Meaning |
|---|---|
items | The resources on this page. |
total | How many resources the whole list holds. |
page | The page you asked for. |
size | The page size you asked for. |
pages | How many pages the list has at this size. |
To read a whole list, start at page=1 and continue while page < pages. A
page past the last one answers an empty items with the real total. A page
below 1 or a size outside 1–100 answers 422 validation_error, with
details naming the parameter.
GET /v1/projects/{project_id}/datasets/{dataset_id}/rows reads a saved
dataset's query, and the rows of an arbitrary query cannot be counted cheaply.
So a page of rows has no total and no pages; it says instead whether more
rows follow.
| Parameter | Range | Meaning |
|---|---|---|
page | from 1 | Page number, 1-based. |
size | 1–1000, default 100 | Rows per page. |
curl -H "X-Api-Key: mvk_…" \
"https://dev-api-muvia.oncode.it/api/public/v1/projects/<project_id>/datasets/<dataset_id>/rows?page=1&size=500"
{
"columns": ["timestamp", "sensor", "value"],
"items": [
{ "timestamp": "2026-09-26T08:00:00", "sensor": "T-101", "value": 21.4 },
{ "timestamp": "2026-09-26T08:00:00", "sensor": "T-102", "value": 19.8 }
],
"page": 1,
"size": 500,
"has_more": true
}
| Field | Meaning |
|---|---|
columns | The result's column names, in order. |
items | One object per row, keyed by column name. |
page | The page you asked for. |
size | The page size you asked for. |
has_more | true when at least one more row follows this page. |
To read every row, start at page=1 and continue while has_more is true.
Rows come in the order the dataset's query returns them. A query without an
ORDER BY has no guaranteed order, so the same row may appear on two pages
and another on none. If you page through a dataset, make sure its query
orders its rows — the dataset is edited in Muvia, not through the API.
Rows are read live on every request: rows added while you page can shift the pages that follow. Process rows idempotently by a key of your own.