> For the complete documentation index, see [llms.txt](https://twentytwo.documentationai.com/llms.txt).
> Use it to discover all available pages before exploring further.

# Get Call Details

Returns full details for a single call — status, duration, cost,
input parameters, output parameters, recording, and transcript.

> **Note:** Recording and transcript URLs expire 30 days after the
> call ends. Download the files before `expires_at` if you need to
> retain them permanently.




<PlaygroundComponent />

<AuthParams schemes={["basicAuth"]}>
<AuthType scheme="basicAuth">
<ParamField header="Authorization" param-type="string" required="true">
Basic authentication credentials. Base64-encode your credentials in the format `api_key:api_key_secret`
and pass the result in the `Authorization` header:

```http
Authorization: Basic BASE64(api_key:api_key_secret)
```
Generate your API Key and Secret from **Profile → Integrations →
Build with Twenty2 API → Create new**.

</ParamField>
</AuthType>
</AuthParams>

### Query Parameters

<ParamField showLocation="false" query="call_id" param-type="string" required="true" examples-b64="W3sibmFtZSI6ImV4YW1wbGUiLCJ2YWx1ZSI6IjY5OWVkM2I5MWVlNWJlZTM4OWRjYjZhMyJ9XQ==">
The unique ID of the call to retrieve. Obtained from the
[Initiate Call](#operation/initiateCall) response or the
[List Calls](#operation/listCalls) response.

</ParamField>

### Headers

<ParamField showLocation="false" header="x-workspace-id" param-type="string" required="true" examples-b64="W3sibmFtZSI6ImV4YW1wbGUiLCJ2YWx1ZSI6IjY5OWVkM2I5MWVlNWJlZTM4OWRjYjZhMyJ9XQ==">
Your Twenty2 Workspace ID. To find it, click the copy icon next to
**Switch Workspace** at the bottom-left of the platform and select
**Copy workspace ID**.

</ParamField>

<Request tabs="curl,python,javascript,go,ruby">

```bash
curl -X GET "https://api.twentytwo.in/api/call/detail?call_id=699ed3b91ee5bee389dcb6a3" \
  -H "Content-Type: application/json" \
  -H "x-workspace-id: 699ed3b91ee5bee389dcb6a3" \
  -H "Authorization: Basic YOUR_CREDENTIALS"
```

```python
import requests
import json

url = "https://api.twentytwo.in/api/call/detail?call_id=699ed3b91ee5bee389dcb6a3"
headers = {
  "Content-Type": "application/json",
  "x-workspace-id": "699ed3b91ee5bee389dcb6a3",
  "Authorization": "Basic YOUR_CREDENTIALS"
}

response = requests.get(url, headers=headers)
print(response.json())
```

```javascript
const response = await fetch("https://api.twentytwo.in/api/call/detail?call_id=699ed3b91ee5bee389dcb6a3", {
  method: "GET",
  headers: {
  "Content-Type": "application/json",
  "x-workspace-id": "699ed3b91ee5bee389dcb6a3",
  "Authorization": "Basic YOUR_CREDENTIALS"
}
});

const data = await response.json();
console.log(data);
```

```go
package main

import (
    "fmt"
    "net/http"
)

func main() {

    req, err := http.NewRequest("GET", "https://api.twentytwo.in/api/call/detail?call_id=699ed3b91ee5bee389dcb6a3", nil)
    if err != nil {
        panic(err)
    }

    req.Header.Set("Content-Type", "application/json")
    req.Header.Set("x-workspace-id", "699ed3b91ee5bee389dcb6a3")
    req.Header.Set("Authorization", "Basic YOUR_CREDENTIALS")

    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()

    fmt.Println("Response Status:", resp.Status)
}
```

```ruby
require 'net/http'
require 'json'

uri = URI('https://api.twentytwo.in/api/call/detail?call_id=699ed3b91ee5bee389dcb6a3')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true

request = Net::HTTP::Get.new(uri)
request['Content-Type'] = 'application/json'
request['x-workspace-id'] = '699ed3b91ee5bee389dcb6a3'
request['Authorization'] = 'Basic YOUR_CREDENTIALS'

response = http.request(request)
puts response.body
```

</Request>

### Responses

<div data-component="ResponsesCollection"><Expandable title="200 - Full call detail returned successfully." default-open="true">

<ResponseField name="success" field-type="boolean" required="false">

</ResponseField>

<ResponseField name="call" field-type="object" required="false">

<Expandable title="Object Properties" default-open="false">

<ResponseField name="call_id" field-type="string" required="false">
Unique identifier for the call.
</ResponseField>

<ResponseField name="assistant_id" field-type="string" required="false">
ID of the assistant that handled the call.
</ResponseField>

<ResponseField name="status" field-type="string" required="false" enum="initiated,connected,completed,not_connected,failed">
Final status of the call.
</ResponseField>

<ResponseField name="direction" field-type="string" required="false" enum="outbound">

</ResponseField>

<ResponseField name="callee_phone" field-type="string" required="false">
The phone number that was called.
</ResponseField>

<ResponseField name="caller_phone" field-type="string" required="false">
The phone number the call was placed from.
</ResponseField>

<ResponseField name="duration_seconds" field-type="integer" required="false">
Total duration of the call in seconds.
</ResponseField>

<ResponseField name="billed_duration_seconds" field-type="integer" required="false">
Duration used for billing, rounded up to the
nearest 60-second pulse. This is the value used
to calculate `cost`.

</ResponseField>

<ResponseField name="cost" field-type="string" required="false">
Total cost charged for this call.
</ResponseField>

<ResponseField name="started_at" field-type="string" required="false">
ISO 8601 timestamp of when the call connected.
</ResponseField>

<ResponseField name="ended_at" field-type="string" required="false">
ISO 8601 timestamp of when the call ended.
</ResponseField>

<ResponseField name="input_parameters" field-type="object" required="false">
The input variables passed when the call was
triggered. Keys are dynamic and depend on the
Input Variables defined in the assistant's
configuration.

</ResponseField>

<ResponseField name="output_parameters" field-type="object" required="false">
Data captured by the assistant during the call.
Keys are dynamic and depend on the Output
Variables defined in the assistant's
configuration. Values reflect what the customer
said during the conversation.

</ResponseField>

<ResponseField name="recording" field-type="object" required="false">

<Expandable title="Object Properties" default-open="false">

<ResponseField name="url" field-type="string" required="false">
Direct URL to the MP3 recording of the call.
Download before `expires_at`.

</ResponseField>

<ResponseField name="expires_at" field-type="string" required="false">
ISO 8601 timestamp after which the recording
URL expires.

</ResponseField>

</Expandable>
</ResponseField>

<ResponseField name="transcript" field-type="object" required="false">

<Expandable title="Object Properties" default-open="false">

<ResponseField name="url" field-type="string" required="false">
Direct URL to the plain-text transcript.
Download before `expires_at`.

</ResponseField>

<ResponseField name="expires_at" field-type="string" required="false">
ISO 8601 timestamp after which the transcript
URL expires.

</ResponseField>

</Expandable>
</ResponseField>

</Expandable>
</ResponseField>

</Expandable>

</div>

<Response tabs="200">

```json
{
  "success": true,
  "call": {
    "call_id": "call_9c4d7e12ab",
    "assistant_id": "69de483c68b23495c853b43a",
    "status": "completed",
    "direction": "outbound",
    "callee_phone": "9999999999",
    "caller_phone": "9999999999",
    "duration_seconds": 94,
    "billed_duration_seconds": 94,
    "cost": "₹15.67",
    "started_at": "2024-12-25T10:00:00Z",
    "ended_at": "2024-12-25T10:01:34Z",
    "input_parameters": {
      "customerName": "Rohit"
    },
    "output_parameters": {
      "interested": "yes",
      "callback_requested": "yes",
      "callback_time": "Tomorrow 11am"
    },
    "recording": {
      "url": "https://storage.twentytwo.in/recordings/call_9c4d7e12ab.mp3",
      "expires_at": "2025-01-25T10:01:34Z"
    },
    "transcript": {
      "url": "https://storage.twentytwo.in/transcripts/call_9c4d7e12ab.txt",
      "expires_at": "2025-01-25T10:01:34Z"
    }
  }
}
```

</Response>

