Outcome types define the vocabulary of customer responses in the platform. Each outcome type has a classification (positive, negative, or neutral) and a category (impression or response). System-default outcome types are auto-seeded on first access.
Base path
List outcome types
GET /api/v1/outcome-types
Returns all outcome types for the current tenant, ordered by ordinal (ascending). If no outcome types exist, the system defaults are automatically seeded.
System defaults
| Key | Name | Classification | Category |
|---|
impression | Impression | neutral | impression |
click | Click | positive | response |
dismiss | Dismiss | negative | response |
accept | Accept | positive | response |
convert | Convert | positive | response |
not_presented | Not Presented | neutral | impression |
requested_info | Requested More Info | positive | response |
not_interested | Not Interested | negative | response |
expired | Expired | neutral | impression |
deferred | Deferred | neutral | response |
Response 200
[
{
"id": "ot_001",
"tenantId": "t_001",
"key": "click",
"name": "Click",
"description": "",
"classification": "positive",
"category": "response",
"isSystem": true,
"ordinal": 1,
"status": "active",
"createdAt": "2026-03-10T12:00:00.000Z",
"updatedAt": "2026-03-10T12:00:00.000Z"
}
]
Create an outcome type
POST /api/v1/outcome-types
Creates a custom outcome type. Custom types have isSystem: false and can be fully edited or deleted.
Request body
| Field | Required | Type | Description |
|---|
key | Yes | string (1-255) | Unique key identifier (e.g., "purchased", "bounced"). |
name | Yes | string (1-255) | Display name. |
description | No | string | Description. Default "". |
classification | No | enum | positive, negative, neutral. Default "neutral". |
category | No | enum | impression, response. Default "response". |
ordinal | No | integer (>= 0) | Sort order. Default 99. |
status | No | enum | draft, active, paused, archived. Default "active". |
Example request
{
"key": "purchased",
"name": "Purchased",
"classification": "positive",
"category": "response",
"ordinal": 10
}
Response 201
Returns the created outcome type object.
Error codes
| Code | Reason |
|---|
400 | Validation error (missing key or name). |
415 | Content-Type is not application/json. |
Update an outcome type
PUT /api/v1/outcome-types
Updates an existing outcome type. Only provided fields are changed.
System outcome types (isSystem: true) only allow editing name, description, and ordinal. The key, classification, and category fields are locked for system types.
Request body
| Field | Required | Type | Description |
|---|
id | Yes | string | The outcome type ID to update. |
key | No | string | Updated key (custom types only). |
name | No | string | Updated display name. |
description | No | string | Updated description. |
classification | No | enum | Updated classification (custom types only). |
category | No | enum | Updated category (custom types only). |
ordinal | No | integer | Updated sort order. |
status | No | enum | Updated status (custom types only). |
Response 200
Returns the updated outcome type object.
Error codes
| Code | Reason |
|---|
400 | Validation error. |
404 | Outcome type not found. |
Delete an outcome type
DELETE /api/v1/outcome-types?id={outcomeTypeId}
Deletes a custom outcome type by ID.
Query parameters
| Parameter | Required | Type | Description |
|---|
id | Yes | string | Outcome type ID to delete. |
Response 204
Empty body on success.
Error codes
| Code | Reason |
|---|
400 | Missing id query parameter. |
403 | Cannot delete system outcome types. |
404 | Outcome type not found. |
Role requirements
| Method | Minimum role |
|---|
| GET | viewer |
| POST | editor |
| PUT | editor |
| DELETE | editor |