Email Logs API
Email logs record every email that Synapse queues, sends, delivers, or fails to deliver. Each log entry tracks the full lifecycle of an email -- from initial queue through delivery, opens, clicks, and bounces. Use this API to search and inspect email delivery history for your workspace.
For a user guide on viewing email logs in the dashboard, see Email Logs.
Endpoints
| Method | Path | Description |
|---|---|---|
GET | /v1/email-logs | List email logs with filtering and pagination |
GET | /v1/email-logs/stats | Get status breakdown counts |
GET | /v1/email-logs/{log_id} | Get full detail for a single email log |
POST | /v1/email-logs/{log_id}/resend | Re-send a bounced, failed, or suppressed email |
List Email Logs
Auth: JWT (dashboard). Requires logs:read permission.
Query Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
search | string | Search by recipient email, name, or subject (substring match) | |
status | string | Filter by status: queued, sent, delivered, opened, clicked, bounced, complained, failed, suppressed | |
date_from | datetime | Filter from this datetime (ISO 8601) | |
date_to | datetime | Filter until this datetime (ISO 8601) | |
template_id | UUID | Filter by template ID | |
flow_id | UUID | Filter by flow ID | |
page | integer | 1 | Page number (1-indexed) |
per_page | integer | 25 | Items per page (1--100) |
Response
The list endpoint excludes rendered_html for performance. Use the detail endpoint to retrieve the full rendered email body.
Get Email Log Stats
Returns a status breakdown of email log counts. Used for summary cards at the top of the email logs page.
Auth: JWT (dashboard). Requires logs:read permission.
Query Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
date_from | datetime | Filter from this datetime (ISO 8601) | |
date_to | datetime | Filter until this datetime (ISO 8601) |
Response
Get Email Log Detail
Returns the full detail for a single email log, including the rendered HTML body, linked contact info, template name, and flow name.
Auth: JWT (dashboard). Requires logs:read permission.
Response
Error Response (404)
Resend an Email
Re-sends a previously failed delivery using the original rendered content (recipient, subject, and HTML body). A new email log entry is created for the attempt; the original log is never modified.
Auth: JWT (dashboard). Requires logs:read permission.
Only emails with a status of bounced, failed, or suppressed can be resent. Any other status returns 400.
Response
| Field | Type | Description |
|---|---|---|
success | boolean | true if the resend was handed off to the email provider. false if it failed or was suppressed. |
new_log_id | UUID | The email log created for the resend attempt. |
Resending a commercial email re-attaches the CAN-SPAM footer and one-click unsubscribe headers. The footer is applied at send time, so it is re-derived on every resend rather than copied from the original message.
If the original was a commercial email and your workspace has no complete company address, the resend is suppressed: success is false, new_log_id points at a suppressed log, and no email is sent. Complete your company information in Settings → General first. See Email Delivery.
Error Responses
| Status | When |
|---|---|
400 | Status is not bounced, failed, or suppressed, or the original is missing rendered content (recipient, subject, or HTML body). |
404 | Email log not found. |
Email Log Statuses
| Status | Description |
|---|---|
queued | Email has been queued for sending |
sent | Email was handed off to the email provider |
delivered | Provider confirmed delivery to the recipient's mail server |
opened | Recipient opened the email (tracked via pixel) |
clicked | Recipient clicked a link in the email |
bounced | Email bounced (hard bounce -- invalid address, domain does not exist) |
complained | Recipient marked the email as spam. Contact is auto-unsubscribed. |
failed | Email failed to send (Resend-side error, rendering error, etc.) |
suppressed | Email was deliberately not sent. Causes include an NLT required modifier resolving to null, the provider suppression list, or a commercial send blocked by a missing company address (error_message = suppressed:missing_company_address). |