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.

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.
| Field | Meaning |
|---|---|
limit | Page size; 1 to 100 on the runs list, default 20 |
next_cursor | Pass back as cursor for the next page |
has_more | Keep paging while true |
cursor | Opaque; 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
- ElevenLabs Flows webhook: what changed, and Sume's per-job webhook
ElevenLabs Flows template runs can send a terminal result to a webhook, and webhook targets now need type all or ids. Sume sets the callback per job.
- is_final_audio_for_turn vs Sume TTS sentence boundaries: wav or mp3
ElevenLabs now emits is_final_audio_for_turn after every byte, even for MP3. Sume marks boundaries differently: sentence segments, sliced only for wav or raw.
- eleven_turbo_v2_5 deprecated: use Flash; Sume TTS Router ids
ElevenLabs lists eleven_turbo_v2_5 as deprecated and suggests eleven_flash_v2_5. Sume's TTS Router pins an explicit catalog id, so list the ids first.
- ElevenLabs Voice Design 409: wait and retry, or new key on Sume?
Voice Design now returns 409 while a preview generation is in progress; ElevenLabs says retry. On Sume, reuse an Idempotency-Key only for the same payload.
Written by Sume