List call records

Searches your account's call records, newest first, one record per call.

Use it:

  • Filter by time (from, to), parties, outcome, or what was said (transcript_q).
  • Follow next_cursor until it is null, sending it alone as cursor.
  • Refresh rows you already show with ids.

Response: a page of up to limit records, with next_cursor and meta. With transcript_q, each row carries match.

Notes:

  • Without from and to: the last 30 days. A date-only to runs through the end of that day in your account's time zone.
  • A page may hold fewer rows than limit, even none, while next_cursor is not null.
  • A call appears about 20 seconds after it ends. History starts on May 1, 2026.
  • HEAD answers the same status and headers with no body.

Logged: nothing. Neither previews (include=previews) nor match snippets are recorded in the access log.

Recent Requests
Log in to see full request history
TimeStatusUser Agent
Retrieving recent requests…
LoadingLoading…
Query Params
string

Start of the window on started_at, inclusive. A date (2026-10-01), read in your account's time zone, or an instant with a zone (2026-10-01T13:00:00Z; up to nine fraction digits, a fraction rounding up to the next second). Default: 30 days before to.

string

End of the window on started_at. A date runs through the end of that day in your account's time zone; an instant with a zone is exclusive (a fraction rounds up to the next second). Default: now.

ids
array of uuids
length ≤ 100

Repeatable, up to 100. Fetch these known records, in the order given, in one answer; for refreshing rows you already show. No default window applies; an explicit from/to and the other filters still narrow. An id that does not exist, is in another account or is not visible to you is simply absent. limit, cursor, sort and with_total do not apply.

ids
direction
array of strings
length ≤ 20

Repeatable. inbound, outbound or internal (between two of your extensions). Default: all three.

direction
Allowed:
type
array of strings
length ≤ 20

Repeatable. voice or fax. Default: both. A fax is type: fax, with the outcome of its call.

type
Allowed:
outcome
array of strings
length ≤ 20

Repeatable. How the call ended, in the Analytics taxonomy (see outcome on the record): answered, abandoned, system_ended, voicemail (inbound); connected, no_answer, cancelled (outbound); answered, no_answer, cancelled, voicemail (internal). For missed calls, use missed=true.

outcome
Allowed:
boolean

true: the Missed group, inbound calls nobody answered (outcome abandoned, system_ended or voicemail). false: every other call.

boolean

Only calls where a voicemail message was left (true) or was not (false).

string
length between 1 and 100

Free-text search, up to 100 characters: a case-insensitive match on the two names each call recorded at the time, or on the digits of its numbers. On an internal call those are both extensions' caller ID names (caller_id_name); on an inbound call, the caller's caller ID name and the name of the company number dialed; on an outbound call, your outbound caller ID name and the called party's name. An inbound or outbound call also matches the current name of the contact its outside party's number belongs to: the name its external party shows (a renamed contact matches under its new name). So a colleague's name finds their internal calls, not the outside calls they answered or placed: for every call an extension took part in, use extension (a number or the extension's exact name). An extension renamed since a call matches under the name it had then. No query syntax.

string
length between 1 and 200

Search what was said in the calls' transcripts, up to 200 characters: keywords or a short phrase, matched in English and French, word forms included (cancel also finds cancelled). Web-search syntax: every word must appear; "a quoted phrase" in that order; -word excludes; or between alternatives. Include at least one word to find: exclusions alone (-word) are refused with parameter_invalid. Use distinctive words: a common word matches most calls. Only calls whose transcript you may read match (permissions.read_transcript), never a deleted recording's transcript. Each matching row carries match. A transcript becomes searchable a few minutes after the call ends. Combines with every other filter. A search that runs too long is refused with query_too_broad: narrow the window or add filters. For a few seconds after a recording is deleted or a permission changes, paging can stop before the last match (next_cursor is null early). An empty first page carries no meta.latest_at.

company_number
array of strings
length ≤ 20

Repeatable. Only calls received on, or placed as, these numbers of yours. A full phone number in any format, or a code as a record's company_number.code shows it (such as *611).

company_number
external_number
array of strings
length ≤ 20

Repeatable. Only calls with these outside numbers: the caller on an inbound call, the number dialed on an outbound one. A full phone number in any format.

external_number
extension
array of strings
length ≤ 20

Repeatable. Only calls the extension touched: it placed, answered, was forwarded from, picked up or was dialed, rang in a ring group, was offered by a queue, or its mailbox got the call; exactly the calls its own user sees. An outside caller ID never matches. Give its number, its exact name or its id; a number that is no current extension still matches its calls. A caller who sees only their own calls may name only their own extensions (403 forbidden). With exactly one extension, each row also carries extension_outcome. To see who answered, read answered_by and placed_by on each row.

extension
recording
array of strings
length ≤ 20

Repeatable. Only calls whose recording status is one of these: recorded (at least one recording that is not deleted), deleted (it had recordings and every one is deleted), none (never recorded). Default: all three.

recording
Allowed:
integer
0 to 86400

Only calls at least this many seconds long, from the first ring to the end (0 to 86400).

integer
0 to 86400

Only calls shorter than this many seconds (0 to 86400); must be above duration_min.

hour_of_day
array of integers
length ≤ 24

Repeatable. Only calls that started in these hours of the day (0 to 23), in your account's time zone.

hour_of_day
string
enum

previews: adds transcript.preview (the first ~200 characters of the call's transcript, speaker-labeled) to each row whose transcript you may read, and each analysis' headline where you may read its analyses. Never recorded in the access log.

Allowed:
string

next_cursor from the previous page. It carries the request's parameters, so send it alone; limit, include and with_total may change (a with_total=true carried from page one counts again on every page unless you send with_total=false). It works only for the caller it was issued to and expires after 24 hours.

integer
1 to 200
Defaults to 50

Records per page, 1 to 200. Default: 50. A page may hold fewer rows than limit, even none, while next_cursor is not null. Not with ids.

string
enum
Defaults to newest

newest (the default) or oldest, by started_at, then id; relevance (only with transcript_q): by match.score, best first, then newest. relevance ranks the most recent matching calls of the window: over a long window with a common word, older matches are not ranked, so its pages end before them (meta.total still counts every match). To reach every match, use newest or oldest, or narrow from and to. Not with ids.

Allowed:
boolean
Defaults to false

true adds meta.total: how many calls match the filters, exact up to 10,000 (meta.total.exact says whether it is). Ask for it on the first page only: counting costs more than listing and is limited more tightly. With transcript_q, for a few seconds after a recording is deleted or a permission changes, it can count a call the list no longer returns. Not with ids.

uuid

The one account to read, by its id (account.id). Only a caller that may choose the account (EMAK support) sends it, and must; everyone else reads the account they belong to. Absent for a caller that must name it: 400 parameter_missing. Empty or not an account id: 400 parameter_invalid. Given twice: 400 parameter_invalid for any caller. Sent by a caller that reads its own account: 403 forbidden. An account that does not exist or is disabled: 404 reference_not_found. Each names account_id in param. The account is named this way only: a request that sends the legacy account header X-Tenant-Domain-Uuid is refused (400 parameter_unknown).

Responses

Language
Credentials
Bearer
LoadingLoading…
Response
Click Try It! to start a request and see the response here! Or choose an example:
application/json