Skip to main content
Every list endpoint in the Slate API returns results using cursor-based pagination. Instead of page numbers, Slate returns an opaque cursor string in each response that you pass back on your next request to fetch the following page. This approach is stable under concurrent writes — new accounts placed between your requests will not cause records to shift between pages.

Query Parameters

All list endpoints accept the following pagination query parameters:

Response Shape

A list response has two top-level parts: the page of records under a key named after the resource — never a generic data key — and a pagination object holding the cursor metadata. For example, the Accounts list endpoint returns records under accounts, and other endpoints use creditors, firms, files, fileRequests, users, qcChecklists, qcRequests, redactions, or signatureRequests.
  • The resource array (accounts here) — The records for the current page, keyed by the resource name.
  • pagination.totalCount — The total number of matching records across all pages. Use this to display progress or pre-allocate storage.
  • pagination.nextCursor — The cursor to pass on your next request. When you are on the last page, nextCursor is an empty string (""). Stop paginating when you receive an empty cursor.
  • pagination.previousCursor — The cursor for the previous page. It is an empty string ("") on the first page.
Every list endpoint across the Accounts, Files, Signatures, Quality Control, and Users APIs uses this same shape — records under a resource-named key and cursor metadata under pagination. The Files API also includes a pagination.countExceedsLimit boolean, which is true when the true total is larger than the reported totalCount.

Paginating Through All Results

Follow these steps to retrieve every record from a list endpoint.
1

Send your first request without a cursor

Make a GET request to the list endpoint with your desired limit and any filter parameters. Do not include a cursor parameter on this initial call.
Response:
2

Check the nextCursor value

If pagination.nextCursor is a non-empty string, more records are available. If it is "", you have received the last page and should stop.
3

Pass the cursor on your next request

Add cursor=<nextCursor> to your query parameters, keeping all other parameters identical. Changing limit, orderBy, or filter values while paginating will produce unpredictable results.
Response:
4

Repeat until nextCursor is empty

Continue requesting pages, each time passing the pagination.nextCursor from the previous response, until you receive a response where nextCursor equals "". That response contains the final page of records.

Cursor Opacity

Cursors are opaque — they are base64-encoded internal state that Slate uses to resume a query at the correct position. Do not attempt to parse, decode, or manually construct cursor values. The internal format may change without notice, and hand-crafted cursors will be rejected or return incorrect results.
Always store and pass back cursor values exactly as returned in the response. Do not URL-encode or decode the cursor value yourself — your HTTP client will handle encoding when it appends the cursor to the query string.