Skip to content

Pagination

Endpoint daftar (mis. kontak, percakapan, pesan) mengembalikan hasil per-halaman menggunakan pagination berbasis kursor. Kursor lebih stabil daripada offset saat data berubah selama Anda menelusuri.

Parameter

ParameterLokasiArti
limitqueryJumlah item per halaman (ada nilai default & maksimum per endpoint).
cursorqueryPenanda halaman berikutnya, dari respons sebelumnya.

Bentuk respons

Respans daftar membawa data dan kursor untuk halaman selanjutnya:

json
{
  "data": [
    { "id": "c_01", "name": "Budi" },
    { "id": "c_02", "name": "Sari" }
  ],
  "pageInfo": {
    "hasNextPage": true,
    "nextCursor": "eyJpZCI6ImNfMDIifQ"
  }
}

Bentuk pasti dapat berbeda per-endpoint

Nama field (pageInfo/nextCursor/meta) dan amplop respons bisa bervariasi. Selalu cek bentuk persisnya di Referensi API interaktif.

Menelusuri semua halaman

Lanjutkan selama hasNextPage true, teruskan nextCursor ke permintaan berikutnya:

ts
async function* listAll(path: string) {
  let cursor: string | undefined
  do {
    const url = new URL(`https://api.volara.chat/api/v1/${path}`)
    url.searchParams.set('limit', '100')
    if (cursor) url.searchParams.set('cursor', cursor)

    const res = await fetch(url, {
      headers: { Authorization: `Bearer ${process.env.VOLARA_API_KEY}` },
    })
    const body = await res.json()
    for (const item of body.data) yield item
    cursor = body.pageInfo?.hasNextPage ? body.pageInfo.nextCursor : undefined
  } while (cursor)
}

for await (const contact of listAll('contacts')) {
  console.log(contact.id)
}

Praktik baik

  • Pakai limit sebesar mungkin yang diizinkan untuk mengurangi jumlah permintaan, tetapi tetap hormati Rate Limits.
  • Perlakukan cursor sebagai token buram (opaque) — jangan parse atau ubah.
  • Untuk sinkronisasi real-time, gabungkan dengan Webhooks alih-alih polling berulang.

Langkah selanjutnya

  • Rate Limits agar penelusuran besar tetap aman.
  • Errors untuk menangani kegagalan di tengah halaman.