interface PaginationParams {
limit?: number;
startingAfter?: string;
endingBefore?: string;
orderBy?: string;
sort?: "asc" | "desc";
}
async function* paginateContacts(params: PaginationParams = {}): AsyncGenerator<Contact[]> {
let hasMore = true;
let cursor: string | undefined;
while (hasMore) {
const searchParams = new URLSearchParams({
limit: String(params.limit || 50),
...(cursor && { startingAfter: cursor }),
...(params.orderBy && { orderBy: params.orderBy }),
...(params.sort && { sort: params.sort }),
});
const response = await fetch(`https://api.us.firstquadrant.ai/v5/contacts?${searchParams}`, {
headers: {
Authorization: "Bearer YOUR_API_KEY",
"FirstQuadrant-Organization-ID": "org_YOUR_ORG_ID",
},
});
const page: Contact[] = await response.json();
yield page;
hasMore = page.length === (params.limit || 50);
if (hasMore && page.length > 0) {
cursor = page[page.length - 1].id;
}
}
}
// Usage
for await (const page of paginateContacts({ limit: 25 })) {
console.log(`Processing ${page.length} contacts`);
// Process each page
}