---
title: "Save the human-agent call wrap-up disposition"
description: "Sets call_logs.call_disposition for the matching call_sid (workspace-scoped) and mirrors the value into structured_outputs.call_disposition so the unified_calls view + Voice AI Human Agent dashboard surface it without a view change. Vocabulary aligns with vapi_call_records.call_disposition (APPOINTMENT_SET, CALLBACK_SCHEDULED, VOICEMAIL_LEFT, NO_ANSWER, NOT_INTERESTED, DO_NOT_CALL_HONORED, ...)."
---

> Documentation Index
> Fetch the complete documentation index at: https://developer.channelautomations.com/llms.txt
> Use this file to discover all available pages before exploring further.

Path: Channel Automation API › Calls

`PUT /api/calls/{callSid}/disposition`

Sets call_logs.call_disposition for the matching call_sid (workspace-scoped) and mirrors the value into structured_outputs.call_disposition so the unified_calls view + Voice AI Human Agent dashboard surface it without a view change. Vocabulary aligns with vapi_call_records.call_disposition (APPOINTMENT_SET, CALLBACK_SCHEDULED, VOICEMAIL_LEFT, NO_ANSWER, NOT_INTERESTED, DO_NOT_CALL_HONORED, ...).

## Path parameters

- `callSid` (`put/api/calls/callSid/disposition.path.callSid`; string, required)

## Request body

_Required._

- `workspace_id` (`put/api/calls/callSid/disposition.workspace_id`; string, required)
- `disposition` (`put/api/calls/callSid/disposition.disposition`; string, required)
- `user_id` (`put/api/calls/callSid/disposition.user_id`; string, optional)
- `cadence_request` (`put/api/calls/callSid/disposition.cadence_request`; object, optional) — Optional manager-approved retry timing; validated atomically for managed calls. Does not change the call result.
  - `wait_minutes` (`put/api/calls/callSid/disposition.cadence_request.wait_minutes`; integer, optional)
    - min 1
  - `retry_at` (`put/api/calls/callSid/disposition.cadence_request.retry_at`; string, optional)
    - format `date-time`
  - `reason` (`put/api/calls/callSid/disposition.cadence_request.reason`; string, optional)
    - maxLength 500
- `callback_at` (`put/api/calls/callSid/disposition.callback_at`; string, optional) — Future promised callback time when disposition is CALLBACK_SCHEDULED.
  - format `date-time`
- `sub_disposition` (`put/api/calls/callSid/disposition.sub_disposition`; string, optional)

## Example request

```json
{
  "workspace_id": "string",
  "disposition": "string",
  "user_id": "string",
  "cadence_request": {
    "wait_minutes": 1,
    "retry_at": "2019-08-24T14:15:22Z",
    "reason": "string"
  },
  "callback_at": "2019-08-24T14:15:22Z",
  "sub_disposition": "string"
}
```

## Code samples

### cURL

```bash
curl --request PUT \
  --url 'https://api.channelautomation.com/api/calls/<callSid>/disposition' \
  --header 'Content-Type: application/json' \
  --data '
{
  "workspace_id": "string",
  "disposition": "string",
  "user_id": "string",
  "cadence_request": {
    "wait_minutes": 1,
    "retry_at": "2019-08-24T14:15:22Z",
    "reason": "string"
  },
  "callback_at": "2019-08-24T14:15:22Z",
  "sub_disposition": "string"
}
'
```

### TypeScript

```typescript
const url = 'https://api.channelautomation.com/api/calls/<callSid>/disposition';
const options = {
  method: 'PUT',
  headers: {'Content-Type': 'application/json'},
  body: JSON.stringify({
    workspace_id: 'string',
    disposition: 'string',
    user_id: 'string',
    cadence_request: {wait_minutes: 1, retry_at: '2019-08-24T14:15:22Z', reason: 'string'},
    callback_at: '2019-08-24T14:15:22Z',
    sub_disposition: 'string'
  })
};

fetch(url, options)
  .then(res => res.json())
  .then(json => console.log(json))
  .catch(err => console.error(err));
```

### Python

```python
import requests

url = "https://api.channelautomation.com/api/calls/<callSid>/disposition"

payload = {
    "workspace_id": "string",
    "disposition": "string",
    "user_id": "string",
    "cadence_request": {
        "wait_minutes": 1,
        "retry_at": "2019-08-24T14:15:22Z",
        "reason": "string"
    },
    "callback_at": "2019-08-24T14:15:22Z",
    "sub_disposition": "string"
}
headers = {"Content-Type": "application/json"}

response = requests.put(url, json=payload, headers=headers)

print(response.text)
```

## Responses

### 200

Disposition saved

### 400

Missing workspace_id or disposition

### 404

No call_logs row for that call_sid in the workspace

### 500

Server error


Source: https://developer.channelautomations.com/api/put-api-calls-call-sid-disposition/index.md
