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. suggestedColumnId is 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 →