> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.sailorhq.io/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.sailorhq.io/_mcp/server.

# Outcomes

> Configure the labels, list movement, and webhook actions agents can apply from the phone system.

Phone-system outcomes define what an agent can apply during or after a call. They are the public configuration surface for call results, Smart List movement, and outcome webhooks.

## Outcome Model

Every outcome has:

| Field              | Purpose                                                                  |
| ------------------ | ------------------------------------------------------------------------ |
| `outcome_name`     | The label shown to agents and sent in webhook payloads.                  |
| `outcome_type`     | `action` for in-call use, or `disposition` for post-call classification. |
| `order`            | Display order. Lower numbers appear first.                               |
| `destination_type` | `none`, `smart_list`, or `remove_from_smart_list`.                       |
| `webhook_url`      | HTTP or HTTPS endpoint Sailor calls for action outcomes.                 |

## List Outcomes

```bash
curl https://api.sailorhq.io/phone-system/outcomes \
  -H "Authorization: Bearer $SAILOR_API_TOKEN"
```

Example response:

```json
{
  "ok": true,
  "outcomes": [
    {
      "outcome_id": "00000000-0000-4000-8000-000000000001",
      "outcome_name": "Interested",
      "outcome_type": "action",
      "order": 10,
      "destination_type": "smart_list",
      "destination": {
        "destination_type": "smart_list",
        "destination_id": "00000000-0000-4000-8000-000000000002",
        "destination_name": "Follow up"
      },
      "webhook_url": "https://example.com/sailor/outcomes",
      "created_at": "2026-06-25T00:00:00.000Z",
      "updated_at": "2026-06-25T00:00:00.000Z"
    }
  ],
  "disposition_popup_enabled": false
}
```

## Create An Action Outcome

Action outcomes are selected during a live call. They require a webhook URL.

```bash
curl https://api.sailorhq.io/phone-system/outcomes \
  -X POST \
  -H "Authorization: Bearer $SAILOR_API_TOKEN" \
  -H "Idempotency-Key: $SAILOR_REQUEST_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "outcome_name": "Interested",
    "outcome_type": "action",
    "order": 10,
    "destination_type": "smart_list",
    "destination_id": "00000000-0000-4000-8000-000000000000",
    "webhook_url": "https://example.com/sailor/outcomes"
  }'
```

## Create A Post-Call Disposition

Disposition outcomes are shown after a call. If at least one disposition exists, Sailor reports `disposition_popup_enabled: true`.

```bash
curl https://api.sailorhq.io/phone-system/outcomes \
  -X POST \
  -H "Authorization: Bearer $SAILOR_API_TOKEN" \
  -H "Idempotency-Key: $SAILOR_REQUEST_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "outcome_name": "Not Qualified",
    "outcome_type": "disposition",
    "order": 20,
    "destination_type": "none"
  }'
```

## Destination Recipes

#### No movement

Use `destination_type: "none"` when the outcome should only record the result and optionally send a webhook.

#### Add to a list

Use `destination_type: "smart_list"` with `destination_id` to add the contacted person to one Smart List.

#### Remove from lists

Use `destination_type: "remove_from_smart_list"` with `remove_from_smart_lists` to clean up membership.

## Remove From Smart Lists

Use `remove_from_smart_list` when an outcome should clean up list membership.

```bash
curl https://api.sailorhq.io/phone-system/outcomes \
  -X POST \
  -H "Authorization: Bearer $SAILOR_API_TOKEN" \
  -H "Idempotency-Key: $SAILOR_REQUEST_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "outcome_name": "Remove from active lists",
    "outcome_type": "action",
    "order": 30,
    "destination_type": "remove_from_smart_list",
    "remove_from_smart_lists": {
      "all": true
    },
    "webhook_url": "https://example.com/sailor/outcomes"
  }'
```

To remove from selected lists, send `list_ids` instead of `all`.

```json
{
  "remove_from_smart_lists": {
    "list_ids": [
      "00000000-0000-4000-8000-000000000010",
      "00000000-0000-4000-8000-000000000011"
    ]
  }
}
```

## Update An Outcome

`PATCH` replaces the outcome configuration with the submitted fields. Send the full intended configuration, not only the one field you changed.

```bash
curl https://api.sailorhq.io/phone-system/outcomes/00000000-0000-4000-8000-000000000001 \
  -X PATCH \
  -H "Authorization: Bearer $SAILOR_API_TOKEN" \
  -H "Idempotency-Key: $SAILOR_REQUEST_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "outcome_name": "Interested - Follow Up",
    "outcome_type": "action",
    "order": 10,
    "destination_type": "smart_list",
    "destination_id": "00000000-0000-4000-8000-000000000002",
    "webhook_url": "https://example.com/sailor/outcomes"
  }'
```

## Delete An Outcome

```bash
curl https://api.sailorhq.io/phone-system/outcomes/00000000-0000-4000-8000-000000000001 \
  -X DELETE \
  -H "Authorization: Bearer $SAILOR_API_TOKEN"
```

## Validation Rules

| Rule                                                                        | Error to expect         |
| --------------------------------------------------------------------------- | ----------------------- |
| `outcome_name` must be 1-120 characters.                                    | `invalid_outcome`       |
| `action` outcomes require `webhook_url`.                                    | `invalid_outcome`       |
| `destination_type: smart_list` requires `destination_id`.                   | `invalid_outcome`       |
| `destination_id` is only allowed with `smart_list`.                         | `invalid_outcome`       |
| `remove_from_smart_lists` is only allowed with `remove_from_smart_list`.    | `invalid_outcome`       |
| `remove_from_smart_lists` must choose either `all` or `list_ids`, not both. | `invalid_outcome`       |
| The target Smart List must exist in the workspace.                          | `destination_not_found` |

Use the [API Reference](/api-reference) for exact field constraints.