Share and review device renders
Documentation navigation
Share completed email previews, track client-specific feedback and revoke external review links.
Open a run's screenshots to review layout, images, typography and actions across clients. Start with the targets most important to your audience, then investigate differences using the same delivered email.
Compare and comment
Use compare mode for two clients in a run or a previous run after a template change. Attach a comment to the whole run for general feedback, or to the target and screenshot when the issue is specific to one client. Resolve a comment after checking the replacement evidence; reopen it if the issue returns.
See the dashboard review walkthrough for the controls and API example.
/emails/device-previews/feedback
Create device preview feedback
Request, parameters, and responses
Request body (required)
| Field | Type | Required | Description |
|---|---|---|---|
source | enum: API_SERVICE | LAB_USER | END_USER | SYSTEM | Yes | |
category | enum: GENERAL | RUN_QUALITY | SCREENSHOT_QUALITY | PROVIDER_ISSUE | BUG_REPORT | FEATURE_REQUEST | Yes | |
status | enum: OPEN | ACKNOWLEDGED | RESOLVED | DISMISSED | No | |
rating | integer:int32 | No | |
runId | string:uuid | No | |
targetId | string:uuid | No | |
screenshotId | string:uuid | No | |
provider | enum: GMAIL | OUTLOOK | YAHOO | No | |
title | string | No | |
comment | string | No | |
internalNote | string | No | |
sessionId | string | No | |
liveViewUrl | string | No | |
metadata | map<string, string> | No |
{
"source": "API_SERVICE",
"category": "GENERAL",
"status": "OPEN",
"rating": 1,
"runId": "00000000-0000-4000-8000-000000000000",
"targetId": "00000000-0000-4000-8000-000000000000"
}
Responses
| Status | Schema | Description |
|---|---|---|
200 | DevicePreviewFeedbackDto | OK |
HTTP and SDK snippets
HTTP
POST /emails/device-previews/feedback HTTP/1.1
Host: api.mailslurp.com
x-api-key: YOUR_API_KEY
Accept: application/json
Content-Type: application/json
{
"source": "API_SERVICE",
"category": "GENERAL",
"status": "OPEN",
"rating": 1,
"runId": "00000000-0000-4000-8000-000000000000",
"targetId": "00000000-0000-4000-8000-000000000000"
}
cURL
curl -X POST "https://api.mailslurp.com/emails/device-previews/feedback" \
-H "x-api-key: YOUR_API_KEY" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
--data '{"source":"API_SERVICE","category":"GENERAL","status":"OPEN","rating":1,"runId":"00000000-0000-4000-8000-000000000000","targetId":"00000000-0000-4000-8000-000000000000"}'
JavaScript SDK
import { Configuration, DevicePreviewsControllerApi } from "mailslurp-client";
const config = new Configuration({ apiKey: "YOUR_API_KEY" });
const devicePreviewsController = new DevicePreviewsControllerApi(config);
const request = {
"createDevicePreviewFeedbackOptions": {
"source": "API_SERVICE",
"category": "GENERAL",
"status": "OPEN",
"rating": 1,
"runId": "00000000-0000-4000-8000-000000000000",
"targetId": "00000000-0000-4000-8000-000000000000"
}
};
const result = await devicePreviewsController.createDevicePreviewFeedback(request);
Python SDK
import mailslurp_client
from mailslurp_client.api.device_previews_controller_api import DevicePreviewsControllerApi
configuration = mailslurp_client.Configuration()
configuration.api_key["x-api-key"] = "YOUR_API_KEY"
with mailslurp_client.ApiClient(configuration) as api_client:
devicePreviewsController = DevicePreviewsControllerApi(api_client)
create_device_preview_feedback_options = {
"source": "API_SERVICE",
"category": "GENERAL",
"status": "OPEN",
"rating": 1,
"runId": "00000000-0000-4000-8000-000000000000",
"targetId": "00000000-0000-4000-8000-000000000000"
}
result = devicePreviewsController.create_device_preview_feedback(create_device_preview_feedback_options)
/emails/device-previews/feedback/{feedbackId}
Update device preview feedback
Request, parameters, and responses
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
feedbackId | string:uuid | Yes |
Request body (required)
| Field | Type | Required | Description |
|---|---|---|---|
status | enum: OPEN | ACKNOWLEDGED | RESOLVED | DISMISSED | No | |
rating | integer:int32 | No | |
title | string | No | |
comment | string | No | |
internalNote | string | No | |
appendInternalNote | boolean | No | |
sessionId | string | No | |
liveViewUrl | string | No | |
metadata | map<string, string> | No |
{
"status": "OPEN",
"rating": 1,
"title": "value",
"comment": "value",
"internalNote": "value",
"appendInternalNote": true
}
Responses
| Status | Schema | Description |
|---|---|---|
200 | DevicePreviewFeedbackDto | OK |
HTTP and SDK snippets
HTTP
PUT /emails/device-previews/feedback/00000000-0000-4000-8000-000000000000 HTTP/1.1
Host: api.mailslurp.com
x-api-key: YOUR_API_KEY
Accept: application/json
Content-Type: application/json
{
"status": "OPEN",
"rating": 1,
"title": "value",
"comment": "value",
"internalNote": "value",
"appendInternalNote": true
}
cURL
curl -X PUT "https://api.mailslurp.com/emails/device-previews/feedback/00000000-0000-4000-8000-000000000000" \
-H "x-api-key: YOUR_API_KEY" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
--data '{"status":"OPEN","rating":1,"title":"value","comment":"value","internalNote":"value","appendInternalNote":true}'
JavaScript SDK
import { Configuration, DevicePreviewsControllerApi } from "mailslurp-client";
const config = new Configuration({ apiKey: "YOUR_API_KEY" });
const devicePreviewsController = new DevicePreviewsControllerApi(config);
const request = {
"feedbackId": "00000000-0000-4000-8000-000000000000",
"updateDevicePreviewFeedbackOptions": {
"status": "OPEN",
"rating": 1,
"title": "value",
"comment": "value",
"internalNote": "value",
"appendInternalNote": true
}
};
const result = await devicePreviewsController.updateDevicePreviewFeedback(request);
Python SDK
import mailslurp_client
from mailslurp_client.api.device_previews_controller_api import DevicePreviewsControllerApi
configuration = mailslurp_client.Configuration()
configuration.api_key["x-api-key"] = "YOUR_API_KEY"
with mailslurp_client.ApiClient(configuration) as api_client:
devicePreviewsController = DevicePreviewsControllerApi(api_client)
update_device_preview_feedback_options = {
"status": "OPEN",
"rating": 1,
"title": "value",
"comment": "value",
"internalNote": "value",
"appendInternalNote": True
}
result = devicePreviewsController.update_device_preview_feedback("00000000-0000-4000-8000-000000000000", update_device_preview_feedback_options)
Share with a reviewer
Create a share link when someone needs to see the result without your API key. Inspect the shared view before distributing it, especially if the source email contains customer information. Use synthetic campaign data for public examples.
// Create a share link, then read public image URLs from the shared result.
const shareLink = await mailslurp.devicePreviewsController.createDevicePreviewShareLink({
runId,
createDevicePreviewShareLinkOptions: {
label: "Device render example share link",
},
});
const shareLinks = await mailslurp.devicePreviewsController.getDevicePreviewShareLinks({
runId,
});
const sharedResult = await mailslurp.devicePreviewsController.getDevicePreviewSharedResult({
shareToken: shareLink.token,
});
const publicImageUrls = sharedResult.screenshots
.map((screenshot) => screenshot.imageUrl)
.filter(Boolean);
const publicScreenshotImage =
await mailslurp.devicePreviewsController.getDevicePreviewSharedResultScreenshot({
shareToken: shareLink.token,
screenshotId: sharedResult.screenshots[0].screenshotId,
});
This uses the mailslurp client and runId from the render workflow. List existing share links to avoid unnecessary duplicates. Revoke a link when external access is no longer needed.
/emails/device-previews/share-links/{shareLinkId}
Revoke a device preview share link
Request, parameters, and responses
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
shareLinkId | string:uuid | Yes |
Responses
| Status | Schema | Description |
|---|---|---|
200 | DeleteDevicePreviewShareLinkResult | OK |
HTTP and SDK snippets
Notify the team
Connect Slack or Microsoft Teams through device preview notifications, select the run events and send a test notification. A notification that rendering completed is the start of review; it is not an approval of the email's design.
Before approving the send, review Email Audit for content findings and inbox placement for provider folder outcomes. Keep the review tied to the final campaign revision.