Skip to main content
Query API responses can contain thousands of records. Use pagination to retrieve data in manageable chunks, and delta queries to fetch only new data since your last sync.

Cursor-based pagination

Every response includes a next_cursor for fetching the next page:
Pass the cursor to get the next page:

Page size

Control the number of records per page with the limit parameter:

Delta queries

Fetch only data that’s been ingested since your last sync using ingested_begin and ingested_end:

Time-based filtering

ingested_begin and ingested_end filter by when data was added to Emerge, not when the user performed the action. This is useful for incremental syncs.

Response fields for delta sync

The response includes additional fields to help with delta syncing:

Delta sync pattern

Best practices

Always use the applied_ingested_end from the response as your next ingested_begin value. This ensures no gaps between syncs.
An empty data array with has_more: false means no new data since your last sync.
500 records per page balances throughput and memory usage for most applications.
If you hit rate limits or errors, back off exponentially before retrying.
Each record includes an event_id for deduplication. Use this to handle any potential duplicates across pagination boundaries.

Async job pagination

For async queries, results are returned as a single Parquet file. The file contains all records for all users in the request. If you need to paginate through very large async results, use the begin and end date parameters to narrow the time range: