Choose pagination for the workload
Offset pagination is easy to understand and works well for small, stable datasets. Cursor pagination is more consistent for large or frequently changing lists because it does not repeatedly scan the same page boundary.
Validate and constrain filters
Allow only known filter fields and sort directions. Put upper bounds on page size, reject expensive combinations, and never concatenate user input directly into SQL or query expressions.
Return a predictable response
A useful list response includes the data, applied filters, and pagination information such as the next cursor or total count when that count is affordable. Consistency makes frontend components much simpler.
Index the real access path
Pagination and filtering are database concerns as much as API concerns. Verify that the query plan supports the order and filters used by the endpoint, and measure with realistic data volume.
