> ## Documentation Index
> Fetch the complete documentation index at: https://docs.periskope.app/llms.txt
> Use this file to discover all available pages before exploring further.

# The Call Object

> A WhatsApp call on one of the organization's phones: who called whom, how it ended and, for calls handled in Periskope, its recording, participants, transcript and summary.

```json The Call Object theme={null}
{
  "call_id": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
  "notification_id": "false_919999999999@c.us_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA_919999999999@c.us",
  "org_id": "00000000-0000-0000-0000-000000000000",
  "org_phone": "911111111111@c.us",
  "chat_id": "919999999999@c.us",
  "chat_name": "John Doe",
  "caller": "919999999999@c.us",
  "direction": "incoming",
  "result": "connected",
  "handled_via": "periskope",
  "timestamp": "2026-01-15T09:30:00.000Z",
  "duration_seconds": 184,
  "answered_by": "agent@example.com",
  "transcript": {
    "status": "done",
    "utterances": [
      {
        "start_seconds": 12.4,
        "speaker": "John Doe",
        "text": "Hi, I wanted to check on my order."
      }
    ]
  },
  "summary": {
    "text": "The customer asked about a delayed order. The agent confirmed it ships tomorrow and shared the tracking link."
  },
  "answered_by_name": "Asha Rao",
  "started_at": "2026-01-15T09:30:00.000Z",
  "answered_at": "2026-01-15T09:30:05.000Z",
  "ended_at": "2026-01-15T09:33:09.000Z",
  "end_reason": "remote_end",
  "participants": [
    {
      "email": "agent@example.com",
      "name": "Asha Rao",
      "role": "host"
    }
  ],
  "recording": {
    "url": "https://api.periskope.app/app/media/periskope-call-attachments/00000000-0000-0000-0000-000000000000/phone-aaaaaaaaaaaaaaaa/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.wav?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
    "url_expires_at": "2026-01-15T10:30:00.000Z",
    "duration_seconds": 184,
    "channels": {
      "left": "customer",
      "right": "agents"
    },
    "agent_tracks": [
      {
        "email": "agent@example.com",
        "name": "Asha Rao",
        "url": "https://api.periskope.app/app/media/periskope-call-attachments/00000000-0000-0000-0000-000000000000/phone-aaaaaaaaaaaaaaaa/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.agent-0.wav?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
      }
    ],
    "recorded_at": "2026-01-15T09:33:10.000Z",
    "truncated": false
  }
}
```

**Attributes**

**call\_id** `string`

WhatsApp's id for the call. Pass it to Get a call. Also the unique\_id of the call's notification row.

**notification\_id** `string`

Id of the call's row in the notifications list (type "call") and in chat.notification.created webhook events. Get a call also accepts it in place of call\_id.

**org\_id** `string`

Id of the organization the call belongs to.

**org\_phone** `string`

Org phone (WhatsApp account) that made or received the call, as country code + number suffixed with @c.us.

**chat\_id** `string`

Chat the call belongs to: the other party for a 1-1 call, the group for a group call. A caller WhatsApp could not resolve to a number appears as an id ending in @lid.

**chat\_name** `string`

Name of the chat, or the contact's saved name when the chat has none. Absent for unknown numbers.

**caller** `string`

Who placed the call (\<countrycode>\<number>@c.us): the org phone for outgoing calls, the customer for incoming ones.

**direction** `string`

'incoming' or 'outgoing', from the org phone's point of view. One of: `incoming`, `outgoing`.

**result** `string`

How the call ended, as reported by WhatsApp. One of: connected, missed, rejected, unavailable, cancelled, acceptedelsewhere, invalid, upcoming, failed, abandoned, ongoing. Absent for very old calls.

**handled\_via** `string`

'periskope' when the call's audio ran through Periskope (answered or placed by a member in the app); 'phone' otherwise — answered, placed or missed on the WhatsApp phone itself. Only Periskope calls have a recording, transcript and summary. One of: `periskope`, `phone`.

**timestamp** `string`

When the call was logged, as an ISO 8601 UTC timestamp — the call start for most calls. Calls are sorted by this field.

**duration\_seconds** `number`

Talk time in seconds (0 for unanswered calls), when known — from WhatsApp, or the recording length otherwise.

**answered\_by** `string`

Email of the member who answered (incoming) or placed (outgoing) the call in Periskope.

**transcript** `object`

Transcription status and, once done, the transcript line by line. Absent when the call was not recorded.

**properties**

**status** `string`

Transcription progress: 'pending' (queued or running), 'done' or 'failed'. Transcription starts once the recording is saved and usually finishes within a few minutes of the call ending.

**utterances** `object[]`

The transcript, line by line in spoken order, once status is done.

**each item**

**start\_seconds** `number`

Offset into the recording where this line starts, in seconds.

**speaker** `string`

Who spoke: the customer's name (or number) for the customer side, a member's email for the Periskope side.

**text** `string`

What was said.

**summary** `object`

AI summary of the call, generated after transcription. Absent until then, or when summarizing failed.

**properties**

**text** `string`

Two to three sentence summary of the conversation.

**answered\_by\_name** `string`

Display name of the member in answered\_by, when set. Returned by Get a call only.

**started\_at** `string`

When the call started, as an ISO 8601 UTC timestamp — WhatsApp's own start time when reported, else timestamp. Returned by Get a call only.

**answered\_at** `string`

When the call was answered, as an ISO 8601 UTC timestamp. Absent for unanswered calls and calls WhatsApp did not time. Returned by Get a call only.

**ended\_at** `string`

When the call ended, as an ISO 8601 UTC timestamp, when known. Returned by Get a call only.

**end\_reason** `string`

Why the call ended, for calls handled in Periskope: 'local\_hangup' (a member hung up), 'remote\_end' (the customer hung up), 'disconnect', 'ended', or 'join\_failed: \<reason>'. Absent for calls handled on the phone. Returned by Get a call only.

**participants** `object[]`

Periskope members on the call, in the order they joined. Present for recorded calls. Returned by Get a call only.

**each item**

**email** `string`

Email of the member.

**name** `string`

The member's display name, when set.

**role** `string`

'host' for the member who answered or placed the call, 'joined' for members who joined it later.

**recording** `object`

The call recording with downloadable links, its channel layout and per-member tracks. Absent when the call was not recorded (handled on the phone, unanswered, or too short).

**properties**

**url** `string`

Downloadable link to the call recording, a stereo WAV file. When the organization's media privacy is on, the link carries an access token, opens without other credentials and stops working 1 hour after the response (url\_expires\_at); fetch the call again for a fresh link. When media privacy is off, it is a plain link that opens without credentials and does not expire.

**url\_expires\_at** `string`

When url (and every agent\_tracks url) stops working, as an ISO 8601 UTC timestamp: 1 hour after the response. Present only when the organization's media privacy is on; without it the links do not expire.

**duration\_seconds** `integer`

Length of the recording in seconds.

**channels** `object`

What each stereo channel carries: left is the customer, right is every Periskope member on the call mixed together.

**properties**

**left** `string`

**right** `string`

**agent\_tracks** `object[]`

One separate recording per member who joined the call, when they were captured. Absent for calls recorded before per-member tracks existed.

**each item**

**email** `string`

Email of the member this track belongs to.

**name** `string`

The member's display name, when set.

**url** `string`

Downloadable link to this member's own audio, a mono WAV aligned to the stereo recording. When the organization's media privacy is on, the link carries an access token, opens without other credentials and stops working 1 hour after the response (url\_expires\_at); fetch the call again for a fresh link. When media privacy is off, it is a plain link that opens without credentials and does not expire.

**recorded\_at** `string`

When the recording was saved, as an ISO 8601 UTC timestamp.

**truncated** `boolean`

true when the recording hit the size cap and stops before the call ended.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.