Pagination

Cursors

Lists take ?limit= and ?cursor= and answer with a meta object beside the data:

GET /v1/events?limit=2
{
  "events": [
    {
      "v": 1,
      "t": "tweet.create",
      "op": "create",
      "id": "tweet:2097879002992070835",
      "…": "…"
    },
    {
      "v": 1,
      "t": "follow.add",
      "…": "…"
    }
  ],
  "meta": {
    "count": 2,
    "has_more": true,
    "next_cursor": "eyJpZCI6MTAxODMyLCJ0IjoiMjAyNi0wOS0xNlQwODo0MDoxMSswMDowMCJ9"
  }
}

Pass next_cursor back as ?cursor= for the following page; null means the end. Cursors are opaque and expire with the data they point at. Newest first for events, alphabetical for targets. The follow-list and timeline reads under Reads use X's own cursors the same way, and there count is a hint, not a promise — X decides the page size and routinely ignores small values, so a request for 5 may return 70.