---
title: "List valid call disposition values (system + this org's custom)"
method: GET
path: "/workflows/dispositions"
tags: ["Workflows"]
---

# List valid call disposition values (system + this org's custom)

`GET /workflows/dispositions`

## Request

- Base URL: `https://be.graph8.com/api/v1`
- URL: `https://be.graph8.com/api/v1/workflows/dispositions`
- Auth: HTTP bearer

Return every disposition value accepted by ``disposition_filters`` on the
``new_call_disposition`` trigger - system values AND the caller org's own
custom dispositions.

Each entry carries ``origin``: ``system`` for the built-in vocabulary,
``custom`` for an org-defined one (whose ``value`` is the stored
``custom_{id}`` key, never the display name). ``category`` keeps its
existing meaning: ``sdr_selectable`` a rep can pick it, ``system_set`` only
the dialer backend writes it.

Authority for the system half is voice's ``SDR_SELECTABLE_DISPOSITIONS``
(``voice/graph8_livekit/schemas/dispositions.py``) plus the two system-set
values the dialer also emits (``sdr_hangup``, ``failed``). That half is
inlined here and a parity test
(``developer_api/tests/test_workflow_dispositions.py``) fails the build if
voice adds a value that is not mirrored - the previous "mirror the change
here" comment was not enforced and silently went stale when ``busy`` was
added.

The custom half comes from voice's ``GET /api/dialer/dispositions/{org_id}``,
with the org pinned server-side from the authenticated caller and echoed in
the ``X-Org-Id`` header voice's tenant gate requires. Nothing about the
request body or query can influence which org is read.

Degraded mode: if voice is unreachable or errors, this returns the system
vocabulary alone with ``source='static_fallback'`` and logs a warning,
rather than failing the whole call. An agent that sees
``source='static_fallback'`` should say it could not confirm custom
dispositions instead of asserting none exist.

Legacy aliases (``positive``/``neutral``/``negative``) are deliberately
absent: ``normalize_disposition`` rewrites them before storage, so a filter
on them could never match.

## Headers

- `Authorization` string, nullable
- `X-Target-Org-Id` string, nullable

## Response `200`

Successful Response

- object

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/graph8/apis/graph8-developer-api.md) · [All operations](https://skmtc.dev/graph8/apis/graph8-developer-api/llms.txt) · [OpenAPI document](https://skmtc.dev/graph8/apis/graph8-developer-api/revisions/2e7cfa0ca921?raw)
