MailSlurp logo

Share and review device renders

Documentation navigation
Search documentation

Share completed email previews, track client-specific feedback and revoke external review links.

View MarkdownAgent setup

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.

POST /emails/device-previews/feedback

Create device preview feedback

Request, parameters, and responses

Request body (required)

FieldTypeRequiredDescription
sourceenum: API_SERVICE | LAB_USER | END_USER | SYSTEMYes
categoryenum: GENERAL | RUN_QUALITY | SCREENSHOT_QUALITY | PROVIDER_ISSUE | BUG_REPORT | FEATURE_REQUESTYes
statusenum: OPEN | ACKNOWLEDGED | RESOLVED | DISMISSEDNo
ratinginteger:int32No
runIdstring:uuidNo
targetIdstring:uuidNo
screenshotIdstring:uuidNo
providerenum: GMAIL | OUTLOOK | YAHOONo
titlestringNo
commentstringNo
internalNotestringNo
sessionIdstringNo
liveViewUrlstringNo
metadatamap<string, string>No
Request example
{
  "source": "API_SERVICE",
  "category": "GENERAL",
  "status": "OPEN",
  "rating": 1,
  "runId": "00000000-0000-4000-8000-000000000000",
  "targetId": "00000000-0000-4000-8000-000000000000"
}

Responses

StatusSchemaDescription
200DevicePreviewFeedbackDtoOK
HTTP and SDK snippets

HTTP

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
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

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

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)
PUT /emails/device-previews/feedback/{feedbackId}

Update device preview feedback

Request, parameters, and responses

Path parameters

NameTypeRequiredDescription
feedbackIdstring:uuidYes

Request body (required)

FieldTypeRequiredDescription
statusenum: OPEN | ACKNOWLEDGED | RESOLVED | DISMISSEDNo
ratinginteger:int32No
titlestringNo
commentstringNo
internalNotestringNo
appendInternalNotebooleanNo
sessionIdstringNo
liveViewUrlstringNo
metadatamap<string, string>No
Request example
{
  "status": "OPEN",
  "rating": 1,
  "title": "value",
  "comment": "value",
  "internalNote": "value",
  "appendInternalNote": true
}

Responses

StatusSchemaDescription
200DevicePreviewFeedbackDtoOK
HTTP and SDK snippets

HTTP

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
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

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

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.

DELETE /emails/device-previews/share-links/{shareLinkId}

Revoke a device preview share link

Request, parameters, and responses

Path parameters

NameTypeRequiredDescription
shareLinkIdstring:uuidYes

Responses

StatusSchemaDescription
200DeleteDevicePreviewShareLinkResultOK
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.