Français
Revue du matin et journal d’envoi
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/review
Lister les brouillons à relire
La file du membre, paginée par curseur, avec le nombre de brouillons vraiment en attente pour la pastille du menu. Filtrable par boîte et par workflow.
Accès — Session de membre ou clé d’API portant review:read.
Paramètres
| Nom | Où | Type | Requis |
|---|---|---|---|
mailboxId | requête | string | non |
workflowId | requête | string | non |
cursor | requête | string | non |
limit | requête | integer | non |
Réponses
200 — Une page de brouillons.
| Champ | Type | Requis |
|---|---|---|
items | object[] | oui |
nextCursor | string | null | oui |
pendingCount | integer | oui |
Schéma JSON
json
{
"type": "object",
"properties": {
"items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": { "type": "string" },
"mailboxId": { "type": "string" },
"mailboxAddress": { "type": "string" },
"mode": { "type": "string", "enum": [ "draft", "send" ] },
"origin": { "type": "string", "enum": [ "workflow", "webmail", "approval" ] },
"recipients": { "type": "array", "items": { "type": "string" } },
"subject": { "type": "string" },
"createdAt": { "type": "string" },
"reviewStatus": {
"type": "string",
"enum": [ "none", "pending", "sent", "rejected", "snoozed", "gone" ]
},
"reviewReason": { "type": "string" },
"reviewAt": { "type": "string" },
"snoozeUntil": { "type": "string" },
"sendStatus": {
"type": "string",
"enum": [
"pending",
"held",
"running",
"done",
"failed",
"cancelled",
"unknown"
]
},
"sendErrorKind": { "type": "string" },
"executionId": { "type": "string" },
"workflowId": { "type": "string" },
"workflowName": { "type": "string" },
"nodeId": { "type": "string" },
"nodeType": { "type": "string" },
"messageIdHeader": { "type": "string" },
"messageId": { "type": "string" },
"threadId": { "type": "string" }
},
"required": [
"id",
"mailboxId",
"mailboxAddress",
"mode",
"origin",
"recipients",
"subject",
"createdAt",
"reviewStatus",
"sendStatus"
],
"additionalProperties": false
}
},
"nextCursor": { "anyOf": [ { "type": "string" }, { "type": "null" } ] },
"pendingCount": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }
},
"required": [ "items", "nextCursor", "pendingCount" ],
"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 — review.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.
GET /api/v1/review/{id}
Aperçu d’un brouillon
Le seul endroit où le corps sort, assaini. Le brouillon d’un autre membre est un 404.
Accès — Session de membre ou clé d’API portant review:read.
Paramètres
| Nom | Où | Type | Requis |
|---|---|---|---|
id | chemin | string | oui |
Réponses
200 — Le brouillon et son corps.
| Champ | Type | Requis |
|---|---|---|
message | object | oui |
cc | string[] | oui |
bcc | string[] | oui |
bodyText | string | non |
bodyHtml | string | non |
hasRemoteImages | boolean | oui |
attachments | object[] | oui |
Schéma JSON
json
{
"type": "object",
"properties": {
"message": {
"type": "object",
"properties": {
"id": { "type": "string" },
"mailboxId": { "type": "string" },
"mailboxAddress": { "type": "string" },
"mode": { "type": "string", "enum": [ "draft", "send" ] },
"origin": { "type": "string", "enum": [ "workflow", "webmail", "approval" ] },
"recipients": { "type": "array", "items": { "type": "string" } },
"subject": { "type": "string" },
"createdAt": { "type": "string" },
"reviewStatus": {
"type": "string",
"enum": [ "none", "pending", "sent", "rejected", "snoozed", "gone" ]
},
"reviewReason": { "type": "string" },
"reviewAt": { "type": "string" },
"snoozeUntil": { "type": "string" },
"sendStatus": {
"type": "string",
"enum": [
"pending",
"held",
"running",
"done",
"failed",
"cancelled",
"unknown"
]
},
"sendErrorKind": { "type": "string" },
"executionId": { "type": "string" },
"workflowId": { "type": "string" },
"workflowName": { "type": "string" },
"nodeId": { "type": "string" },
"nodeType": { "type": "string" },
"messageIdHeader": { "type": "string" },
"messageId": { "type": "string" },
"threadId": { "type": "string" }
},
"required": [
"id",
"mailboxId",
"mailboxAddress",
"mode",
"origin",
"recipients",
"subject",
"createdAt",
"reviewStatus",
"sendStatus"
],
"additionalProperties": false
},
"cc": { "type": "array", "items": { "type": "string" } },
"bcc": { "type": "array", "items": { "type": "string" } },
"bodyText": { "type": "string" },
"bodyHtml": { "type": "string" },
"hasRemoteImages": { "type": "boolean" },
"attachments": {
"type": "array",
"items": {
"type": "object",
"properties": {
"filename": { "type": "string" },
"mime": { "type": "string" },
"size": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }
},
"required": [ "filename", "mime", "size" ],
"additionalProperties": false
}
}
},
"required": [ "message", "cc", "bcc", "hasRemoteImages", "attachments" ],
"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.
Codes d’erreur — review.not_found, review.content_gone. Les codes communs (request.bad_request, auth.unauthenticated, api_key.scope_missing, api_key.rate_limited…) s’appliquent à toutes les routes ; voir Erreurs.
POST /api/v1/review/{id}/send
Envoyer un brouillon relu
Éventuellement corrigé. 202 : l’envoi est enregistré, pas remis ; rien ne part de manière synchrone. Un brouillon déjà envoyé ou rejeté est un 409.
Accès — Session de membre ou clé d’API portant review:write.
Paramètres
| Nom | Où | Type | Requis |
|---|---|---|---|
id | chemin | string | oui |
Corps de la requête (application/json)
| Champ | Type | Requis |
|---|---|---|
clientToken | string | oui |
subject | string | non |
bodyText | string | non |
bodyHtml | string | non |
to | string[] | non |
cc | string[] | non |
bcc | string[] | non |
Schéma JSON
json
{
"type": "object",
"properties": {
"clientToken": { "type": "string", "minLength": 8, "maxLength": 200 },
"subject": { "type": "string", "maxLength": 500 },
"bodyText": { "type": "string", "maxLength": 200000 },
"bodyHtml": { "type": "string", "maxLength": 400000 },
"to": { "maxItems": 100, "type": "array", "items": { "type": "string" } },
"cc": { "maxItems": 100, "type": "array", "items": { "type": "string" } },
"bcc": { "maxItems": 100, "type": "array", "items": { "type": "string" } }
},
"required": [ "clientToken" ]
}Réponses
202 — Le message, en file.
| Champ | Type | Requis |
|---|---|---|
message | object | oui |
opId | string | non |
Schéma JSON
json
{
"type": "object",
"properties": {
"message": {
"type": "object",
"properties": {
"id": { "type": "string" },
"mailboxId": { "type": "string" },
"mailboxAddress": { "type": "string" },
"mode": { "type": "string", "enum": [ "draft", "send" ] },
"origin": { "type": "string", "enum": [ "workflow", "webmail", "approval" ] },
"recipients": { "type": "array", "items": { "type": "string" } },
"subject": { "type": "string" },
"createdAt": { "type": "string" },
"reviewStatus": {
"type": "string",
"enum": [ "none", "pending", "sent", "rejected", "snoozed", "gone" ]
},
"reviewReason": { "type": "string" },
"reviewAt": { "type": "string" },
"snoozeUntil": { "type": "string" },
"sendStatus": {
"type": "string",
"enum": [
"pending",
"held",
"running",
"done",
"failed",
"cancelled",
"unknown"
]
},
"sendErrorKind": { "type": "string" },
"executionId": { "type": "string" },
"workflowId": { "type": "string" },
"workflowName": { "type": "string" },
"nodeId": { "type": "string" },
"nodeType": { "type": "string" },
"messageIdHeader": { "type": "string" },
"messageId": { "type": "string" },
"threadId": { "type": "string" }
},
"required": [
"id",
"mailboxId",
"mailboxAddress",
"mode",
"origin",
"recipients",
"subject",
"createdAt",
"reviewStatus",
"sendStatus"
],
"additionalProperties": false
},
"opId": { "type": "string" }
},
"required": [ "message" ],
"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.
Cette opération accepte un en-tête Idempotency-Key : rejouer la même requête avec la même clé rend la réponse d’origine au lieu d’agir deux fois. Voir Idempotence.
Codes d’erreur — review.bad_request, review.not_found, review.already_resolved, review.content_gone. Les codes communs (request.bad_request, auth.unauthenticated, api_key.scope_missing, api_key.rate_limited…) s’appliquent à toutes les routes ; voir Erreurs.
POST /api/v1/review/send
Envoyer une sélection de brouillons
Jusqu’à cinquante identifiants. 202, avec un verdict par brouillon : celui qui ne peut pas partir ne bloque pas les autres.
Accès — Session de membre ou clé d’API portant review:write.
Corps de la requête (application/json)
| Champ | Type | Requis |
|---|---|---|
ids | string[] | oui |
clientToken | string | oui |
Schéma JSON
json
{
"type": "object",
"properties": {
"ids": {
"minItems": 1,
"maxItems": 50,
"type": "array",
"items": { "type": "string" }
},
"clientToken": { "type": "string", "minLength": 8, "maxLength": 200 }
},
"required": [ "ids", "clientToken" ]
}Réponses
202 — Les verdicts.
| Champ | Type | Requis |
|---|---|---|
sent | integer | oui |
skipped | object[] | oui |
pendingCount | integer | oui |
Schéma JSON
json
{
"type": "object",
"properties": {
"sent": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 },
"skipped": {
"type": "array",
"items": {
"type": "object",
"properties": { "id": { "type": "string" }, "reason": { "type": "string" } },
"required": [ "id", "reason" ],
"additionalProperties": false
}
},
"pendingCount": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }
},
"required": [ "sent", "skipped", "pendingCount" ],
"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.
Cette opération accepte un en-tête Idempotency-Key : rejouer la même requête avec la même clé rend la réponse d’origine au lieu d’agir deux fois. Voir Idempotence.
Codes d’erreur — review.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.
POST /api/v1/review/{id}/reject
Écarter un brouillon
Avec un motif facultatif, conservé dans le journal d’envoi.
Accès — Session de membre ou clé d’API portant review:write.
Paramètres
| Nom | Où | Type | Requis |
|---|---|---|---|
id | chemin | string | oui |
Corps de la requête (application/json)
| Champ | Type | Requis |
|---|---|---|
reason | string | non |
Schéma JSON
json
{
"type": "object",
"properties": { "reason": { "type": "string", "maxLength": 500 } }
}Réponses
200 — Le message, écarté.
| Champ | Type | Requis |
|---|---|---|
message | object | oui |
opId | string | non |
Même schéma que POST /api/v1/review/{id}/send.
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 — review.bad_request, review.not_found, review.already_resolved. Les codes communs (request.bad_request, auth.unauthenticated, api_key.scope_missing, api_key.rate_limited…) s’appliquent à toutes les routes ; voir Erreurs.
POST /api/v1/review/{id}/snooze
Reporter un brouillon
Le brouillon quitte la file jusqu’à until, puis revient.
Accès — Session de membre ou clé d’API portant review:write.
Paramètres
| Nom | Où | Type | Requis |
|---|---|---|---|
id | chemin | string | oui |
Corps de la requête (application/json)
| Champ | Type | Requis |
|---|---|---|
until | string (date-time) | oui |
Schéma JSON
json
{
"type": "object",
"properties": {
"until": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
}
},
"required": [ "until" ]
}Réponses
200 — Le message, reporté.
| Champ | Type | Requis |
|---|---|---|
message | object | oui |
opId | string | non |
Même schéma que POST /api/v1/review/{id}/send.
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 — review.bad_request, review.not_found, review.already_resolved. 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/sending/journal
Lire le journal d’envoi
Tous les messages sortants du membre (workflows, webmail, approbations), paginés par curseur. Filtres : boîte, workflow, mode, statut, recherche dans l’objet et les destinataires, plage de dates.
Accès — Session de membre ou clé d’API portant review:read.
Paramètres
| Nom | Où | Type | Requis |
|---|---|---|---|
mailboxId | requête | string | non |
workflowId | requête | string | non |
mode | requête | "draft" | "send" | non |
status | requête | "none" | "pending" | "sent" | "rejected" | "snoozed" | "gone" | non |
q | requête | string | non |
since | requête | string (date-time) | non |
until | requête | string (date-time) | non |
cursor | requête | string | non |
limit | requête | integer | non |
Réponses
200 — Une page du journal.
| Champ | Type | Requis |
|---|---|---|
items | object[] | oui |
nextCursor | string | null | oui |
Schéma JSON
json
{
"type": "object",
"properties": {
"items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": { "type": "string" },
"mailboxId": { "type": "string" },
"mailboxAddress": { "type": "string" },
"mode": { "type": "string", "enum": [ "draft", "send" ] },
"origin": { "type": "string", "enum": [ "workflow", "webmail", "approval" ] },
"recipients": { "type": "array", "items": { "type": "string" } },
"subject": { "type": "string" },
"createdAt": { "type": "string" },
"reviewStatus": {
"type": "string",
"enum": [ "none", "pending", "sent", "rejected", "snoozed", "gone" ]
},
"reviewReason": { "type": "string" },
"reviewAt": { "type": "string" },
"snoozeUntil": { "type": "string" },
"sendStatus": {
"type": "string",
"enum": [
"pending",
"held",
"running",
"done",
"failed",
"cancelled",
"unknown"
]
},
"sendErrorKind": { "type": "string" },
"executionId": { "type": "string" },
"workflowId": { "type": "string" },
"workflowName": { "type": "string" },
"nodeId": { "type": "string" },
"nodeType": { "type": "string" },
"messageIdHeader": { "type": "string" },
"messageId": { "type": "string" },
"threadId": { "type": "string" }
},
"required": [
"id",
"mailboxId",
"mailboxAddress",
"mode",
"origin",
"recipients",
"subject",
"createdAt",
"reviewStatus",
"sendStatus"
],
"additionalProperties": false
}
},
"nextCursor": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }
},
"required": [ "items", "nextCursor" ],
"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 — review.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.
GET /api/v1/sending/journal.csv
Exporter le journal d’envoi en CSV
Les mêmes filtres, sans cursor ni limit : tout le résultat filtré, en flux et borné à cinquante mille lignes. Servi en pièce jointe.
Accès — Session de membre ou clé d’API portant review:read.
Paramètres
| Nom | Où | Type | Requis |
|---|---|---|---|
mailboxId | requête | string | non |
workflowId | requête | string | non |
mode | requête | "draft" | "send" | non |
status | requête | "none" | "pending" | "sent" | "rejected" | "snoozed" | "gone" | non |
q | requête | string | non |
since | requête | string (date-time) | non |
until | requête | string (date-time) | non |
Réponses
200 — Le fichier CSV.
Type de contenu : text/csv
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 — review.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.