Skip to content

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

NomOùTypeRequis
mailboxIdrequêtestringnon
workflowIdrequêtestringnon
cursorrequêtestringnon
limitrequêteintegernon

Réponses

200 — Une page de brouillons.

ChampTypeRequis
itemsobject[]oui
nextCursorstring | nulloui
pendingCountintegeroui
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

NomOùTypeRequis
idcheminstringoui

Réponses

200 — Le brouillon et son corps.

ChampTypeRequis
messageobjectoui
ccstring[]oui
bccstring[]oui
bodyTextstringnon
bodyHtmlstringnon
hasRemoteImagesbooleanoui
attachmentsobject[]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

NomOùTypeRequis
idcheminstringoui

Corps de la requête (application/json)

ChampTypeRequis
clientTokenstringoui
subjectstringnon
bodyTextstringnon
bodyHtmlstringnon
tostring[]non
ccstring[]non
bccstring[]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.

ChampTypeRequis
messageobjectoui
opIdstringnon
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)

ChampTypeRequis
idsstring[]oui
clientTokenstringoui
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.

ChampTypeRequis
sentintegeroui
skippedobject[]oui
pendingCountintegeroui
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

NomOùTypeRequis
idcheminstringoui

Corps de la requête (application/json)

ChampTypeRequis
reasonstringnon
Schéma JSON
json
{
  "type": "object",
  "properties": { "reason": { "type": "string", "maxLength": 500 } }
}

Réponses

200 — Le message, écarté.

ChampTypeRequis
messageobjectoui
opIdstringnon

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

NomOùTypeRequis
idcheminstringoui

Corps de la requête (application/json)

ChampTypeRequis
untilstring (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é.

ChampTypeRequis
messageobjectoui
opIdstringnon

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

NomOùTypeRequis
mailboxIdrequêtestringnon
workflowIdrequêtestringnon
moderequête"draft" | "send"non
statusrequête"none" | "pending" | "sent" | "rejected" | "snoozed" | "gone"non
qrequêtestringnon
sincerequêtestring (date-time)non
untilrequêtestring (date-time)non
cursorrequêtestringnon
limitrequêteintegernon

Réponses

200 — Une page du journal.

ChampTypeRequis
itemsobject[]oui
nextCursorstring | nulloui
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

NomOùTypeRequis
mailboxIdrequêtestringnon
workflowIdrequêtestringnon
moderequête"draft" | "send"non
statusrequête"none" | "pending" | "sent" | "rejected" | "snoozed" | "gone"non
qrequêtestringnon
sincerequêtestring (date-time)non
untilrequêtestring (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.