listBulkCallLines
Retrieve per-contact call results for a bulk call campaign, including call status, sent variables, and recording IDs. Page through results with a cursor and filter by status or exact phone number.
Instructions
Per-contact results for a campaign: what happened on each call, the variables you sent with that contact, and a pointer to the recording.
Paging
There is one rule. Call it with no cursor, then keep passing back the
next_cursor you were handed until it comes back null.
cursor = None
while True:
page = GET /lines?pagesize=150&cursor={cursor}
handle(page["records"])
cursor = page["next_cursor"]
if not cursor: breakEach call returns a page of rows, oldest first: pagesize goes up to
150 and defaults to 30. Cursors are opaque, so pass back the string you
were given and never build one. No contact is skipped or returned
twice, even while the campaign is still dialing.
Transcripts are not in the row
Each row carries call.recording_id, not the conversation. Transcripts
reach 212 KB, so carrying them here would make one page tens of
megabytes. Fetch the one you want from
GET /calls/logs/{recording_id}.
(Tags: Bulk calls)
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| cursor | No | The `next_cursor` from your previous response. Omit it on the first request. Opaque: pass it back unchanged. | |
| search | No | An exact phone number, matched against the contact's number and the number that called it. Not a substring search. | |
| pagesize | No | Rows per page. Above 150 the request is refused. | |
| call_status | No | Return only contacts in this state. | |
| bulk_call_id | Yes | Id of the bulk call campaign. | |
| include_total | No | Add `total_records` to the response. It costs a count over the whole filtered campaign, so it is off unless you ask. Ask for it once to fill a header, not on every page of a walk. | |
| interaction_status | No | Return only contacts with this interaction outcome. |