Pagination & Polling
List endpoints return a page of results plus a meta.paging object that tells you how to fetch the next page or check for new items. Three paging modes are supported, chosen by the parameter you pass:
| Parameter | Mode | Use for |
|---|---|---|
pageCursor | Cursor-based | Walking a result set (no item drift) |
pageNumber | Classic | One-off queries where you want a total count |
sinceCursor | Polling | Watching for new items as they arrive |
The three are mutually exclusive. Passing more than one returns 400 Bad Request.
Page size
pageSize controls how many items come back per request. Defaults to 50, with a per-plan ceiling:
| Plan | Max pageSize |
|---|---|
| Free / Lite | 50 |
| Advanced | 100 |
| Ultimate | 200 |
Requests exceeding your plan's maxPage are rejected. Larger pages cost the same as smaller ones (one request, one quota unit), so prefer larger pages when backfilling.
Cursor pagination (pageCursor)
The default mode when walking a result set. Cursors are opaque strings; do not parse them.
Response includes:
{
"meta": {
"paging": {
"pageSize": 50,
"nextCursor": "eyJ0cyI6MTcz...",
"latestCursor": "eyJ0cyI6MTcz..."
}
}
}
To walk the result set, pass nextCursor as pageCursor on the next request. Stop when nextCursor is null.
cursor = None
while True:
params = {"pageSize": 100}
if cursor:
params["pageCursor"] = cursor
r = requests.get(URL, headers=HEADERS, params=params)
page = r.json()
process(page["data"])
cursor = page["meta"]["paging"]["nextCursor"]
if not cursor:
break
Cursors are stable across new items being inserted. You will not see duplicates or skipped items if RNS publishes while you walk.
Classic pagination (pageNumber)
Use when you need a total. Pages are 1-indexed.
GET /v2/disclosures/sources/rns/items?pageNumber=2&pageSize=50
Response:
{
"meta": {
"paging": {
"pageSize": 50,
"pageNumber": 2,
"pageTotal": 14,
"itemTotal": 683,
"latestCursor": "eyJ0cyI6MTcz..."
}
}
}
New items inserted between requests will shift results: page 1 today is not page 1 tomorrow. Prefer pageCursor if you care about consistency.
Polling for new items (sinceCursor)
The polling mode. Each response includes a latestCursor; pass it back as sinceCursor on the next poll to get only items newer than the last one you saw.
cursor = None
while True:
params = {"pageSize": 50}
if cursor:
params["sinceCursor"] = cursor
r = requests.get(URL, headers=HEADERS, params=params)
page = r.json()
for item in page["data"]:
process(item)
cursor = page["meta"]["paging"]["latestCursor"]
time.sleep(60)
Key properties:
- Items are returned newest-first.
- When no new items exist, the response is empty and
latestCursorechoes back the value you sent. This is perfect for cheap idle polling. hasMore: truemeans more new items existed than fit inpageSize. The response contains the newestpageSizeitems; older new items were truncated. BumppageSizeor poll more frequently.
sinceCursor is the recommended pattern for low-latency consumption. Empty polls still count against your quota (one request each), so size your polling interval to your tier. See Rate Limits.
latestCursor from any response
Every response (cursor, classic, or polling) includes a latestCursor in meta.paging. You can use that to seed a sinceCursor poll after a one-off backfill, without making an extra request.
Date filtering: dateFrom and dateTo
Time bounds are independent of pagination but interact with it.
- Both are inclusive.
dateFrom=2025-12-31matches items published at2025-12-31T00:00:00Zor later;dateTo=2025-12-31matches items through2025-12-31T23:59:59Z. - Partial dates expand to natural boundaries.
dateFrom=2025→ Jan 1st 00:00:00.dateTo=2025→ Dec 31st 23:59:59. Months and days expand the same way. dateFromhas a default. If omitted, it defaults to 30 days beforedateTo(or 30 days ago ifdateTois also omitted). The default does not apply when filtering bysymbolsorisins; those queries return the full history allowed by your plan.
For full timestamp formats and examples, see the API Reference.
Which mode should I use?
- Building a feed/alerting integration →
sinceCursorpolling. - Backfilling history into a database →
pageCursorwith the largestpageSizeyour plan allows. - Building a paginated UI with "page X of Y" →
pageNumber.