curl --request GET \
--url https://api.platform.dakota.xyz/insights \
--header 'x-api-key: <api-key>'const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://api.platform.dakota.xyz/insights', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.platform.dakota.xyz/insights"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.platform.dakota.xyz/insights"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"generated_at": 1788337300,
"window_days": 14,
"snapshot": {
"customers": {
"total": 42,
"scanned": 42,
"with_activity": 17,
"with_critical": 2
},
"total_usd": "1284500.00",
"upcoming": {
"days": 14,
"count": 31,
"totals": {
"USDC": "412600"
}
},
"open_scheduled_payments": 44,
"active_mandates": 57,
"metrics": [
{
"key": "executed_volume",
"label": "Executed volume",
"asset": "USDC",
"value": "861200",
"previous": "702300",
"change_pct": "22.6"
},
{
"key": "failed_payments",
"label": "Payments failed",
"value": "9",
"previous": "3",
"change_pct": "200.0"
}
]
},
"series": {
"bucket": "day",
"from": 1787097600,
"to": 1789516800,
"metrics": {
"failed_payments": [
{
"t": 1787097600,
"v": "0"
},
{
"t": 1787184000,
"v": "3"
}
],
"executed_volume.USDC": [
{
"t": 1787097600,
"v": "41200"
},
{
"t": 1787184000,
"v": "63800"
}
]
}
},
"facets": {
"kinds": [
"mandate_expiring",
"payment_failures_clustered",
"recipient_dormant"
],
"severities": [
"info",
"warn"
],
"responsibilities": [
"compliance",
"payment_ops"
],
"assets": [
"USDC"
]
},
"insights": [
{
"kind": "payment_failures_clustered",
"severity": "warn",
"responsibility": "payment_ops",
"message": "7 payments across 2 customers failed in the last 14 days with the same failure code: mandate_denied (e.g. \"transaction denied by mandate: amount 5000 exceeds max_per_tx 2500\").",
"detail": {
"count": 7,
"window_days": 14,
"failure_code": "mandate_denied",
"failure_reason": "transaction denied by mandate: amount 5000 exceeds max_per_tx 2500",
"docs_url": "https://docs.dakota.xyz/documentation/agentic-payments/webhooks#failure_code-reference",
"customer_ids": [
"2vWxCustomer0000000000000000",
"2vWxCustomer0000000000000001"
]
},
"evidence": [
{
"type": "scheduled_payment",
"id": "2vWxPayment00000000000000000"
}
]
},
{
"kind": "recipient_dormant",
"severity": "info",
"responsibility": "compliance",
"customer_id": "2vWxCustomer0000000000000000",
"message": "Recipient \"Northwind Ltd\" hasn't been paid in 123 days (last payment 2026-05-02, 14 payment(s) before that).",
"detail": {
"recipient_id": "2vWxRecipient000000000000000",
"recipient_name": "Northwind Ltd",
"days_since_last_use": 123,
"last_used_at": 1777500000,
"prior_payments": 14
},
"evidence": [
{
"type": "recipient",
"id": "2vWxRecipient000000000000000"
}
]
}
],
"suggestions": [
{
"kind": "mandate_expiring",
"severity": "warn",
"responsibility": "payment_ops",
"customer_id": "2vWxCustomer0000000000000000",
"message": "Mandate for USDC on base expires in 6 day(s) (2026-09-07). 3 open scheduled payment(s) depend on it. Mandates are immutable — a replacement needs a new signature.",
"detail": {
"mandate_id": "2vWxMandate00000000000000000",
"days_left": 6,
"valid_until": 1788855700,
"dependent_payments": 3
},
"evidence": [
{
"type": "mandate",
"id": "2vWxMandate00000000000000000"
}
]
}
],
"customers": [
{
"customer_id": "2vWxCustomer0000000000000000",
"name": "Acme Robotics",
"total_usd": "84200.00",
"open_scheduled_payments": 6,
"active_mandates": 4,
"upcoming": {
"days": 14,
"count": 5,
"totals": {
"USDC": "9400"
}
},
"item_counts": {
"critical": 1,
"warn": 1,
"info": 1
},
"last_activity_at": 1788310000
}
]
}{
"type": "https://docs.dakota.xyz/api-reference/errors#invalid-identifier",
"title": "Invalid Identifier",
"status": 400,
"detail": "invalid customer id"
}{
"type": "https://docs.dakota.xyz/api-reference/errors#not-found",
"title": "Not Found",
"status": 404,
"detail": "agentic payments are not enabled"
}Get the client-level portfolio insight report (BETA)
Beta — early access.
The client-scope companion of the customer insight report: one deterministic, read-only report over ALL of the caller’s customers’ agentic activity. Observations (insights) and advisory recommendations (suggestions) reuse the customer report’s item schema — {kind, severity, message, detail, evidence} — with two additive fields at this scope: customer_id attributes an item to one customer (omitted on cross-customer aggregates, which list the affected customers in detail), and responsibility is a coarse grouping label (payment_ops / compliance) for filtering only — it carries no ownership semantics. On top of the items the report adds dashboard-shaped data: KPI metrics with previous-window values for trend deltas, daily time series for charts, and a per-customer roll-up (customers) for drill-down. All query filters are optional and only narrow the report; the response shape never changes. kind remains an OPEN set; clients must ignore kinds they do not recognize. Every number is computed server-side on read; nothing is stored, and nothing here moves money or changes state.
curl --request GET \
--url https://api.platform.dakota.xyz/insights \
--header 'x-api-key: <api-key>'const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://api.platform.dakota.xyz/insights', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.platform.dakota.xyz/insights"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.platform.dakota.xyz/insights"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"generated_at": 1788337300,
"window_days": 14,
"snapshot": {
"customers": {
"total": 42,
"scanned": 42,
"with_activity": 17,
"with_critical": 2
},
"total_usd": "1284500.00",
"upcoming": {
"days": 14,
"count": 31,
"totals": {
"USDC": "412600"
}
},
"open_scheduled_payments": 44,
"active_mandates": 57,
"metrics": [
{
"key": "executed_volume",
"label": "Executed volume",
"asset": "USDC",
"value": "861200",
"previous": "702300",
"change_pct": "22.6"
},
{
"key": "failed_payments",
"label": "Payments failed",
"value": "9",
"previous": "3",
"change_pct": "200.0"
}
]
},
"series": {
"bucket": "day",
"from": 1787097600,
"to": 1789516800,
"metrics": {
"failed_payments": [
{
"t": 1787097600,
"v": "0"
},
{
"t": 1787184000,
"v": "3"
}
],
"executed_volume.USDC": [
{
"t": 1787097600,
"v": "41200"
},
{
"t": 1787184000,
"v": "63800"
}
]
}
},
"facets": {
"kinds": [
"mandate_expiring",
"payment_failures_clustered",
"recipient_dormant"
],
"severities": [
"info",
"warn"
],
"responsibilities": [
"compliance",
"payment_ops"
],
"assets": [
"USDC"
]
},
"insights": [
{
"kind": "payment_failures_clustered",
"severity": "warn",
"responsibility": "payment_ops",
"message": "7 payments across 2 customers failed in the last 14 days with the same failure code: mandate_denied (e.g. \"transaction denied by mandate: amount 5000 exceeds max_per_tx 2500\").",
"detail": {
"count": 7,
"window_days": 14,
"failure_code": "mandate_denied",
"failure_reason": "transaction denied by mandate: amount 5000 exceeds max_per_tx 2500",
"docs_url": "https://docs.dakota.xyz/documentation/agentic-payments/webhooks#failure_code-reference",
"customer_ids": [
"2vWxCustomer0000000000000000",
"2vWxCustomer0000000000000001"
]
},
"evidence": [
{
"type": "scheduled_payment",
"id": "2vWxPayment00000000000000000"
}
]
},
{
"kind": "recipient_dormant",
"severity": "info",
"responsibility": "compliance",
"customer_id": "2vWxCustomer0000000000000000",
"message": "Recipient \"Northwind Ltd\" hasn't been paid in 123 days (last payment 2026-05-02, 14 payment(s) before that).",
"detail": {
"recipient_id": "2vWxRecipient000000000000000",
"recipient_name": "Northwind Ltd",
"days_since_last_use": 123,
"last_used_at": 1777500000,
"prior_payments": 14
},
"evidence": [
{
"type": "recipient",
"id": "2vWxRecipient000000000000000"
}
]
}
],
"suggestions": [
{
"kind": "mandate_expiring",
"severity": "warn",
"responsibility": "payment_ops",
"customer_id": "2vWxCustomer0000000000000000",
"message": "Mandate for USDC on base expires in 6 day(s) (2026-09-07). 3 open scheduled payment(s) depend on it. Mandates are immutable — a replacement needs a new signature.",
"detail": {
"mandate_id": "2vWxMandate00000000000000000",
"days_left": 6,
"valid_until": 1788855700,
"dependent_payments": 3
},
"evidence": [
{
"type": "mandate",
"id": "2vWxMandate00000000000000000"
}
]
}
],
"customers": [
{
"customer_id": "2vWxCustomer0000000000000000",
"name": "Acme Robotics",
"total_usd": "84200.00",
"open_scheduled_payments": 6,
"active_mandates": 4,
"upcoming": {
"days": 14,
"count": 5,
"totals": {
"USDC": "9400"
}
},
"item_counts": {
"critical": 1,
"warn": 1,
"info": 1
},
"last_activity_at": 1788310000
}
]
}{
"type": "https://docs.dakota.xyz/api-reference/errors#invalid-identifier",
"title": "Invalid Identifier",
"status": 400,
"detail": "invalid customer id"
}{
"type": "https://docs.dakota.xyz/api-reference/errors#not-found",
"title": "Not Found",
"status": 404,
"detail": "agentic payments are not enabled"
}Authorizations
Query Parameters
Scope the whole report to one customer (drill-down). An unknown or foreign customer is a 404, mirroring the customer report.
Keep only items whose evidence references this wallet.
Keep only items of these kinds (comma-separated, e.g. kind=volume_anomaly,recipient_dormant; open set — an unrecognized value simply matches nothing).
Keep only items of these severities (comma-separated, e.g. severity=critical,warn). Values are info, warn, critical; anything else is a 400.
Keep only items carrying one of these grouping labels (comma-separated).
Report window in days — the lookback for trends/series and the horizon for upcoming obligations.
1 <= x <= 90Response
The client's portfolio insight report
The deterministic, read-only portfolio insight report for the calling client. Computed on demand across the client's own customers (never cross-tenant); nothing is stored.
Typed FACTS about the client's whole book — rendered directly, not narrated. total_usd covers indexed funding-wallet balances and is present only when the balance index is configured; it degrades to absent, never to an error. balances (per wallet × asset) is present only when the report is scoped to one customer (?customer_id=), so a drill-down can show that customer's holdings overall, by asset and by wallet.
Show child attributes
Show child attributes
The values present in the report BEFORE the item filters (kind, severity, responsibility) were applied — so a UI can offer every option a client could pick even while a filter is active. assets are the assets moving in the window (metrics + series).
Show child attributes
Show child attributes
Daily time series for charts. Map keys are an OPEN set named <metric> for counts and <metric>.<ASSET> for amounts — emitted today: executed_payments, failed_payments, executed_volume.<ASSET> (lookback over the report window) and upcoming_obligations.<ASSET> (forward-looking: open payments due per day from now through the next window_days; an OVERDUE open payment is not plotted here — it is counted in snapshot.upcoming, which spans everything due through the horizon, and surfaces as a payment_at_risk item). Clients must ignore keys they do not recognize.
Show child attributes
Show child attributes
Observations across the book (always present, possibly empty).
Show child attributes
Show child attributes
Advisory recommendations (always present, possibly empty). Non-binding — acting on one is a separate, human-gated step.
Show child attributes
Show child attributes
Per-customer roll-up for the drill-down table, sorted worst-first (critical count, then warn, then activity).
Show child attributes
Show child attributes
Was this page helpful?

