Skip to main content
Account Insights answers two questions for a customer: “how is my account doing?” and “what should I do about it?” — as data your UI can render directly, and as a conversational layer on top.
  • GET /customers/{customer_id}/insights — a computed report: a snapshot of balances and obligations, observations about recent activity, and advisory suggestions. No LLM anywhere in this path — every number, date, and sentence is computed deterministically from the customer’s own objects.
  • POST /customers/{customer_id}/insights/chat — an advisory chat that answers questions about the account. The model narrates the same deterministic data the report is built from; it holds no write capability of any kind.
Alpha — part of the agentic early-access surface. Insights are read-only by construction: neither endpoint can move money, create, or change anything.

The report

The report is a view, not a stored object — computed on demand from the customer’s scheduled payments, mandates, recipients, wallets, and balances. There is nothing to create, poll into existence, or clean up.
Three parts:
  • snapshot — typed facts for stat cards: per-wallet balances (aggregated over all the customer’s linked wallets), upcoming-payment totals per asset, open/active counts.
  • insights[] — observations: what is happening.
  • suggestions[] — advice: what the customer may want to do. Always advisory — acting on one is a separate, human-gated step through the normal payment flow.
Both arrays share one item schema: {kind, severity, message, detail, evidence}.

Rendering items

  • severity is a closed set: info | warn | critical. Sort and color by it.
  • kind is an open set — new kinds appear over time without a breaking change. Render an unrecognized kind generically from message + severity; never drop it.
  • message is a complete, human-readable sentence. A minimal UI can show messages alone and be correct.
  • detail carries the raw computed values behind the sentence, for custom rendering.
  • evidence[] contains typed references ({type, id}wallet, scheduled_payment, mandate, recipient; up to 10 per item) to the exact objects the item was computed from — deep-link each claim to the data behind it. evidence.type is open-set like kind.

The kind catalog

A mandate that is exactly on plan — filled by its own scheduled series — stays silent; headroom items fire only on breach or tightness.

Degradation, not errors

A deployment without a balance index simply omits balance-derived parts (snapshot balances, shortfall math); the rest of the report still computes. Missing data degrades the report — it never 500s.

The advisory chat

The chat is stateless: send the running transcript (up to 40 messages) each turn and append the reply. Replies come back as light GitHub-flavored markdown (bold, bullet lists) ready to render.

Where the numbers come from

The model never computes facts. It reads them from deterministic, server-computed tool data: There is no write tool, no propose tool, and no way to pass another customer’s identifiers — the tools are scoped to the path customer by construction. Asked to do something (“pay this invoice”), the assistant declines and points at the payment flow.

Conversation status

conversation_status reports where the conversation stands with the assistant’s scope guard:

Bounds

Requests are validated before any model spend: at most 40 messages, 4,000 characters per message, 64 KB total; empty messages are rejected. Chat turns are rate-limited per customer — 100/hour and 500/day — returning 429 beyond that. The report endpoint is deterministic and carries no chat-specific limit beyond the standard API rate limits.

Report or chat?

Render the report — it is structured, deterministic, and cheap. Add the chat where a customer benefits from asking follow-ups (“why did my payments to Brightline fail?”) — its answers cite the same data the report shows, so the two surfaces always agree.