Client emails
Client emails endpoints of the Zanfia Workspace API, with schemas and code samples.
One-off, personal e-mails from you to one customer (the customer card’s “Send email”): write a draft, review or edit it, then send it with the send route. This is transactional correspondence, not a campaign, so it goes to the customer’s address regardless of their newsletter subscription; addresses suppressed after a hard bounce or a spam complaint are still skipped by the mailer. Sending is real and cannot be recalled. The sender identity (From name, Reply-To, optional custom From on a verified sending domain) is resolved from your workspace defaults when the draft is created and can be overridden per draft. contentMarkdown is Markdown (max 50 000 chars), subject max 200 chars; branded wraps the e-mail in your branded frame (default: a plain personal note). A sent e-mail is immutable history; a failed hand-off (status: failed, reason in failureReason) stays editable and re-sendable. Refusals carry a machine-readable error (client-not-found, email-not-found, already-sent, invalid-field, no-recipient, send-failed) with the detail in message. All routes require a Authorization: Bearer header — see Authentication.
List client e-mails (workspace feed)
/client-emailsAuthorization
bearerAuth API key from Dashboard → Integrations → API, MCP and CLI.
In: header
Query Parameters
1 <= value <= 500200Response Body
application/json
application/json
curl -X GET "https://example.com/client-emails"{ "emails": [ { "id": "string", "clientId": "string", "recipientEmail": "string", "recipientName": "string", "subject": "string", "contentMarkdown": "string", "sender": { "fromName": "string", "replyTo": "string", "fromEmail": "string" }, "branded": true, "status": "draft", "createdBy": { "kind": "staff", "uid": "string" }, "createdAt": "string", "updatedAt": "string", "sentAt": "string", "failureReason": "string" } ]}{ "error": "string", "message": "string"}List one client's e-mails
/clients/{clientId}/emailsAuthorization
bearerAuth API key from Dashboard → Integrations → API, MCP and CLI.
In: header
Path Parameters
Client id
Response Body
application/json
application/json
curl -X GET "https://example.com/clients/string/emails"{ "emails": [ { "id": "string", "clientId": "string", "recipientEmail": "string", "recipientName": "string", "subject": "string", "contentMarkdown": "string", "sender": { "fromName": "string", "replyTo": "string", "fromEmail": "string" }, "branded": true, "status": "draft", "createdBy": { "kind": "staff", "uid": "string" }, "createdAt": "string", "updatedAt": "string", "sentAt": "string", "failureReason": "string" } ]}{ "error": "string", "message": "string"}Create a client e-mail draft
/clients/{clientId}/emailsAuthorization
bearerAuth API key from Dashboard → Integrations → API, MCP and CLI.
In: header
Path Parameters
Client id
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Subject and body may be empty at draft time; omitted sender fields use the workspace defaults.
Response Body
application/json
application/json
curl -X POST "https://example.com/clients/string/emails" \ -H "Content-Type: application/json" \ -d '{ "subject": "string", "contentMarkdown": "string" }'{ "email": { "id": "string", "clientId": "string", "recipientEmail": "string", "recipientName": "string", "subject": "string", "contentMarkdown": "string", "sender": { "fromName": "string", "replyTo": "string", "fromEmail": "string" }, "branded": true, "status": "draft", "createdBy": { "kind": "staff", "uid": "string" }, "createdAt": "string", "updatedAt": "string", "sentAt": "string", "failureReason": "string" }}{ "error": "string", "message": "string"}Update a client e-mail draft
/clients/{clientId}/emails/{emailId}Authorization
bearerAuth API key from Dashboard → Integrations → API, MCP and CLI.
In: header
Path Parameters
Client id
Client e-mail id
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Drafts and failed hand-offs only; an explicit null clears sender.replyTo / sender.fromEmail.
Response Body
application/json
application/json
curl -X PATCH "https://example.com/clients/string/emails/string" \ -H "Content-Type: application/json" \ -d '{}'{ "email": { "id": "string", "clientId": "string", "recipientEmail": "string", "recipientName": "string", "subject": "string", "contentMarkdown": "string", "sender": { "fromName": "string", "replyTo": "string", "fromEmail": "string" }, "branded": true, "status": "draft", "createdBy": { "kind": "staff", "uid": "string" }, "createdAt": "string", "updatedAt": "string", "sentAt": "string", "failureReason": "string" }}{ "error": "string", "message": "string"}Delete a client e-mail draft
/clients/{clientId}/emails/{emailId}Authorization
bearerAuth API key from Dashboard → Integrations → API, MCP and CLI.
In: header
Path Parameters
Client id
Client e-mail id
Response Body
application/json
application/json
curl -X DELETE "https://example.com/clients/string/emails/string"{ "deleted": true}{ "error": "string", "message": "string"}Send a client e-mail
/clients/{clientId}/emails/{emailId}/sendAuthorization
bearerAuth API key from Dashboard → Integrations → API, MCP and CLI.
In: header
Path Parameters
Client id
Client e-mail id
Response Body
application/json
application/json
curl -X POST "https://example.com/clients/string/emails/string/send"{ "email": { "id": "string", "clientId": "string", "recipientEmail": "string", "recipientName": "string", "subject": "string", "contentMarkdown": "string", "sender": { "fromName": "string", "replyTo": "string", "fromEmail": "string" }, "branded": true, "status": "draft", "createdBy": { "kind": "staff", "uid": "string" }, "createdAt": "string", "updatedAt": "string", "sentAt": "string", "failureReason": "string" }}{ "error": "string", "message": "string"}Was this article helpful?

