Pagination

List endpoints share these common parameters. Where an endpoint's own page says otherwise, that page is right:

ParamDefaultNotes
page11-based page number.
per_page25Page 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.