Pagination
List endpoints share these common parameters. Where an endpoint's own page says otherwise, that page is right:
| Param | Default | Notes |
|---|---|---|
page | 1 | 1-based page number. |
per_page | 25 | Page size. Maximum 50, except form responses and survey answers, which allow 100 (see Forms and Surveys). A larger value is capped at the maximum and a value below 1 counts as 1; neither is an error. |
since | — | ISO 8601 date or datetime. Filters to records created at or after this timestamp. A value that is not a date returns 422. Useful for incremental sync. Not offered on every list (for example the handbook and course chapter lists). GET /formresponses filters on when a response was last updated instead. GET /users lists only registered users but filters on when the account was created, see Users. |
Response shape
{
"data": [],
"links": {
"first": "https://customer.monotree.com/api/open/v1/walls/1/posts?page=1",
"last": "https://customer.monotree.com/api/open/v1/walls/1/posts?page=4",
"prev": null,
"next": "https://customer.monotree.com/api/open/v1/walls/1/posts?page=2"
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 4,
"links": [
{ "url": null, "label": "« Previous", "page": null, "active": false },
{ "url": "https://customer.monotree.com/api/open/v1/walls/1/posts?page=1", "label": "1", "page": 1, "active": true },
{ "url": "https://customer.monotree.com/api/open/v1/walls/1/posts?page=2", "label": "2", "page": 2, "active": false },
{ "url": "https://customer.monotree.com/api/open/v1/walls/1/posts?page=2", "label": "Next »", "page": 2, "active": false }
],
"path": "https://customer.monotree.com/api/open/v1/walls/1/posts",
"per_page": 25,
"to": 25,
"total": 92
}
}To fetch all pages, follow links.next until it is null. meta.links is a list of page links for building a pager (shortened above); from and to are null on a page past the end.
The page links keep the query string of your request, so links.next stays on the same filters and per_page. Rows that tie on a list's sort key, such as two posts created in the same second, are ordered by id in the same direction, so following the pages neither repeats nor skips a row.
Some lists are not paginated and return everything in data with no links or meta, for example locales and bots.
Incremental sync
Combine since with a stored timestamp to pull only new records:
curl "https://customer.monotree.com/api/open/v1/walls/1/posts?since=2026-03-22T00:00:00Z" \
-H "Authorization: Bearer mono_your_token_here"After the first sync, store the most recent created_at you received and pass it as since on the next request, with the + of its offset URL-encoded as %2B. A since with Z or another offset is compared as that moment; one without an offset is read as Copenhagen time. The comparison is inclusive, so records exactly on that timestamp appear again.
The /formresponses bulk feed filters on updated_at rather than created_at, so that edits and new comments are caught too: there, store the most recent updated_at instead.
The users list returns only users who have accepted their invite, but since filters on when the account was created: an employee invited before your last sync who registers after it is never returned by since. Sync users with a full pull instead.