Français
Tableau de bord
Les routes sont relatives à <PUBLIC_BASE_URL> ; les corps de requête et de réponse sont en JSON sauf mention contraire. L’authentification, les portées, la pagination et le format des erreurs sont décrits dans les guides de l’API REST.
GET /api/v1/dashboard/executions
Tableau de bord : exécutions
Volumes, taux de réussite, série par statut, workflows les plus actifs et les plus en échec, derniers échecs. scope=org et memberId sont réservés aux administrateurs ; les séries suivent le tz du lecteur.
Accès — Session de membre ou clé d’API portant dashboard:read.
Paramètres
| Nom | Où | Type | Requis |
|---|---|---|---|
scope | requête | "me" | "org" | non |
period | requête | "24h" | "7d" | "30d" | "custom" | non |
from | requête | string (date-time) | non |
to | requête | string (date-time) | non |
tz | requête | string | non |
mailboxId | requête | string (uuid) | non |
workflowId | requête | string (uuid) | non |
memberId | requête | string (uuid) | non |
Réponses
200 — Les chiffres.
| Champ | Type | Requis |
|---|---|---|
window | object | oui |
current | object | oui |
previous | object | oui |
series | object[] | oui |
topWorkflows | object[] | oui |
failingWorkflows | object[] | oui |
recentFailures | object[] | oui |
Schéma JSON
json
{
"type": "object",
"properties": {
"window": {
"type": "object",
"properties": {
"from": { "type": "string" },
"to": { "type": "string" },
"previousFrom": { "type": "string" },
"bucket": { "type": "string", "enum": [ "hour", "day" ] },
"buckets": { "type": "array", "items": { "type": "string" } }
},
"required": [ "from", "to", "previousFrom", "bucket", "buckets" ],
"additionalProperties": false
},
"current": {
"type": "object",
"properties": {
"total": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 },
"byStatus": {
"type": "array",
"items": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"queued",
"running",
"waiting",
"succeeded",
"failed",
"cancelled"
]
},
"count": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }
},
"required": [ "status", "count" ],
"additionalProperties": false
}
},
"successRate": {
"anyOf": [
{ "type": "number", "minimum": 0, "maximum": 1 },
{ "type": "null" }
]
},
"medianDurationMs": { "anyOf": [ { "type": "number", "minimum": 0 }, { "type": "null" } ] }
},
"required": [ "total", "byStatus", "successRate", "medianDurationMs" ],
"additionalProperties": false
},
"previous": {
"type": "object",
"properties": {
"total": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 },
"byStatus": {
"type": "array",
"items": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"queued",
"running",
"waiting",
"succeeded",
"failed",
"cancelled"
]
},
"count": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }
},
"required": [ "status", "count" ],
"additionalProperties": false
}
},
"successRate": {
"anyOf": [
{ "type": "number", "minimum": 0, "maximum": 1 },
{ "type": "null" }
]
},
"medianDurationMs": { "anyOf": [ { "type": "number", "minimum": 0 }, { "type": "null" } ] }
},
"required": [ "total", "byStatus", "successRate", "medianDurationMs" ],
"additionalProperties": false
},
"series": {
"type": "array",
"items": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"queued",
"running",
"waiting",
"succeeded",
"failed",
"cancelled"
]
},
"values": {
"type": "array",
"items": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }
}
},
"required": [ "status", "values" ],
"additionalProperties": false
}
},
"topWorkflows": {
"type": "array",
"items": {
"type": "object",
"properties": {
"workflowId": { "type": "string" },
"name": { "type": "string" },
"memberName": { "anyOf": [ { "type": "string" }, { "type": "null" } ] },
"total": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 },
"succeeded": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 },
"failed": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 },
"lastRunAt": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }
},
"required": [
"workflowId",
"name",
"memberName",
"total",
"succeeded",
"failed",
"lastRunAt"
],
"additionalProperties": false
}
},
"failingWorkflows": {
"type": "array",
"items": {
"type": "object",
"properties": {
"workflowId": { "type": "string" },
"name": { "type": "string" },
"memberName": { "anyOf": [ { "type": "string" }, { "type": "null" } ] },
"total": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 },
"succeeded": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 },
"failed": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 },
"lastRunAt": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }
},
"required": [
"workflowId",
"name",
"memberName",
"total",
"succeeded",
"failed",
"lastRunAt"
],
"additionalProperties": false
}
},
"recentFailures": {
"type": "array",
"items": {
"type": "object",
"properties": {
"executionId": { "type": "string" },
"workflowId": { "type": "string" },
"workflowName": { "type": "string" },
"memberName": { "anyOf": [ { "type": "string" }, { "type": "null" } ] },
"failedAt": { "type": "string" },
"errorCode": { "type": "string" },
"errorSummary": { "type": "string" },
"nodeId": { "anyOf": [ { "type": "string" }, { "type": "null" } ] },
"nodeName": { "anyOf": [ { "type": "string" }, { "type": "null" } ] },
"acknowledged": { "type": "boolean" }
},
"required": [
"executionId",
"workflowId",
"workflowName",
"memberName",
"failedAt",
"errorCode",
"errorSummary",
"nodeId",
"nodeName",
"acknowledged"
],
"additionalProperties": false
}
}
},
"required": [
"window",
"current",
"previous",
"series",
"topWorkflows",
"failingWorkflows",
"recentFailures"
],
"additionalProperties": false
}400 — La requête ne respecte pas son schéma.
401 — Aucune session ni clé d’API valide (auth.unauthenticated).
403 — Refusé : rôle insuffisant (auth.forbidden), portée manquante (api_key.scope_missing, details.required la nomme) ou route fermée aux clés (api_key.session_required).
429 — La clé d’API dépasse son débit (api_key.rate_limited) ; Retry-After dit quand réessayer.
Codes d’erreur — dashboard.bad_request, dashboard.forbidden. Les codes communs (request.bad_request, auth.unauthenticated, api_key.scope_missing, api_key.rate_limited…) s’appliquent à toutes les routes ; voir Erreurs.
GET /api/v1/dashboard/mail
Tableau de bord : courrier
Mails reçus par issue, automatisés, et sortants, sur la période.
Accès — Session de membre ou clé d’API portant dashboard:read.
Paramètres
| Nom | Où | Type | Requis |
|---|---|---|---|
scope | requête | "me" | "org" | non |
period | requête | "24h" | "7d" | "30d" | "custom" | non |
from | requête | string (date-time) | non |
to | requête | string (date-time) | non |
tz | requête | string | non |
mailboxId | requête | string (uuid) | non |
workflowId | requête | string (uuid) | non |
memberId | requête | string (uuid) | non |
Réponses
200 — Les chiffres.
| Champ | Type | Requis |
|---|---|---|
window | object | oui |
current | object | oui |
previous | object | oui |
series | object | oui |
Schéma JSON
json
{
"type": "object",
"properties": {
"window": {
"type": "object",
"properties": {
"from": { "type": "string" },
"to": { "type": "string" },
"previousFrom": { "type": "string" },
"bucket": { "type": "string", "enum": [ "hour", "day" ] },
"buckets": { "type": "array", "items": { "type": "string" } }
},
"required": [ "from", "to", "previousFrom", "bucket", "buckets" ],
"additionalProperties": false
},
"current": {
"type": "object",
"properties": {
"received": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 },
"byOutcome": {
"type": "array",
"items": {
"type": "object",
"properties": {
"outcome": {
"type": "string",
"enum": [
"excluded_org",
"excluded_member",
"guardrail",
"unmatched",
"dispatched"
]
},
"count": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }
},
"required": [ "outcome", "count" ],
"additionalProperties": false
}
},
"automatedEmails": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 },
"draftsPrepared": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 },
"sentByWorkflows": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }
},
"required": [
"received",
"byOutcome",
"automatedEmails",
"draftsPrepared",
"sentByWorkflows"
],
"additionalProperties": false
},
"previous": {
"type": "object",
"properties": {
"received": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 },
"byOutcome": {
"type": "array",
"items": {
"type": "object",
"properties": {
"outcome": {
"type": "string",
"enum": [
"excluded_org",
"excluded_member",
"guardrail",
"unmatched",
"dispatched"
]
},
"count": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }
},
"required": [ "outcome", "count" ],
"additionalProperties": false
}
},
"automatedEmails": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 },
"draftsPrepared": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 },
"sentByWorkflows": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }
},
"required": [
"received",
"byOutcome",
"automatedEmails",
"draftsPrepared",
"sentByWorkflows"
],
"additionalProperties": false
},
"series": {
"type": "object",
"properties": {
"received": {
"type": "array",
"items": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }
},
"dispatched": {
"type": "array",
"items": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }
}
},
"required": [ "received", "dispatched" ],
"additionalProperties": false
}
},
"required": [ "window", "current", "previous", "series" ],
"additionalProperties": false
}400 — La requête ne respecte pas son schéma.
401 — Aucune session ni clé d’API valide (auth.unauthenticated).
403 — Refusé : rôle insuffisant (auth.forbidden), portée manquante (api_key.scope_missing, details.required la nomme) ou route fermée aux clés (api_key.session_required).
429 — La clé d’API dépasse son débit (api_key.rate_limited) ; Retry-After dit quand réessayer.
Codes d’erreur — dashboard.bad_request, dashboard.forbidden. Les codes communs (request.bad_request, auth.unauthenticated, api_key.scope_missing, api_key.rate_limited…) s’appliquent à toutes les routes ; voir Erreurs.
GET /api/v1/dashboard/ai
Tableau de bord : coût de l’IA
La dépense d’IA, ventilée par modèle, usage et membre.
Accès — Session de membre ou clé d’API portant dashboard:read.
Paramètres
| Nom | Où | Type | Requis |
|---|---|---|---|
scope | requête | "me" | "org" | non |
period | requête | "24h" | "7d" | "30d" | "custom" | non |
from | requête | string (date-time) | non |
to | requête | string (date-time) | non |
tz | requête | string | non |
mailboxId | requête | string (uuid) | non |
workflowId | requête | string (uuid) | non |
memberId | requête | string (uuid) | non |
Réponses
200 — Les chiffres.
| Champ | Type | Requis |
|---|---|---|
window | object | oui |
current | object | oui |
previous | object | oui |
series | number[] | oui |
byModel | object[] | oui |
byPurpose | object[] | oui |
byMember | object[] | null | oui |
Schéma JSON
json
{
"type": "object",
"properties": {
"window": {
"type": "object",
"properties": {
"from": { "type": "string" },
"to": { "type": "string" },
"previousFrom": { "type": "string" },
"bucket": { "type": "string", "enum": [ "hour", "day" ] },
"buckets": { "type": "array", "items": { "type": "string" } }
},
"required": [ "from", "to", "previousFrom", "bucket", "buckets" ],
"additionalProperties": false
},
"current": {
"type": "object",
"properties": {
"costUsd": { "type": "number", "minimum": 0 },
"calls": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 },
"tokensIn": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 },
"tokensOut": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }
},
"required": [ "costUsd", "calls", "tokensIn", "tokensOut" ],
"additionalProperties": false
},
"previous": {
"type": "object",
"properties": {
"costUsd": { "type": "number", "minimum": 0 },
"calls": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 },
"tokensIn": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 },
"tokensOut": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }
},
"required": [ "costUsd", "calls", "tokensIn", "tokensOut" ],
"additionalProperties": false
},
"series": { "type": "array", "items": { "type": "number", "minimum": 0 } },
"byModel": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": { "type": "string" },
"label": { "anyOf": [ { "type": "string" }, { "type": "null" } ] },
"provider": { "anyOf": [ { "type": "string" }, { "type": "null" } ] },
"costUsd": { "type": "number", "minimum": 0 },
"calls": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }
},
"required": [ "key", "label", "provider", "costUsd", "calls" ],
"additionalProperties": false
}
},
"byPurpose": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": { "type": "string" },
"label": { "anyOf": [ { "type": "string" }, { "type": "null" } ] },
"provider": { "anyOf": [ { "type": "string" }, { "type": "null" } ] },
"costUsd": { "type": "number", "minimum": 0 },
"calls": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }
},
"required": [ "key", "label", "provider", "costUsd", "calls" ],
"additionalProperties": false
}
},
"byMember": {
"anyOf": [
{
"type": "array",
"items": {
"type": "object",
"properties": {
"key": { "type": "string" },
"label": { "anyOf": [ { "type": "string" }, { "type": "null" } ] },
"provider": { "anyOf": [ { "type": "string" }, { "type": "null" } ] },
"costUsd": { "type": "number", "minimum": 0 },
"calls": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }
},
"required": [ "key", "label", "provider", "costUsd", "calls" ],
"additionalProperties": false
}
},
{ "type": "null" }
]
}
},
"required": [
"window",
"current",
"previous",
"series",
"byModel",
"byPurpose",
"byMember"
],
"additionalProperties": false
}400 — La requête ne respecte pas son schéma.
401 — Aucune session ni clé d’API valide (auth.unauthenticated).
403 — Refusé : rôle insuffisant (auth.forbidden), portée manquante (api_key.scope_missing, details.required la nomme) ou route fermée aux clés (api_key.session_required).
429 — La clé d’API dépasse son débit (api_key.rate_limited) ; Retry-After dit quand réessayer.
Codes d’erreur — dashboard.bad_request, dashboard.forbidden. Les codes communs (request.bad_request, auth.unauthenticated, api_key.scope_missing, api_key.rate_limited…) s’appliquent à toutes les routes ; voir Erreurs.
GET /api/v1/dashboard/health
Tableau de bord : santé
Boîtes en erreur et connexions à renouveler.
Accès — Session de membre ou clé d’API portant dashboard:read.
Paramètres
| Nom | Où | Type | Requis |
|---|---|---|---|
scope | requête | "me" | "org" | non |
period | requête | "24h" | "7d" | "30d" | "custom" | non |
from | requête | string (date-time) | non |
to | requête | string (date-time) | non |
tz | requête | string | non |
mailboxId | requête | string (uuid) | non |
workflowId | requête | string (uuid) | non |
memberId | requête | string (uuid) | non |
Réponses
200 — Les chiffres.
| Champ | Type | Requis |
|---|---|---|
mailboxes | object[] | oui |
connections | object[] | oui |
connectionsToRenew | integer | oui |
Schéma JSON
json
{
"type": "object",
"properties": {
"mailboxes": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": { "type": "string" },
"address": { "type": "string" },
"provider": { "type": "string" },
"status": { "type": "string", "enum": [ "active", "disconnected", "error" ] },
"memberName": { "anyOf": [ { "type": "string" }, { "type": "null" } ] },
"errorKind": { "anyOf": [ { "type": "string" }, { "type": "null" } ] },
"errorAt": { "anyOf": [ { "type": "string" }, { "type": "null" } ] },
"backfillDone": { "type": "boolean" }
},
"required": [
"id",
"address",
"provider",
"status",
"memberName",
"errorKind",
"errorAt",
"backfillDone"
],
"additionalProperties": false
}
},
"connections": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": { "type": "string" },
"name": { "type": "string" },
"type": { "type": "string" },
"status": { "type": "string", "enum": [ "expired", "revoked" ] },
"ownerName": { "anyOf": [ { "type": "string" }, { "type": "null" } ] },
"updatedAt": { "type": "string" }
},
"required": [ "id", "name", "type", "status", "ownerName", "updatedAt" ],
"additionalProperties": false
}
},
"connectionsToRenew": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }
},
"required": [ "mailboxes", "connections", "connectionsToRenew" ],
"additionalProperties": false
}400 — La requête ne respecte pas son schéma.
401 — Aucune session ni clé d’API valide (auth.unauthenticated).
403 — Refusé : rôle insuffisant (auth.forbidden), portée manquante (api_key.scope_missing, details.required la nomme) ou route fermée aux clés (api_key.session_required).
429 — La clé d’API dépasse son débit (api_key.rate_limited) ; Retry-After dit quand réessayer.
Codes d’erreur — dashboard.bad_request, dashboard.forbidden. Les codes communs (request.bad_request, auth.unauthenticated, api_key.scope_missing, api_key.rate_limited…) s’appliquent à toutes les routes ; voir Erreurs.
GET /api/v1/dashboard/members
Tableau de bord : membres
Activité par membre. Administrateurs seulement, en portée org.
Accès — Session de membre ou clé d’API portant dashboard:read.
Paramètres
| Nom | Où | Type | Requis |
|---|---|---|---|
scope | requête | "me" | "org" | non |
period | requête | "24h" | "7d" | "30d" | "custom" | non |
from | requête | string (date-time) | non |
to | requête | string (date-time) | non |
tz | requête | string | non |
mailboxId | requête | string (uuid) | non |
workflowId | requête | string (uuid) | non |
memberId | requête | string (uuid) | non |
Réponses
200 — Les chiffres.
| Champ | Type | Requis |
|---|---|---|
window | object | oui |
total | integer | oui |
active | integer | oui |
suspended | integer | oui |
items | object[] | oui |
Schéma JSON
json
{
"type": "object",
"properties": {
"window": {
"type": "object",
"properties": {
"from": { "type": "string" },
"to": { "type": "string" },
"previousFrom": { "type": "string" },
"bucket": { "type": "string", "enum": [ "hour", "day" ] },
"buckets": { "type": "array", "items": { "type": "string" } }
},
"required": [ "from", "to", "previousFrom", "bucket", "buckets" ],
"additionalProperties": false
},
"total": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 },
"active": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 },
"suspended": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 },
"items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"memberId": { "type": "string" },
"name": { "type": "string" },
"email": { "type": "string" },
"role": { "type": "string", "enum": [ "member", "admin" ] },
"status": { "type": "string", "enum": [ "active", "suspended" ] },
"lastSeenAt": { "anyOf": [ { "type": "string" }, { "type": "null" } ] },
"executions": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 },
"failed": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 },
"costUsd": { "type": "number", "minimum": 0 }
},
"required": [
"memberId",
"name",
"email",
"role",
"status",
"lastSeenAt",
"executions",
"failed",
"costUsd"
],
"additionalProperties": false
}
}
},
"required": [ "window", "total", "active", "suspended", "items" ],
"additionalProperties": false
}400 — La requête ne respecte pas son schéma.
401 — Aucune session ni clé d’API valide (auth.unauthenticated).
403 — Refusé : rôle insuffisant (auth.forbidden), portée manquante (api_key.scope_missing, details.required la nomme) ou route fermée aux clés (api_key.session_required).
429 — La clé d’API dépasse son débit (api_key.rate_limited) ; Retry-After dit quand réessayer.
Codes d’erreur — dashboard.bad_request, dashboard.forbidden. Les codes communs (request.bad_request, auth.unauthenticated, api_key.scope_missing, api_key.rate_limited…) s’appliquent à toutes les routes ; voir Erreurs.
GET /api/v1/dashboard/todo
Tableau de bord : ce qui m’attend
Approbations en attente, brouillons à relire, incidents ouverts. Toujours personnel : aucun filtre.
Accès — Session de membre ou clé d’API portant dashboard:read.
Réponses
200 — Les éléments en attente.
| Champ | Type | Requis |
|---|---|---|
approvalsPending | integer | oui |
reviewPending | integer | oui |
incidentsUnacknowledged | integer | oui |
items | object[] | oui |
Schéma JSON
json
{
"type": "object",
"properties": {
"approvalsPending": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 },
"reviewPending": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 },
"incidentsUnacknowledged": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 },
"items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"kind": { "type": "string", "enum": [ "approval", "review", "incident" ] },
"id": { "type": "string" },
"title": { "type": "string" },
"workflowName": { "anyOf": [ { "type": "string" }, { "type": "null" } ] },
"workflowId": { "anyOf": [ { "type": "string" }, { "type": "null" } ] },
"executionId": { "anyOf": [ { "type": "string" }, { "type": "null" } ] },
"at": { "type": "string" }
},
"required": [
"kind",
"id",
"title",
"workflowName",
"workflowId",
"executionId",
"at"
],
"additionalProperties": false
}
}
},
"required": [ "approvalsPending", "reviewPending", "incidentsUnacknowledged", "items" ],
"additionalProperties": false
}401 — Aucune session ni clé d’API valide (auth.unauthenticated).
403 — Refusé : rôle insuffisant (auth.forbidden), portée manquante (api_key.scope_missing, details.required la nomme) ou route fermée aux clés (api_key.session_required).
429 — La clé d’API dépasse son débit (api_key.rate_limited) ; Retry-After dit quand réessayer.
GET /api/v1/dashboard/options
Tableau de bord : options des filtres
Les boîtes, workflows et membres qu’un filtre peut nommer. members est vide en portée me.
Accès — Session de membre ou clé d’API portant dashboard:read.
Paramètres
| Nom | Où | Type | Requis |
|---|---|---|---|
scope | requête | "me" | "org" | non |
Réponses
200 — Les options.
| Champ | Type | Requis |
|---|---|---|
mailboxes | object[] | oui |
workflows | object[] | oui |
members | object[] | oui |
Schéma JSON
json
{
"type": "object",
"properties": {
"mailboxes": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": { "type": "string" },
"label": { "type": "string" },
"memberName": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }
},
"required": [ "id", "label", "memberName" ],
"additionalProperties": false
}
},
"workflows": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": { "type": "string" },
"label": { "type": "string" },
"memberName": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }
},
"required": [ "id", "label", "memberName" ],
"additionalProperties": false
}
},
"members": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": { "type": "string" },
"label": { "type": "string" },
"memberName": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }
},
"required": [ "id", "label", "memberName" ],
"additionalProperties": false
}
}
},
"required": [ "mailboxes", "workflows", "members" ],
"additionalProperties": false
}400 — La requête ne respecte pas son schéma.
401 — Aucune session ni clé d’API valide (auth.unauthenticated).
403 — Refusé : rôle insuffisant (auth.forbidden), portée manquante (api_key.scope_missing, details.required la nomme) ou route fermée aux clés (api_key.session_required).
429 — La clé d’API dépasse son débit (api_key.rate_limited) ; Retry-After dit quand réessayer.
Codes d’erreur — dashboard.bad_request, dashboard.forbidden. Les codes communs (request.bad_request, auth.unauthenticated, api_key.scope_missing, api_key.rate_limited…) s’appliquent à toutes les routes ; voir Erreurs.
GET /api/v1/dashboard/layout
Lire ma disposition du tableau de bord
isDefault vaut vrai tant que le membre n’a rien enregistré : la disposition est alors celle de son rôle.
Accès — Session de membre ou clé d’API portant dashboard:read.
Réponses
200 — La disposition.
| Champ | Type | Requis |
|---|---|---|
widgets | object[] | oui |
minutesPerEmail | number | oui |
isDefault | boolean | oui |
Schéma JSON
json
{
"type": "object",
"properties": {
"widgets": {
"maxItems": 11,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"enum": [
"todo",
"executionsKpis",
"executionsTrend",
"recentFailures",
"topWorkflows",
"mailFlow",
"timeSaved",
"mailboxHealth",
"connections",
"aiCost",
"members"
]
},
"visible": { "type": "boolean" }
},
"required": [ "id", "visible" ],
"additionalProperties": false
}
},
"minutesPerEmail": { "type": "number", "minimum": 0, "maximum": 120 },
"isDefault": { "type": "boolean" }
},
"required": [ "widgets", "minutesPerEmail", "isDefault" ],
"additionalProperties": false
}401 — Aucune session ni clé d’API valide (auth.unauthenticated).
403 — Refusé : rôle insuffisant (auth.forbidden), portée manquante (api_key.scope_missing, details.required la nomme) ou route fermée aux clés (api_key.session_required).
429 — La clé d’API dépasse son débit (api_key.rate_limited) ; Retry-After dit quand réessayer.
PUT /api/v1/dashboard/layout
Enregistrer ma disposition du tableau de bord
Les widgets, leur ordre et leur visibilité, et l’hypothèse de minutes par mail. Les widgets réservés aux administrateurs sont écartés pour les autres membres.
Accès — Session de membre ou clé d’API portant dashboard:write.
Corps de la requête (application/json)
| Champ | Type | Requis |
|---|---|---|
widgets | object[] | oui |
minutesPerEmail | number | oui |
Schéma JSON
json
{
"type": "object",
"properties": {
"widgets": {
"maxItems": 11,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"enum": [
"todo",
"executionsKpis",
"executionsTrend",
"recentFailures",
"topWorkflows",
"mailFlow",
"timeSaved",
"mailboxHealth",
"connections",
"aiCost",
"members"
]
},
"visible": { "type": "boolean" }
},
"required": [ "id", "visible" ]
}
},
"minutesPerEmail": { "type": "number", "minimum": 0, "maximum": 120 }
},
"required": [ "widgets", "minutesPerEmail" ]
}Réponses
200 — La disposition, enregistrée.
| Champ | Type | Requis |
|---|---|---|
widgets | object[] | oui |
minutesPerEmail | number | oui |
isDefault | boolean | oui |
Même schéma que GET /api/v1/dashboard/layout.
400 — La requête ne respecte pas son schéma.
401 — Aucune session ni clé d’API valide (auth.unauthenticated).
403 — Refusé : rôle insuffisant (auth.forbidden), portée manquante (api_key.scope_missing, details.required la nomme) ou route fermée aux clés (api_key.session_required).
429 — La clé d’API dépasse son débit (api_key.rate_limited) ; Retry-After dit quand réessayer.
Codes d’erreur — dashboard.bad_request. Les codes communs (request.bad_request, auth.unauthenticated, api_key.scope_missing, api_key.rate_limited…) s’appliquent à toutes les routes ; voir Erreurs.
DELETE /api/v1/dashboard/layout
Réinitialiser ma disposition du tableau de bord
Retour à la disposition du rôle. La rend.
Accès — Session de membre ou clé d’API portant dashboard:write.
Réponses
200 — La disposition par défaut.
| Champ | Type | Requis |
|---|---|---|
widgets | object[] | oui |
minutesPerEmail | number | oui |
isDefault | boolean | oui |
Même schéma que GET /api/v1/dashboard/layout.
401 — Aucune session ni clé d’API valide (auth.unauthenticated).
403 — Refusé : rôle insuffisant (auth.forbidden), portée manquante (api_key.scope_missing, details.required la nomme) ou route fermée aux clés (api_key.session_required).
429 — La clé d’API dépasse son débit (api_key.rate_limited) ; Retry-After dit quand réessayer.