API reference
Emails
API endpoints for sending and fetching emails on Waypoint.
Send an email with a template
Send an email message through a Waypoint template. Data variables are used to populate the template.
Request
/v1/email_messages
Parameter | Description |
---|---|
templateId | Required The id of the template you want to send (created on the Waypoint dashboard). You can find the template ID from on each template from your templates page or grab it from the template URL. eg. wptemplate_ABc123XYZ |
to | Required Email address of the receiver(s). It can be an email address or use the “Display Name <email address>” format (this will also set the ‘name’ field on your contacts). Separate multiple email addresses in comma separated string for multiple emails (eg. “joe@example.com, jane@example.com”). Max 50 recipients per message. |
variables | Template variables JSON. |
from | Email address of the sender. This will override a sender that has been set from the template builder and the email domain must be a verified domain within your workspace. Email address can be a string or with a name with email using the “Display Name <email address>” format. |
replyTo | Email address where replies will be sent. By default, replies are sent to the original sender’s email address. |
cc | Email address of the receiver(s) that should be CC’d. Use the same format as ‘to’ attribute. |
bcc | Email address of the receiver(s) that should be BCC’d. Use the same format as ‘to’ attribute. |
metaId | ID used for idempotent requests or internal reference. Eg. ‘order_1234’. |
attachments | Array of attachment objects with ‘name’ (filename), ‘contentBlob’ (Base64-encoded string), and ‘contentType’ (MIME content type). |
groupId | Unsubscribe group ID |
groupKey | Unsubscribe group custom key |
const axios = require('axios');
axios({ method: "post", url: "https://live.waypointapi.com/v1/email_messages", headers: { "Content-Type": "application/json" }, auth: { username: API_KEY_USERNAME, password: API_KEY_PASSWORD }, data: { "templateId": "wptemplate_ABc123XYZ", "to": "jordan@usewaypoint.com", "variables": { "user": { "displayName": "Jordan", } "product": { "title": "Beechers Mac & Cheese", "id": "02934203942" } } }}).then(function (response) { console.log(response);}).catch(function (error) { console.log(error);})
curl "https://live.waypointapi.com/v1/email_messages" \ -H "Content-Type: application/json" \ -u "API_KEY_USERNAME:API_KEY_PASSWORD" \ -d '{ "templateId": "wptemplate_ABc123XYZ", "to": "jordan@usewaypoint.com", "variables": { "user": { "displayName": "Jordan" }, "product": { "title": "Beechers Mac & Cheese", "id": "02934203942" } }}'
Send an email without a template
Send an email message without a template by passing in the raw HTML body content.
Request
/v1/email_messages
Parameter | Description |
---|---|
bodyHtml | Required HTML body content. |
bodyText | Plain text body content. |
subject | Subject line of the email. |
to | Required Email address of the receiver(s). It can be an email address or use the “Display Name <email address>” format (this will also set the ‘name’ field on your contacts). Separate multiple email addresses in comma separated string for multiple emails (eg. “joe@example.com, jane@example.com”). Max 50 recipients per message. |
from | Required Email address of the sender. The email domain must be a verified domain within your workspace. It can be an email address string or with a name with email using the “Display Name <email address>” format. |
replyTo | Email address where replies will be sent. By default, replies are sent to the original sender’s email address. |
cc | Email address of the receiver(s) that should be CC’d. Use the same format as ‘to’ attribute. |
bcc | Email address of the receiver(s) that should be BCC’d. Use the same format as ‘to’ attribute. |
metaId | ID used for idempotent requests or internal reference. Eg. ‘order_1234’. |
attachments | Array of attachment objects with ‘name’ (filename), ‘contentBlob’ (Base64-encoded string), and ‘contentType’ (MIME content type). Learn more. |
Send a test email
Test emails can be sent from your application’s dev/test environments by including sandbox in the path of the API call.
Emails sent with this sandbox flag will prevent the actual delivery of the email to the address in the ‘to’ field and the resulting email inputs and outputs will simply be stored on the your workspace’s activity logs for debugging and review.
Request
/v1/sandbox/email_messages
This sandbox endpoint the same properties as v1/email_messages
const axios = require('axios');
axios({ method: "post", url: "https://live.waypointapi.com/v1/sandbox/email_messages", headers: { "Content-Type": "application/json" }, auth: { username: API_KEY_USERNAME, password: API_KEY_PASSWORD }, data: { "templateId": "wptemplate_ABc123XYZ", "to": "jordan@usewaypoint.com", "variables": { "user": { "displayName": "Jordan", } "product": { "title": "Beechers Mac & Cheese", "id": "02934203942" } } }}).then(function (response) { console.log(response);}).catch(function (error) { console.log(error);})
curl "https://live.waypointapi.com/v1/sandbox/email_messages" \ -H "Content-Type: application/json" \ -u "API_KEY_USERNAME:API_KEY_PASSWORD" \ -d '{ "templateId": "wptemplate_ABc123XYZ", "to": "jordan@usewaypoint.com", "variables": { "user": { "displayName": "Jordan" }, "product": { "title": "Beechers Mac & Cheese", "id": "02934203942" } }}'
Retrieve an email
Get the details of an email message with it’s delivery statuses and other metadata.
Request
/v1/email_messages/:id
Parameter | Description |
---|---|
id | Waypoint email message ID |
axios({ method: 'get', url: 'https://live.waypointapi.com/v1/email_messages/em_2HxzWrrkPo4V4cXR', headers: { 'Content-Type': 'application/json' }, auth: { username: API_KEY_USERNAME, password: API_KEY_PASSWORD },}).then(function(response) { console.log(response);}).catch(function(error) { console.log(error);})
curl "https://live.waypointapi.com/v1/email_messages/em_2HxzWrrkPo4V4cXR" \-H "Content-Type: application/json" \-u "API_KEY_USERNAME:API_KEY_PASSWORD"
Response
Property | Description |
---|---|
ID | The Waypoint message ID. |
type | The type of the message. |
createdAt | Timestamp of when the message was created. |
updatedAt | Timestamp of when the message was last updated. |
source | How the message was created: PREVIEW , API , SANDBOX_API , WORKFLOW , SANDBOX_WORKFLOW , BATCH , SANDBOX_BATCH . |
status | Message status: PENDING , SUCCEEDED , PAUSED , FAILED , DELETED . |
processedAt | Timestamp of when the message was processed. |
waypointTemplateId | The associated template ID if sent with a template. |
variables | Object with any template variables that were passed in while triggering the email. |
referenceId | ID used by AWS for processing this email. |
to | Array of email addresses the message was sent to. |
cc | Array of email addresses that were CC’d on this message. |
bcc | Array of email addresses that were BCC’d on this message. |
from | ’From’ email address set for this message. |
replyTo | ’Reply-To’ email address set for this message. |
sentAt | Timestamp for when the message was sent by Waypoint. |
deliveredAt | Timestamp for when the message was first received by the recipient’s email server. |
firstOpenedAt | Timestamp for when the message was first opened. |
lastOpenedAt | Timestamp for when the message was last opened. |
firstClickedAt | Timestamp for when a link in the message was first clicked. |
lastClickedAt | Timestamp for when a link in the message was last clicked. |
firstComplainedAt | Timestamp for when the message first received a complaint. |
lastComplainedAt | Timestamp for when the message last received a complaint. |
firstBouncedAt | Timestamp for when the message first received a bounce. |
lastBouncedAt | Timestamp for when the message last received a bounce. |
erroredAt | Timestamp for when the message encountered an error and didn’t send. |
lastSuppressedAt | Timestamp for when the message was suppressed by an unsubscribe group. |
lastUnsubscribedAt | Timestamp for when a contact unsubscribed from a message unsubscribe group link. |
{ "data": { "id": "em_2HxzWrrkPo4V4cXR", "type": "EmailMessage", "createdAt": "2024-12-31T14:58:36.962Z", "updatedAt": "2024-12-31T15:19:51.765Z", "source": "API", "status": "SUCCEEDED", "processedAt": null, "waypointTemplateId": "wptemplate_WVWNrT7e2yFhnnMv", "referenceId": "01000194f6256585-c87d8117-1bb5-4f96-88f9-d5e2baba55e0-000000", "variables": { "message": "hello world" }, "to": [ "\"Carlos Rodriguez\" <carlos@usewaypoint.com>" ], "cc": [], "bcc": [], "from": "Waypoint <support@usewaypoint.com>", "replyTo": "", "sentAt": "2024-12-31T14:58:43.781Z", "deliveredAt": "2024-12-31T14:58:45.076Z", "firstOpenedAt": "2024-12-31T14:58:45.727Z", "lastOpenedAt": "2024-12-31T15:19:51.609Z", "firstClickedAt": null, "lastClickedAt": null, "firstComplainedAt": null, "lastComplainedAt": null, "firstBouncedAt": null, "lastBouncedAt": null, "erroredAt": null, "lastSuppressedAt": null, "lastUnsubscribedAt": null }}
List email events
Get the delivery timeline events from an email message.
Request
/v1/email_messages/:id/events
Parameter | Description |
---|---|
id | Waypoint email message ID. |
const axios = require('axios');
axios({ method: 'get', url: 'https://live.waypointapi.com/v1/email_messages/em_2HxzWrrkPo4V4cXR/events', headers: { 'Content-Type': 'application/json' }, auth: { username: API_KEY_USERNAME, password: API_KEY_PASSWORD } }) }).then(function (response) { console.log(response);}).catch(function (error) { console.log(error);})
curl "https://live.waypointapi.com/v1/email_messages/em_2HxzWrrkPo4V4cXR/events" \-H "Content-Type: application/json" \-u "API_KEY_USERNAME:API_KEY_PASSWORD"
Response
A data object with an array of email message event objects containing:
Property | Description |
---|---|
ID | The Waypoint message event ID. |
type | The type of the message event. |
createdAt | Timestamp of when the message event was created. |
updatedAt | Timestamp of when the message event was last updated. |
code | Status code of the message event (see below). |
message | Description and additional details the event. |
Status codes:
EMAIL_MESSAGE_BOUNCE_SES_EVENT
EMAIL_MESSAGE_CLICKED_SES_EVENT
EMAIL_MESSAGE_COMPLAINT_SES_EVENT
EMAIL_MESSAGE_CONTACT_UNSUBSCRIBED
EMAIL_MESSAGE_CREATED
EMAIL_MESSAGE_DELIVERED_SES_EVENT
EMAIL_MESSAGE_EMPTY_RECIPIENTS_ERROR
EMAIL_MESSAGE_INVALID_PARAMETER_ERROR
EMAIL_MESSAGE_INVALID_RECIPIENTS_ERROR
EMAIL_MESSAGE_INVALID_SENDER_ERROR
EMAIL_MESSAGE_INVALID_TEST_MODE_RECIPIENT_ERROR
EMAIL_MESSAGE_OPEN_SES_EVENT
{ "meta": { "count": 5, "page": 1, "limit": 50 }, "data": [ { "id": "log_Davifvij7cBN96r9", "type": "EmailMessageLog", "createdAt": "2024-08-23T18:10:21.868Z", "updatedAt": "2024-08-23T18:10:21.868Z", "code": "EMAIL_MESSAGE_OPEN_SES_EVENT", "message": "Email was opened by a recipient at IP address 66.249.91.165. User agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.246 Mozilla/5.0" }, { "id": "log_8MXy5akcYqwXL7YJ", "type": "EmailMessageLog", "createdAt": "2024-08-23T18:10:20.215Z", "updatedAt": "2024-08-23T18:10:20.215Z", "code": "EMAIL_MESSAGE_DELIVERED_SES_EVENT", "message": "Email successfully delivered to jordan@usewaypoint.com. Delivery time: 10 seconds." }, { "id": "log_YcTNPR5MYjRpaEh8", "type": "EmailMessageLog", "createdAt": "2024-08-23T18:10:19.184Z", "updatedAt": "2024-08-23T18:10:19.184Z", "code": "EMAIL_MESSAGE_SENT_SES_EVENT", "message": "Email was sent." }, { "id": "log_nUHH2sZVhZhkKb5N", "type": "EmailMessageLog", "createdAt": "2024-08-23T18:10:19.147Z", "updatedAt": "2024-08-23T18:10:19.147Z", "code": "EMAIL_MESSAGE_RENDERED", "message": "Email was processed by Waypoint." }, { "id": "log_DkonKJ4aLgJS6Kgr", "type": "EmailMessageLog", "createdAt": "2024-08-23T18:10:19.032Z", "updatedAt": "2024-08-23T18:10:19.032Z", "code": "EMAIL_MESSAGE_CREATED", "message": "Email message was created." } ]}
List emails
Get a list of email messages. 50 messages returned per API call. Use the cursor parameters to fetch additional pages.
Request
/v1/email_messages/
Parameter | Description |
---|---|
cursor.before | A cursor to use in pagination. Use an object ID to define your place in the list. This will get objects before this cusor object. Example: cursor.before=object_2HxzWrrkPo4V4cXR |
cursor.after | A cursor to use in pagination. Use an object ID to define your place in the list. This will get objects after this cusor object. Example: cursor.after=object_2HxzWrrkPo4V4cXR |
createdAt.gt | Filter where createdAt is greater than the given date (ISO 8601). Example: createdAt.gt=2024-12-17T11:23:01 |
createdAt.gte | Filter where createdAt is greater than or equal to the given date (ISO 8601). Example: createdAt.gte=2024-12-17T11:23:01 |
createdAt.lt | Filter where createdAt is less than the given date (ISO 8601). Example: createdAt.lt=2024-12-17T11:23:01 |
createdAt.lte | Filter where createdAt is less than or equal to the given date (ISO 8601). Example: createdAt.lte=2024-12-17T11:23:01 |
const axios = require('axios');
axios({ method: 'get', url: 'https://live.waypointapi.com/v1/email_messages?createdAt.lt=2024-12-17T00:00:00Z', headers: { 'Content-Type': 'application/json' }, auth: { username: API_KEY_USERNAME, password: API_KEY_PASSWORD } })}).then(function (response) { console.log(response);}).catch(function (error) { console.log(error);})
curl "https://live.waypointapi.com/v1/email_messages?createdAt.gt=2024-02-11T17:53:00Z" \-H "Content-Type: application/json" \-u "API_KEY_USERNAME:API_KEY_PASSWORD"
Response
A successful response returns a dictionary with metadata and a data
object that contains an array of email messages.
Property | Description |
---|---|
meta | Object containing pagination properties including limit , cursor.after (object ID), and cursor.before (object ID) |
data | Array of email message objects. See ‘Retrieve an email message’ response for the properties on each email message. |
{ "meta": { "limit": 50, "cursor.after": "em_954rJcThJGTA7z2c", "cursor.before": "em_P9L3SsjCA9XPJXB9", "count": 2 }, "data": [ { "id": "em_P9L3SsjCA9XPJXB9", "type": "EmailMessage", "createdAt": "2025-02-11T17:53:52.082Z", "updatedAt": "2025-02-11T17:54:37.469Z", "source": "WORKFLOW", "status": "SUCCEEDED", "processedAt": "2025-02-11T17:53:53.680Z", "waypointTemplateId": "wptemplate_WVWNrT7e2yFhnnMv", "variables": {}, "referenceId": "01000194f625655a-be25d8f9-ae16-4b70-b7ed-8dd6864ac4b4-000000", "to": ["jordan@usewaypoint.com"], "cc": [], "bcc": [], "from": "Waypoint Support <support@usewaypoint.com>", "replyTo": null, "sentAt": "2025-02-11T17:53:53.498Z", "deliveredAt": null, "firstOpenedAt": null, "lastOpenedAt": null, "firstClickedAt": null, "lastClickedAt": null, "firstComplainedAt": null, "lastComplainedAt": null, "firstBouncedAt": null, "lastBouncedAt": null, "erroredAt": null, "lastSuppressedAt": null, "lastUnsubscribedAt": null }, { "id": "em_954rJcThJGTA7z2c", "type": "EmailMessage", "createdAt": "2025-02-11T17:53:51.474Z", "updatedAt": "2025-02-11T17:54:37.632Z", "source": "WORKFLOW", "status": "SUCCEEDED", "processedAt": "2025-02-11T17:53:53.738Z", "waypointTemplateId": "wptemplate_WVWNrT7e2yFhnnMv", "variables": {}, "referenceId": "01000194f6256585-c87d8117-1bb5-4f96-88f9-d5e2baba55e0-000000", "to": ["carlos@usewaypoint.com"], "cc": [], "bcc": [], "from": "Waypoint Support <support@usewaypoint.com>", "replyTo": null, "sentAt": "2025-02-11T17:53:53.541Z", "deliveredAt": null, "firstOpenedAt": null, "lastOpenedAt": null, "firstClickedAt": null, "lastClickedAt": null, "firstComplainedAt": null, "lastComplainedAt": null, "firstBouncedAt": null, "lastBouncedAt": null, "erroredAt": null, "lastSuppressedAt": null, "lastUnsubscribedAt": null }, ]}
Email batches
API endpoints for sending and fetching email batches on Waypoint.
Send an email batch
Sending a weekly report, product update, or recommendations email? Create a batch email to send multiple emails with highly personalized content with a single API call.
Want to add an unsubscribe link to each email? Learn more in unsubscribe groups.
Request
/v1/email_messages_batch
Parameter | Description |
---|---|
emailMessages | Required An array of email messages (either with a template or without). |
const axios = require('axios');
axios({ method: "post", url: "https://live.waypointapi.com/v1/email_messages_batch", headers: { "Content-Type": "application/json" }, auth: { username: API_KEY_USERNAME, password: API_KEY_PASSWORD }, data: { "emailMessages": [{ "templateId": "wptemplate_RXL7zGTGsvkXzAP3", "to": "Jordan Isip <jordan@usewaypoint.com>", "variables": { "username": "fixie" } }, { "templateId": "wptemplate_RXL7zGTGsvkXzAP3", "to": "Carlos Rodriguez <jordan@usewaypoint.com>", "variables": { "username": "cohitre" } }] }}).then(function(response) { // handle success console.log('success');}).catch(function(error) { // handle error console.log(error.response.data);})
curl "https://live.waypointapi.com/v1/email_messages_batch" \ -H "Content-Type: application/json" \ -u "API_KEY_USERNAME:API_KEY_PASSWORD" \ -d '{ "emailMessages": [ { "templateId": "wptemplate_RXL7zGTGsvkXzAP3", "to": "Jordan Isip <jordan@usewaypoint.com>", "variables": { "username": "fixie" } }, { "templateId": "wptemplate_RXL7zGTGsvkXzAP3", "to": "Carlos Rodriguez <jordan@usewaypoint.com>", "variables": { "username": "cohitre" } } ] }'
Send a test email batch
Matching sandbox endpoint for batch email sending.
Request
/v1/sandbox/email_messages_batch
This sandbox endpoint the same properties as v1/email_messages_batch
const axios = require('axios');
axios({ method: "post", url: "https://live.waypointapi.com/v1/sandbox/email_messages_batch", headers: { "Content-Type": "application/json" }, auth: { username: API_KEY_USERNAME, password: API_KEY_PASSWORD }, data: { "emailMessages": [{ "templateId": "wptemplate_RXL7zGTGsvkXzAP3", "to": "Jordan Isip <jordan@usewaypoint.com>", "variables": { "username": "fixie" } }, { "templateId": "wptemplate_RXL7zGTGsvkXzAP3", "to": "Carlos Rodriguez <carlos@usewaypoint.com>", "variables": { "username": "cohitre" } }] }}).then(function(response) { // handle success console.log('success');}).catch(function(error) { // handle error console.log(error.response.data);})
curl "https://live.waypointapi.com/v1/sandbox/email_messages_batch" \ -H "Content-Type: application/json" \ -u "API_KEY_USERNAME:API_KEY_PASSWORD" \ -d '{ "emailMessages": [ { "templateId": "wptemplate_RXL7zGTGsvkXzAP3", "to": "Jordan Isip <jordan@usewaypoint.com>", "variables": { "username": "fixie" } }, { "templateId": "wptemplate_RXL7zGTGsvkXzAP3", "to": "Carlos Rodriguez <jordan@usewaypoint.com>", "variables": { "username": "cohitre" } } ] }'
Retrieve an email batch
Get a report of all email messages sent that were created from an email batch. 100 messages returned per API call. Use the offset parameter to fetch additional pages.
Request
v1/batches/:id/email_messages
Parameter | Description |
---|---|
id | Waypoint email batch ID (either Live or Sandbox batch). |
offset | Starting point of email messages within the batch. |
const axios = require('axios');
axios({ method: 'get', url: 'https://live.waypointapi.com/v1/batches/BATCH_ID/email_messages', headers: { 'Content-Type': 'application/json' }, auth: { username: API_KEY_USERNAME, password: API_KEY_PASSWORD } })}).then(function (response) { console.log(response);}).catch(function (error) { console.log(error);})
curl "https://live.waypointapi.com/v1/batches/BATCH_ID/email_messages" \-H "Content-Type: application/json" \-u "API_KEY_USERNAME:API_KEY_PASSWORD"
Response
A successful response is a data object with an array of associated message logs. See a email message log for response details on each message.
{ "data": [ { "id": "em_45TWBJqcvwHLoDq5", "type": "EmailMessage", "createdAt": "2024-12-31T14:58:36.896Z", "updatedAt": "2024-12-31T15:58:15.008Z", "source": "BATCH", "status": "SUCCEEDED", "processedAt": null, "waypointTemplateId": "wptemplate_WVWNrT7e2yFhnnMv", "variables": { "message": "hello from a batch" }, "to": ["\"Jordan Isip\" <jordan@usewaypoint.com>"], "cc": [], "bcc": [], "from": "Waypoint <support@usewaypoint.com>", "replyTo": "", "sentAt": "2024-12-31T14:58:43.775Z", "deliveredAt": "2024-12-31T14:58:44.805Z", "firstOpenedAt": "2024-12-31T14:58:45.927Z", "lastOpenedAt": "2024-12-31T15:58:14.801Z", "firstClickedAt": null, "lastClickedAt": null, "firstComplainedAt": null, "lastComplainedAt": null, "firstBouncedAt": null, "lastBouncedAt": null, "erroredAt": null, "lastSuppressedAt": null, "lastUnsubscribedAt": null }, { "id": "em_HKbSarUFc391Cng3", "type": "EmailMessage", "createdAt": "2024-12-31T14:58:36.962Z", "updatedAt": "2024-12-31T15:19:51.765Z", "source": "BATCH", "status": "SUCCEEDED", "processedAt": null, "waypointTemplateId": "wptemplate_WVWNrT7e2yFhnnMv", "variables": { "message": "hello from a batch" }, "to": ["\"Carlos Rodriguez\" <carlos@usewaypoint.com>"], "cc": [], "bcc": [], "from": "Waypoint <support@usewaypoint.com>", "replyTo": "", "sentAt": "2024-12-31T14:58:43.781Z", "deliveredAt": "2024-12-31T14:58:45.076Z", "firstOpenedAt": "2024-12-31T14:58:45.727Z", "lastOpenedAt": "2024-12-31T15:19:51.609Z", "firstClickedAt": null, "lastClickedAt": null, "firstComplainedAt": null, "lastComplainedAt": null, "firstBouncedAt": null, "lastBouncedAt": null, "erroredAt": null, "lastSuppressedAt": null, "lastUnsubscribedAt": null } ]}
Workflows
API endpoints for workflows on Waypoint.
Trigger workflow
Start a workflow to start a workflow run.
/v1/workflow_runs
Parameter | Description |
---|---|
workflowId | Waypoint workflow ID. |
workflowKey | Your custom workflow key. Eg. abandoned_cart . Use in replace of a workflowId. |
variables | Template variables JSON. |
metaId | ID used for idempotent requests or internal reference. Eg. ‘order_1234’. |
const axios = require('axios');
axios({ method: "post", url: "https://live.waypointapi.com/v1/workflow_runs", headers: { "Content-Type": "application/json" }, auth: { username: API_KEY_USERNAME, password: API_KEY_PASSWORD }, data: { "workflowId": "wf_eXYHR685DrjeGEXz", "variables": { "user": { "displayName": "Jordan", "email": "jordan@usewaypoint.com" }, "product": { "title": "Beechers Mac & Cheese", "id": "02934203942" } } }}).then(function (response) { console.log(response);}).catch(function (error) { console.log(error);})
curl "https://live.waypointapi.com/v1/workflow_runs" \ -H "Content-Type: application/json" \ -u "API_KEY_USERNAME:API_KEY_PASSWORD" \ -d '{ "workflowId": "wf_eXYHR685DrjeGEXz", "variables": { "user": { "displayName": "Jordan", "email": "jordan@usewaypoint.com" }, "product": { "title": "Beechers Mac & Cheese", "id": "02934203942" } } }'
Trigger test workflow
Similar to sandbox test emails above, workflows can be triggered as a test workflow. This will start a workflow but not actually send the resulting email.
/v1/sandbox/workflow_runs
This sandbox endpoint the same properties as v1/workflow_runs
const axios = require('axios');
axios({ method: "post", url: "https://live.waypointapi.com/v1/sandbox/workflow_runs", headers: { "Content-Type": "application/json" }, auth: { username: API_KEY_USERNAME, password: API_KEY_PASSWORD }, data: { "workflowId": "wf_eXYHR685DrjeGEXz", "variables": { "user": { "displayName": "Jordan", "email": "jordan@usewaypoint.com" }, "product": { "title": "Beechers Mac & Cheese", "id": "02934203942" } } }}).then(function (response) { console.log(response);}).catch(function (error) { console.log(error);})
curl "https://live.waypointapi.com/v1/sandbox/workflow_runs" \ -H "Content-Type: application/json" \ -u "API_KEY_USERNAME:API_KEY_PASSWORD" \ -d '{ "workflowId": "wf_eXYHR685DrjeGEXz", "variables": { "user": { "displayName": "Jordan", "email": "jordan@usewaypoint.com" }, "product": { "title": "Beechers Mac & Cheese", "id": "02934203942" } } }'
Templates
API endpoints for email templates on Waypoint.
Retrieve template (with data)
Fetch a template with passed in template data. The response will have the processed HTML body, text body, and subject line.
Request
/v1/templates/:id/render
Parameter | Description |
---|---|
id | Waypoint template ID. Example: wptemplate_qzJuYidNgPYNoba6 |
variables | Object matching your template variables. |
axios({ method: "post", url: "https://live.waypointapi.com/v1/templates/wptemplate_qzJuYidNgPYNoba6/render", headers: { "Content-Type": "application/json" }, auth: { username: API_KEY_USERNAME, password: API_KEY_PASSWORD }, data: { "variables": { "passcode": "ABC123", "expiresIn": "30 minutes" } }})
curl "https://live.waypointapi.com/v1/templates/wptemplate_qzJuYidNgPYNoba6/render" \ -H "Content-Type: application/json" \ -u "API_KEY_USERNAME:API_KEY_PASSWORD" \ -d '{ "variables": { "passcode": "ABC123", "expiresIn": "30 minutes" } }'
Response
Property | Description |
---|---|
type | The type of the template. |
createdAt | Timestamp of when the template was created. |
bodyHtml | The processed HTML body of the template. |
bodyText | The processed text body of the template. |
subject | The processed subject of the template. |
{ data: { type: 'RenderedTemplate', createdAt: '2025-02-12T02:08:24.552Z', bodyHtml: '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n' + '<html lang="en" dir="ltr" style="-webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; box-sizing: border-box; -webkit-text-size-adjust: 100%;">\n' + '\n' + ' <head>\n' + ' <meta http-equiv="Content-Type" content="text/html charset=UTF-8">\n' + ' <style data-emotion="css-global o6gwfi">\n' + '@media print {\n' + ' body {\n' + ' background-color: #fff;\n' + ' }\n' + '}\n' + '</style>\n' + ' <style>\n' + '@media screen and (max-width: 599.95px) {\n' + ' .block-mobile {\n' + ' display: block !important;\n' + ' }\n' + '\n' + ' .block-desktop {\n' + ' display: none !important;\n' + ' }\n' + '}\n' + '</style>\n' + ' </head>\n' + '\n' + ` <body style="box-sizing: inherit; margin: 0; color: rgba(0, 0, 0, 0.87); font-family: 'Roboto', 'Helvetica', 'Arial', sans-serif; font-weight: 400; font-size: 1rem; line-height: 1.5; letter-spacing: 0.00938em; background-color: #EEEEEE;">\n` + ' \n' + ` <div class="css-fpvms3" style="box-sizing: inherit; font-weight: 400; font-size: 16px; padding: 32px 0; margin: 0; letter-spacing: 0.15008px; line-height: 1.5; background-color: #EEEEEE; font-family: 'Nimbus Mono PS', 'Courier New', 'Cutive Mono', monospace; color: #242424;">\n` + ' <div style="box-sizing: inherit; display: none; overflow: hidden; line-height: 1px; opacity: 0; max-height: 0; max-width: 0;">This code will expire in 30 minutes.<div style="box-sizing: inherit;"> </div>\n' + ' </div>\n' + ' <table align="center" width="100%" style="box-sizing: inherit; background-color: #FFFFFF; max-width: 600px; min-height: 48px;" role="presentation" cellspacing="0" cellpadding="0" border="0" bgcolor="#FFFFFF">\n' + ' <tbody style="box-sizing: inherit;">\n' + ' <tr style="box-sizing: inherit; width: 100%;">\n' + ' <td style="box-sizing: inherit;">\n' + ' <div style="font-family: inherit; font-size: 16px; font-weight: normal; padding: 32px 24px 24px 24px; text-align: left; max-width: 100%; box-sizing: border-box;">\n' + ' <div class style="box-sizing: inherit;">\n' + ' <table align="center" width="100%" cellpadding="0" border="0" style="box-sizing: inherit; table-layout: fixed; border-collapse: collapse;">\n' + ' <tbody style="box-sizing: inherit; width: 100%;">\n' + ' <tr style="box-sizing: inherit; width: 100%;">\n' + ' <td style="box-sizing: content-box; vertical-align: middle; text-align: left; width: 50%; padding-left: 0; padding-right: 8px;" width="50%" valign="middle" align="left">\n' + ' <div style="font-family: inherit; font-size: 16px; font-weight: normal; padding: 0px 0px 0px 0px; text-align: left; max-width: 100%; box-sizing: border-box;">\n' + ' <div style="padding: 0px 0px 0px 0px; text-align: left; max-width: 100%; box-sizing: border-box;"><img src="https://d1iiu589g39o6c.cloudfront.net/live/platforms/platform_pqVAk6zw4NNzFhNm/images/wptemplateimage_FQWgtu4Gg5sjwHFu/GENIE.png" style="box-sizing: inherit; display: inline-block; outline: none; border: none; text-decoration: none; vertical-align: middle; max-width: 100%; height: 20px;" height="20"></div>\n' + ' </div>\n' + ' </td>\n' + ' <td style="box-sizing: content-box; vertical-align: middle; text-align: left; width: 50%; padding-left: 8px; padding-right: 0;" width="50%" valign="middle" align="left">\n' + ' <div style="font-family: inherit; font-size: 16px; font-weight: normal; padding: 0px 0px 0px 0px; text-align: left; max-width: 100%; box-sizing: border-box;">\n' + ' <div style="font-family: inherit; font-size: 14px; font-weight: bold; padding: 0px 0px 0px 0px; text-align: right; max-width: 100%; box-sizing: border-box;"><a href="https://www.usewaypoint.com" target="_blank" style="box-sizing: inherit; background-color: #16A34A; color: #FFFFFF; padding: 0px 0px; border-radius: 0; width: auto; display: inline-block; line-height: 100%; text-decoration: none; max-width: 100%;"><span style="box-sizing: inherit;"><!--[if mso]><i style="letter-spacing: undefinedpx;mso-font-width:-100%;mso-text-raise:0" hidden> </i><![endif]--></span><span style="box-sizing: inherit; background-color: #16A34A; color: #FFFFFF; padding: 12px 20px; border-radius: 0; width: auto; display: inline-block; max-width: 100%; line-height: 120%; text-decoration: none; text-transform: none; mso-padding-alt: 0px; mso-text-raise: 0;">Login</span><span style="box-sizing: inherit;"><!--[if mso]><i style="letter-spacing: undefinedpx;mso-font-width:-100%" hidden> </i><![endif]--></span></a></div>\n' + ' </div>\n' + ' </td>\n' + ' </tr>\n' + ' </tbody>\n' + ' </table>\n' + ' </div>\n' + ' </div>\n' + ' <div style="color: #000000; font-family: inherit; font-size: 16px; font-weight: normal; padding: 16px 24px 16px 24px; text-align: left; max-width: 100%; box-sizing: border-box;">\n' + ' \n' + ' <div class="css-vii0ua" style="box-sizing: inherit;">\n' + ' <div style="box-sizing: inherit;">\n' + ' <p style="box-sizing: inherit; margin-top: 0px; margin-bottom: 0px;">Hi, here is your one-time passcode:</p>\n' + ' </div>\n' + ' </div>\n' + ' </div>\n' + ' <div style="font-family: inherit; font-weight: bold; padding: 24px 24px 0px 24px; text-align: left; max-width: 100%; box-sizing: border-box;">\n' + ' <h1 style="box-sizing: inherit; margin-top: 40px; margin-bottom: 16px; font-weight: inherit; margin: 0; font-size: 32px;">ABC123</h1>\n' + ' </div>\n' + ' <div style="color: #191A1A; font-family: inherit; font-size: 12px; font-weight: normal; padding: 0px 24px 40px 24px; text-align: left; max-width: 100%; box-sizing: border-box;">\n' + ' <div class="css-vii0ua" style="box-sizing: inherit;">\n' + ' <div style="box-sizing: inherit;">\n' + ' <p style="box-sizing: inherit; margin-top: 0px; margin-bottom: 0px;">This code will expire in 30 minutes.</p>\n' + ' </div>\n' + ' </div>\n' + ' </div>\n' + ' <div style="font-family: inherit; font-size: 12px; font-weight: normal; padding: 24px 24px 32px 24px; text-align: left; max-width: 100%; box-sizing: border-box;">\n' + ' <div class="css-vii0ua" style="box-sizing: inherit;">\n' + ' <div style="box-sizing: inherit;">\n' + ' <p style="box-sizing: inherit; margin-top: 0px; margin-bottom: 0px;">Need help? Just reply to this email or email us at <a href="mailto:support@example.com" target="_blank" style="box-sizing: inherit; color: #16A34A;">support@example.com</a>.</p>\n' + ' </div>\n' + ' </div>\n' + ' </div>\n' + ' </td>\n' + ' </tr>\n' + ' </tbody>\n' + ' </table>\n' + ' </div>\n' + ' </body>\n' + '\n' + '</html>', bodyText: 'Login [https://www.usewaypoint.com]\n' + '\n' + 'Hi, here is your one-time passcode:\n' + '\n' + '\n' + 'ABC123\n' + '\n' + 'This code will expire in 30 minutes.\n' + '\n' + 'Need help? Just reply to this email or email us at support@example.com\n' + '[support@example.com].', subject: 'Your one-time passcode is ABC123' }}
Retrieve raw template
Get the HTML of your template with raw LiquidJS templating. This is useful for teams that need to keep a copy of the raw template within your codebase or send through a separate service for compliance reasons.
Request
/v1/templates/:id/raw
Parameter | Description |
---|---|
id | Waypoint template ID. Example: wptemplate_qzJuYidNgPYNoba6 |
const axios = require('axios');
axios({ method: "get", url: "https://live.waypointapi.com/v1/templates/wptemplate_qzJuYidNgPYNoba6/raw", headers: { "Content-Type": "application/json" }, auth: { username: API_KEY_USERNAME, password: API_KEY_PASSWORD },}).then(function (response) { console.log(response);}).catch(function (error) { console.log(error);})
curl "https://live.waypointapi.com/v1/templates/wptemplate_qzJuYidNgPYNoba6/raw" \-H "Content-Type: application/json" \-u "API_KEY_USERNAME:API_KEY_PASSWORD"
Response
Property | Description |
---|---|
ID | The template ID. |
type | The type of the template. |
createdAt | Timestamp of when the template was created. |
updatedAt | Timestamp of when the template was last updated. |
rawSubject | The subject line of the email with LiquidJS templating. |
rawBodyHtml | The HTML body of the email with LiquidJS templating. |
{ "data": { "id": "wptemplate_qzJuYidNgPYNoba6", "type": "Template", "createdAt": "2023-11-28T14:42:09.867Z", "updatedAt": "2023-12-04T18:32:48.547Z", "rawSubject": "{{user.displayName}}, you got {{report.metric.value | downcase}} {{report.metric.title | downcase}} {{report.duration | downcase}}", "rawBodyHtml": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html lang=\"en\" dir=\"ltr\" style=\"-webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; box-sizing: border-box; -webkit-text-size-adjust: 100%;\">\n\n <head>\n <meta http-equiv=\"Content-Type\" content=\"text/html charset=UTF-8\">\n <style data-emotion=\"css-global o6gwfi\">\n@media print {\n body {\n background-color: #fff;\n }\n}\n</style>\n <style>\n@media screen and (max-width: 599.95px) {\n .block-mobile {\n display: block !important;\n }\n\n .block-desktop {\n display: none !important;\n }\n}\n</style>\n </head>\n\n <body style=\"box-sizing: inherit; margin: 0; color: rgba(0, 0, 0, 0.87); font-family: 'Roboto', 'Helvetica', 'Arial', sans-serif; font-weight: 400; font-size: 1rem; line-height: 1.5; letter-spacing: 0.00938em; background-color: #EEEEEE;\">\n \n <div class=\"css-b5fgh5\" style=\"box-sizing: inherit; font-weight: 400; font-size: 16px; padding: 32px 0; margin: 0; letter-spacing: 0.15008px; line-height: 1.5; background-color: #EEEEEE; font-family: 'Helvetica Neue', 'Arial Nova', 'Nimbus Sans', Arial, sans-serif; color: #242424;\">\n <div style=\"box-sizing: inherit; display: none; overflow: hidden; line-height: 1px; opacity: 0; max-height: 0; max-width: 0;\">Plus your top performing post {{report.duration | downcase}}.<div style=\"box-sizing: inherit;\"> </div>\n </div>\n <table align=\"center\" width=\"100%\" style=\"box-sizing: inherit; background-color: #FFFFFF; max-width: 600px; min-height: 48px;\" role=\"presentation\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" bgcolor=\"#FFFFFF\">\n <tbody style=\"box-sizing: inherit;\">\n <tr style=\"box-sizing: inherit; width: 100%;\">\n <td style=\"box-sizing: inherit;\">\n <div style=\"font-family: inherit; font-size: 16px; font-weight: normal; padding: 24px 24px 24px 24px; text-align: left; max-width: 100%; box-sizing: border-box;\">\n <div class style=\"box-sizing: inherit;\">\n <table align=\"center\" width=\"100%\" cellpadding=\"0\" border=\"0\" style=\"box-sizing: inherit; table-layout: fixed; border-collapse: collapse;\">\n <tbody style=\"box-sizing: inherit; width: 100%;\">\n <tr style=\"box-sizing: inherit; width: 100%;\">\n <td style=\"box-sizing: content-box; vertical-align: middle; text-align: left; width: 50%; padding-left: 0; padding-right: 8px;\" width=\"50%\" valign=\"middle\" align=\"left\">\n <div style=\"font-family: inherit; font-size: 16px; font-weight: normal; padding: 0px 0px 0px 0px; text-align: left; max-width: 100%; box-sizing: border-box;\">\n <div style=\"padding: 0px 0px 0px 0px; text-align: left; max-width: 100%; box-sizing: border-box;\"><img alt src=\"https://d1iiu589g39o6c.cloudfront.net/live/platforms/platform_A9wwKSL6EV6orh6f/images/wptemplateimage_n3eLjsf37dcjFaj5/Narrative.png\" style=\"box-sizing: inherit; display: block; outline: none; border: none; text-decoration: none;\"></div>\n </div>\n </td>\n <td style=\"box-sizing: content-box; vertical-align: middle; text-align: left; width: 50%; padding-left: 8px; padding-right: 0;\" width=\"50%\" valign=\"middle\" align=\"left\">\n <div style=\"font-family: inherit; font-size: 16px; font-weight: normal; padding: 0px 0px 0px 0px; text-align: left; max-width: 100%; box-sizing: border-box;\">\n <div style=\"font-family: inherit; font-weight: normal; padding: 0px 0px 0px 0px; text-align: right; max-width: 100%; box-sizing: border-box;\"><img src=\"{{user.avatarUrl}}\" alt=\"{{user.displayName}}\" style=\"box-sizing: inherit; display: inline-block; object-fit: cover; height: 32px; width: 32px; max-width: 100%; vertical-align: middle; text-align: center; border-radius: 32px;\" width=\"32\" height=\"32\"></div>\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n <div style=\"font-family: inherit; font-weight: bold; padding: 24px 24px 0px 24px; text-align: center; max-width: 100%; box-sizing: border-box;\">\n <h3 style=\"box-sizing: inherit; margin-top: 40px; margin-bottom: 16px; font-weight: inherit; font-size: 20px; margin: inherit;\">{{report.duration}}, your posts received</h3>\n </div>\n <div style=\"font-family: inherit; font-size: 48px; font-weight: bold; padding: 16px 24px 0px 24px; text-align: center; max-width: 100%; box-sizing: border-box;\">\n \n <div class=\"css-vii0ua\" style=\"box-sizing: inherit;\">\n <div style=\"box-sizing: inherit;\">\n <p style=\"box-sizing: inherit; margin-top: 0px; margin-bottom: 0px;\">{{report.metric.value}}</p>\n </div>\n </div>\n </div>\n <div style=\"font-family: inherit; font-size: 14px; font-weight: bold; padding: 0px 24px 16px 24px; text-align: center; max-width: 100%; box-sizing: border-box;\">\n <div class=\"css-vii0ua\" style=\"box-sizing: inherit;\">\n <div style=\"box-sizing: inherit;\">\n <p style=\"box-sizing: inherit; margin-top: 0px; margin-bottom: 0px;\">{{report.metric.title}}</p>\n </div>\n </div>\n </div>\n <div style=\"font-family: inherit; font-size: 16px; font-weight: bold; padding: 16px 24px 40px 24px; text-align: center; max-width: 100%; box-sizing: border-box;\"><a href=\"https://narrative.example.com/{{user.username}}/analytics\" style=\"box-sizing: inherit; color: #24AF7F; background-color: #24AF7F; padding: 0; border-radius: 4px; width: auto; display: inline-block; text-decoration: none; max-width: 100%; line-height: 100%;\"><span style=\"box-sizing: inherit; color: #FFFFFF; padding: 12px 20px; width: 100%; display: inline-block; max-width: 100%; line-height: 120%; text-decoration: none; text-transform: none;\">View your analytics →</span></a></div>\n <div style=\"font-family: inherit; font-weight: bold; padding: 24px 24px 8px 24px; text-align: center; max-width: 100%; box-sizing: border-box;\">\n <h3 style=\"box-sizing: inherit; margin-top: 40px; margin-bottom: 16px; font-weight: inherit; font-size: 20px; margin: inherit;\">Top performing post {{report.duration | downcase}}</h3>\n </div>\n <div style=\"font-family: inherit; font-size: 16px; font-weight: normal; padding: 16px 24px 16px 24px; text-align: left; max-width: 100%; box-sizing: border-box;\">\n <div style=\"border: 1px solid #d0d0d0; border-radius: 8px; font-family: inherit; font-size: 16px; font-weight: normal; padding: 24px 24px 24px 24px; text-align: left; max-width: 100%; box-sizing: border-box;\">\n <div style=\"font-family: inherit; font-size: 16px; font-weight: normal; padding: 0px 0px 0px 0px; text-align: left; max-width: 100%; box-sizing: border-box;\">\n <div class=\"css-vii0ua\" style=\"box-sizing: inherit;\">\n <div style=\"box-sizing: inherit;\">\n <p style=\"box-sizing: inherit; margin-top: 0px; margin-bottom: 0px;\">{{report.topPerformingPost}}</p>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div style=\"font-family: inherit; font-size: 16px; font-weight: bold; padding: 16px 24px 16px 24px; text-align: center; max-width: 100%; box-sizing: border-box;\"><a href=\"https://narrative.example.com/{{user.username}}/posts\" style=\"box-sizing: inherit; color: #24AF7F; background-color: #EEEEEE; padding: 0; border-radius: 4px; width: auto; display: inline-block; text-decoration: none; max-width: 100%; line-height: 100%;\"><span style=\"box-sizing: inherit; color: #000000; padding: 12px 20px; width: 100%; display: inline-block; max-width: 100%; line-height: 120%; text-decoration: none; text-transform: none;\">Show more</span></a></div>\n <div style=\"padding: 40px 0px 0px 0px; max-width: 100%; box-sizing: border-box;\">\n <hr style=\"box-sizing: inherit; margin: 0px; width: 100%; border: none; border-top: 1px solid #eaeaea; border-color: rgb(233, 233, 233); border-top-width: 1px;\">\n </div>\n <div style=\"color: #474849; font-family: inherit; font-size: 12px; font-weight: normal; padding: 24px 24px 24px 24px; text-align: center; max-width: 100%; box-sizing: border-box;\">\n <div class=\"css-vii0ua\" style=\"box-sizing: inherit;\">\n <div style=\"box-sizing: inherit;\">\n <p style=\"box-sizing: inherit; margin-top: 0px; margin-bottom: 0px;\">Questions? Just reply to this email.</p>\n </div>\n </div>\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </body>\n\n</html>" }}