ElevenLabs API cursor pagination, and how Sume pages lists

ElevenLabs added a cursor-paginated phone number endpoint. Sume list routes use keyset pages: pass next_cursor back as cursor until has_more is false.

4 min readSume
All posts

ElevenLabs' latest cursor-paginated addition is a phone number endpoint; Sume pages its Format and run lists the same general way. Request a page, read next_cursor from the response, pass it back as cursor, and stop when has_more is false.

The vendor line is from the ElevenLabs changelog dated Sep 21 (read 2026-10-01). It does not describe the cursor field names, so the field names below are Sume's, from Formats and Format runs.

What did ElevenLabs add?

The Sep 21 entry says: "Added a cursor-paginated phone number endpoint with filters for provider, outbound support, assigned agent and branch, label and phone number." The page does not give request or response shapes in that line, so check the ElevenLabs API reference for the exact parameters.

How do Sume lists page?

Both list routes return a page. GET /v1/formats?limit=50 returns the Formats your workspace owns plus the first-party catalog, in keyset pages. GET /v1/formats/{handle}/{slug}/runs?limit=20 returns runs newest first; limit is 1 to 100 and defaults to 20.

Pagination fields from the Sume docs, read 2026-10-01.
FieldMeaning
limitPage size; 1 to 100 on the runs list, default 20
next_cursorPass back as cursor for the next page
has_moreKeep paging while true
cursorOpaque; one that is not Sume's is 400 invalid_request

What does a loop look like?

A minimal Node loop over the runs list, with the Format address as placeholders you replace:

const base = "https://api.sume.com/v1/formats/acme/live-commerce/runs";
const headers = { Authorization: "Bearer " + process.env.SUME_API_KEY };

let cursor = null;
do {
  const url = new URL(base);
  url.searchParams.set("limit", "100");
  if (cursor) url.searchParams.set("cursor", cursor);
  const res = await fetch(url, { headers });
  if (!res.ok) throw new Error("list failed: " + res.status);
  const page = await res.json();
  console.log(Object.keys(page));
  cursor = page.has_more ? page.next_cursor : null;
} while (cursor);

Do runs created while I page shift the rows?

The docs say the cursor is keyset over (created_at, id), so runs created while you page do not shift rows. Treat the cursor as an opaque string and do not build or edit one. For the other list routes, see Sume API pagination for list endpoints.

Sources

Related posts

More in Developers

All Developers posts

Written by Sume