Skip to content

Pagination

The SDK provides multiple ways to handle paginated results.

Basic Pagination

List methods return paginated responses by default:

typescript
const response = await client.risks.list();

console.log(response.data);       // Array of risks
console.log(response.meta);       // Pagination metadata
console.log(response.links);      // Navigation links

Response Structure

typescript
interface ListResponse<T> {
  data: T[];                    // Array of resources
  meta: {
    totalCount: number;         // Total number of items
    pageCount: number;          // Total number of pages
    currentPage: number;        // Current page number
    perPage: number;            // Items per page
    hasMore?: boolean;          // Whether more pages exist
    nextCursor?: string;        // Cursor for next page
  };
  links: {
    self: string;               // Current page URL
    first: string;              // First page URL
    last: string;               // Last page URL
    next?: string;              // Next page URL (if exists)
    prev?: string;              // Previous page URL (if exists)
  };
}

Page-Based Pagination

Navigate using page numbers:

typescript
// Get page 1 with 25 items per page
const page1 = await client.risks.list({
  page: { number: 1, size: 25 }
});

// Get page 2
const page2 = await client.risks.list({
  page: { number: 2, size: 25 }
});

Cursor-Based Pagination

Use cursors for consistent pagination:

typescript
let cursor: string | undefined;
let allRisks: Risk[] = [];

do {
  const response = await client.risks.list({ cursor, limit: 100 });
  allRisks.push(...response.data);
  cursor = response.meta.nextCursor;
} while (cursor);

console.log(`Fetched ${allRisks.length} risks`);

Auto-Pagination

The easiest way to iterate over all resources:

typescript
// Async iterator - automatically fetches all pages
for await (const risk of client.risks.listAll()) {
  console.log(risk.name);
}

With Options

typescript
// Apply filters while auto-paginating
for await (const risk of client.risks.listAll({
  filter: { severity: 'high' },
  sort: '-createdAt',
})) {
  console.log(`${risk.name} - ${risk.severity}`);
}

Collect All Items

typescript
// Collect all items into an array
const allRisks: Risk[] = [];
for await (const risk of client.risks.listAll()) {
  allRisks.push(risk);
}

// Or using Array.fromAsync (Node 22+)
const risks = await Array.fromAsync(client.risks.listAll());

Pagination Options

OptionTypeDescription
page.numbernumberPage number (1-indexed)
page.sizenumberItems per page (default: 25, max: 100)
cursorstringCursor from previous response
limitnumberNumber of items to fetch
sortstringSort field (prefix with - for descending)

Examples

Display All Risks

typescript
console.log('All Risks:');
console.log('-'.repeat(40));

for await (const risk of client.risks.listAll()) {
  console.log(`• ${risk.name}`);
  console.log(`  Severity: ${risk.severity}`);
  console.log(`  Status: ${risk.status}`);
  console.log();
}

Count Items

typescript
let count = 0;
for await (const _ of client.controls.listAll()) {
  count++;
}
console.log(`Total controls: ${count}`);

Early Exit

typescript
// Stop after finding a specific item
for await (const risk of client.risks.listAll()) {
  if (risk.severity === 'critical') {
    console.log('Found critical risk:', risk.name);
    break; // Stop fetching more pages
  }
}

Parallel Processing

typescript
// Process items in batches
const batchSize = 10;
let batch: Risk[] = [];

for await (const risk of client.risks.listAll()) {
  batch.push(risk);
  
  if (batch.length >= batchSize) {
    await Promise.all(batch.map(r => processRisk(r)));
    batch = [];
  }
}

// Process remaining items
if (batch.length > 0) {
  await Promise.all(batch.map(r => processRisk(r)));
}

Performance Tips

Limit Fields

Reduce response size by selecting only needed fields:

typescript
const response = await client.risks.list({
  fields: { risks: ['id', 'name', 'severity'] }
});

Reasonable Page Sizes

Balance between request count and response size:

typescript
// Too small - many requests
const slow = await client.risks.list({ page: { size: 5 } });

// Good balance
const optimal = await client.risks.list({ page: { size: 50 } });

// Maximum allowed
const max = await client.risks.list({ page: { size: 100 } });

Next Steps

Released under the MIT License.