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 API states vs Sume job status and webhooks
ElevenLabs Flows generations report pending, generating, completed and failed. Sume jobs use async, a 30-second wait cap and terminal-only webhook events.
- 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.
- ElevenLabs Music Audio Reference vs Sume Music's image input
ElevenLabs Audio Reference guides Music v2/v2.5 with a track of about 30 seconds. Sume Music 1.0 takes a text prompt and one optional public HTTPS image URL.
Written by Sume