Outcome boards
Read where calls landed, and move a contact to record an outcome from your own system.
Every campaign, and every inbound agent, has an outcome board: columns such as Interested, Callback, Won, Not interested, and one card per contact. After each call, the contact’s card is sorted into a column automatically. When the sorting isn’t confident, the card is marked needs_review.
The same endpoints work for both kinds of board. Use /v1/campaigns/:id/… with campaigns:* scopes, or /v1/agents/:id/… (an inbound agent) with agents:* scopes.
Get a board
GET /v1/campaigns/:id/board · scope campaigns:read
GET /v1/agents/:id/board · scope agents:read
{
"data": {
"boardId": "brd_…",
"columns": [
{ "id": "col_…", "name": "New", "key": "new", "type": "new", "count": 312 },
{ "id": "col_…", "name": "Interested", "key": "interested", "type": "advancing", "count": 48 },
{ "id": "col_…", "name": "Paid", "key": "paid", "type": "won", "count": 21 }
]
}
}
type is what the column means: new, open, advancing, won, lost, dnc (do not call), or no_contact.
List a column’s cards
GET /v1/campaigns/:id/board/cards?column=… · scope campaigns:read
GET /v1/agents/:id/board/cards?column=… · scope agents:read
Newest arrivals first. Pass nextCursor back as cursor for the next page (null on the last).
{
"data": [
{
"id": "card_…", "contactId": "bor_…", "contactName": "Asha", "contactPhone": "+9190…", "columnId": "col_…",
"status": "placed", "confidence": 0.92, "suggestedColumnId": null,
"lastCallId": "call_…", "lastCallAt": "…", "lastSummary": "Agreed to pay by Friday.", "attentionReason": null,
"enteredColumnAt": "…"
}
],
"nextCursor": "…"
}
status: "needs_review"- the card was sorted automatically without much confidence.suggestedColumnIdis where it would go.attentionReason- why the last call needs a person (until someone moves the card).
Move a card
PATCH /v1/campaigns/:id/board/cards/:cardId · scope campaigns:write
PATCH /v1/agents/:id/board/cards/:cardId · scope agents:write
{ "columnId": "col_…" }
Records an outcome your own system knows about (the customer paid, a deal closed). It’s the same as dragging the card in the console: it clears needs_review and runs the column’s automations. Returns the moved card.
400 column_not_on_board if the column belongs to another board. 404 if the card isn’t on this board. 403 plan_feature_locked if outcome boards are turned off for your workspace.
Next: Knowledge bases →