### Install Mailshake Node.js library Source: https://github.com/mailshake/mailshake-node/blob/master/README.md Use npm to install the package as a dependency in your project. ```shell npm install mailshake-node ``` -------------------------------- ### Configure test environment Source: https://github.com/mailshake/mailshake-node/blob/master/README.md Example configuration file for running the module test suite. ```json { "apiKey": "my-api-key" } ``` -------------------------------- ### PushHandler Setup Source: https://context7.com/mailshake/mailshake-node/llms.txt Set up real-time webhook notifications using the PushHandler class with Express.js. ```APIDOC ## PushHandler Setup ### Description Set up real-time webhook notifications using the PushHandler class with Express.js. The handler automatically manages subscription URLs and event routing. ### Parameters #### Request Body - **baseUrl** (string) - Required - The base URL of your server. - **rootPath** (string) - Required - The path where webhooks will be received. - **secret** (string) - Required - The webhook secret key for verification. ``` -------------------------------- ### Paginate Campaign Results with next() Source: https://context7.com/mailshake/mailshake-node/llms.txt Iterate through all pages of campaign data using the `next()` function provided for paginated results. This example demonstrates fetching all campaigns efficiently. Ensure the SDK is initialized. ```javascript const mailshake = require('mailshake-node')('my-api-key'); async function getAllCampaigns() { const allCampaigns = []; let result = await mailshake.campaigns.list({ perPage: 25 }); while (result.results.length > 0) { allCampaigns.push(...result.results); console.log(`Fetched ${allCampaigns.length} campaigns so far...`); if (!result.nextToken) break; result = await result.next(); } console.log(`Total campaigns: ${allCampaigns.length}`); return allCampaigns; } getAllCampaigns() .then((campaigns) => { campaigns.forEach((c) => console.log(`- ${c.title}`)); }) .catch((err) => { console.error(`${err.code}: ${err.message}`); }); ``` -------------------------------- ### GET /campaigns.get Source: https://context7.com/mailshake/mailshake-node/llms.txt Fetch detailed information about a specific campaign by its ID. ```APIDOC ## GET /campaigns.get ### Description Fetch detailed information about a specific campaign by its ID, including message templates, sending schedule, and performance metrics. ### Method GET ### Endpoint campaigns.get ### Parameters #### Request Body - **campaignID** (integer) - Required - The unique identifier of the campaign. ``` -------------------------------- ### GET /senders.list Source: https://context7.com/mailshake/mailshake-node/llms.txt List all configured sender email addresses available for use in campaigns. ```APIDOC ## GET /senders.list ### Description List all configured sender email addresses available for use in campaigns. ``` -------------------------------- ### Get Lead Details Source: https://context7.com/mailshake/mailshake-node/llms.txt Fetches detailed information for a specific lead using its leadID. Includes associated activity and conversation history. ```javascript const mailshake = require('mailshake-node')('my-api-key'); mailshake.leads.get({ leadID: 98765 }) .then((lead) => { console.log('Lead:', lead.emailAddress); console.log('Status:', lead.status); console.log('Campaign:', lead.campaign.title); console.log('First Name:', lead.fields.firstName); console.log('Last Name:', lead.fields.lastName); }) .catch((err) => { console.error(`${err.code}: ${err.message}`); }); ``` -------------------------------- ### Get Campaign Details Source: https://context7.com/mailshake/mailshake-node/llms.txt Fetch comprehensive metadata and performance metrics for a specific campaign by ID. ```javascript const mailshake = require('mailshake-node')('my-api-key'); mailshake.campaigns.get({ campaignID: 12345 }) .then((campaign) => { console.log('Campaign:', campaign.title); console.log('Messages:', campaign.messages.length); console.log('Total Recipients:', campaign.numRecipients); console.log('Sent:', campaign.numSent); console.log('Opens:', campaign.numOpens); console.log('Replies:', campaign.numReplies); }) .catch((err) => { console.error(`${err.code}: ${err.message}`); }); ``` -------------------------------- ### Mailshake push notification request format Source: https://github.com/mailshake/mailshake-node/blob/master/README.md Example of the JSON payload sent by Mailshake to your server. ```json { "resource_url": "https://api.mailshake.com/2017-04-01/..." } ``` -------------------------------- ### GET /campaigns.list Source: https://context7.com/mailshake/mailshake-node/llms.txt Retrieve a paginated list of all campaigns in your Mailshake account, with optional search filtering. ```APIDOC ## GET /campaigns.list ### Description Retrieve a paginated list of all campaigns in your Mailshake account. Supports filtering by search term and returns campaign metadata including status, creation date, and recipient counts. ### Method GET ### Endpoint campaigns.list ### Parameters #### Query Parameters - **search** (string) - Optional - Search term to filter campaigns by title. ``` -------------------------------- ### GET /team.listMembers Source: https://context7.com/mailshake/mailshake-node/llms.txt Retrieve all team members in your Mailshake account for managing assignments and permissions. ```APIDOC ## GET /team.listMembers ### Description Retrieve all team members in your Mailshake account for managing assignments and permissions. ``` -------------------------------- ### Get Specific Recipient Details Source: https://context7.com/mailshake/mailshake-node/llms.txt Fetch detailed information for a single recipient, including their email address, custom fields, campaign details, and status flags. ```javascript const mailshake = require('mailshake-node')('my-api-key'); mailshake.recipients.get({ recipientID: 11111 }) .then((recipient) => { console.log('Email:', recipient.emailAddress); console.log('First Name:', recipient.fields.firstName); console.log('Campaign:', recipient.campaign.title); console.log('Paused:', recipient.isPaused); console.log('Unsubscribed:', recipient.isUnsubscribed); }) .catch((err) => { console.error(`${err.code}: ${err.message}`); }); ``` -------------------------------- ### Initialize and use Mailshake client Source: https://github.com/mailshake/mailshake-node/blob/master/README.md Initialize the client with an API key and perform operations like listing campaigns. Every operation returns a Promise. ```javascript const mailshake = require('mailshake-node')('my-api-key'); return mailshake.campaigns .list({ search: 'Venkman', }) .then((result) => { console.log(JSON.stringify(result, null, 2)); }) .catch((err) => { console.error(`${err.code}: ${err.message}`); }); ``` -------------------------------- ### POST /campaigns.create Source: https://context7.com/mailshake/mailshake-node/llms.txt Create a new campaign with specified sender, messages, and optional settings. ```APIDOC ## POST /campaigns.create ### Description Create a new campaign with specified sender, messages, and optional settings. Returns the created campaign object with its assigned ID. ### Method POST ### Endpoint campaigns.create ### Parameters #### Request Body - **title** (string) - Required - The name of the campaign. - **senderID** (integer) - Required - The ID of the sender. - **messages** (array) - Required - List of message objects containing subject, body, and scheduling settings. ``` -------------------------------- ### Initialize Mailshake Client Source: https://context7.com/mailshake/mailshake-node/llms.txt Initialize the client using an API key to access resource-based methods. ```javascript const mailshake = require('mailshake-node')('my-api-key'); // All operations return Promises mailshake.me() .then((result) => { console.log('Authenticated as:', result.teamName); console.log('User ID:', result.id); }) .catch((err) => { console.error(`Error ${err.code}: ${err.message}`); }); ``` -------------------------------- ### Manual Webhook Management (push.create, push.delete) Source: https://context7.com/mailshake/mailshake-node/llms.txt Manually manage webhook subscriptions using `push.create` and `push.delete` for custom implementations without the `PushHandler` class. ```APIDOC ## push.create / push.delete Manually manage webhook subscriptions without the PushHandler class for custom implementations. ### POST /push Creates a new push subscription. #### Parameters - **targetUrl** (string) - Required - The URL where webhook notifications will be sent. - **event** (string) - Required - The type of event to subscribe to (e.g., 'Clicked', 'Replied'). - **filter** (object) - Optional - Criteria to filter events. - **campaignID** (integer) - Required within filter - The ID of the campaign to monitor. ### Request Example (Create) ```javascript const mailshake = require('mailshake-node')('my-api-key'); mailshake.push.create({ targetUrl: 'https://your-server.com/hooks/mailshake/clicked-12345', event: 'Clicked', filter: { campaignID: 12345 } }) .then(() => { console.log('Push subscription created'); }) .catch((err) => { console.error(`${err.code}: ${err.message}`); }); ``` ### DELETE /push Deletes an existing push subscription. #### Parameters - **targetUrl** (string) - Required - The URL of the subscription to delete. ### Request Example (Delete) ```javascript const mailshake = require('mailshake-node')('my-api-key'); mailshake.push.delete({ targetUrl: 'https://your-server.com/hooks/mailshake/clicked-12345' }) .then(() => { console.log('Push subscription deleted'); }) .catch((err) => { console.error(`${err.code}: ${err.message}`); }); ``` ``` -------------------------------- ### Monitor Lead Activity with Mailshake SDK Source: https://context7.com/mailshake/mailshake-node/llms.txt Use these snippets to track new leads, status changes, and assignments within a campaign. Ensure you have initialized the SDK with your API key. ```javascript const mailshake = require('mailshake-node')('my-api-key'); // Get newly created leads mailshake.activity.createdLeads({ campaignID: 12345 }) .then((result) => { result.results.forEach((event) => { console.log(`New lead: ${event.lead.emailAddress} at ${event.actionDate}`); }); }); ``` ```javascript // Get lead status changes mailshake.activity.leadStatusChanges({ campaignID: 12345 }) .then((result) => { result.results.forEach((change) => { console.log(`Lead ${change.lead.id}: ${change.oldStatus} -> ${change.newStatus}`); }); }); ``` ```javascript // Get lead assignment changes mailshake.activity.leadAssignments({ campaignID: 12345 }) .then((result) => { result.results.forEach((assignment) => { console.log(`Lead ${assignment.lead.id} assigned to ${assignment.assignedTo.emailAddress}`); }); }); ``` -------------------------------- ### Manage Push Subscriptions with PushHandler Source: https://context7.com/mailshake/mailshake-node/llms.txt Use the PushHandler class to automate subscription creation and unsubscription for specific campaign events. ```javascript const mailshake = require('mailshake-node')('my-api-key'); const PushHandler = require('mailshake-node').PushHandler; const handler = new PushHandler(mailshake, { baseUrl: 'https://your-server.com', rootPath: 'webhooks', secret: 'secret123' }); // Subscribe to click events for a specific campaign handler.subscribe('Clicked', { campaignID: 12345 }) .then((targetUrl) => { console.log('Subscribed to clicks at:', targetUrl); // Store targetUrl for later unsubscription return targetUrl; }) .catch((err) => { console.error(`${err.code}: ${err.message}`); }); // Subscribe to reply events handler.subscribe('Replied', { campaignID: 12345 }) .then((targetUrl) => { console.log('Subscribed to replies at:', targetUrl); }); // Unsubscribe when no longer needed const savedTargetUrl = 'https://your-server.com/webhooks/secret123/unique-id'; handler.unsubscribe(savedTargetUrl) .then(() => { console.log('Successfully unsubscribed'); }) .catch((err) => { console.error(`${err.code}: ${err.message}`); }); ``` -------------------------------- ### Create New Campaign Source: https://context7.com/mailshake/mailshake-node/llms.txt Create a campaign by providing a title, sender ID, and an array of message objects. ```javascript const mailshake = require('mailshake-node')('my-api-key'); mailshake.campaigns.create({ title: 'Product Launch Outreach', senderID: 5678, messages: [ { subject: 'Introducing Our New Product', body: 'Hi {{firstName}},\n\nI wanted to reach out about...', isPaused: false }, { subject: 'Following up', body: 'Hi {{firstName}},\n\nJust wanted to follow up...', delay: 3 // days after previous message } ] }) .then((campaign) => { console.log('Campaign created with ID:', campaign.id); }) .catch((err) => { console.error(`${err.code}: ${err.message}`); }); ``` -------------------------------- ### Handle real-time pushes with Express Source: https://github.com/mailshake/mailshake-node/blob/master/README.md Set up a PushHandler to receive and process webhooks from Mailshake using an Express server. ```javascript const express = require('express'); const bodyParser = require('body-parser'); const mailshake = require('mailshake-node')('my-api-key'); const PushHandler = require('mailshake-node').PushHandler; // Initialize your express app, making sure to include bodyParser const app = express(); app.use(bodyParser.json({})); // Set up how your site is being hosted const handler = new PushHandler(mailshake, { baseUrl: 'https://mailshake-test.ngrok.io', rootPath: 'pushes', secret: 'my-secret' }); // Listen when pushes are received and take action handler.on('push', push => { console.log(JSON.stringify(push, null, 2)); }); // Listen when there was some kind of error handling a push handler.on('pushError', err => { console.error(`${err.code}: ${err.stack}`); }); // Hook it up handler.hookExpress(app); // Start your server const port = 80; app.listen(port); console.log(`Listening on http://127.0.0.1:${port}`); ``` -------------------------------- ### Manage Lead Lifecycle Source: https://context7.com/mailshake/mailshake-node/llms.txt Provides methods to change the status of a lead. Use 'close' for won deals, 'reopen' for closed leads, and 'ignore' for unqualified leads. ```javascript const mailshake = require('mailshake-node')('my-api-key'); // Close a lead (mark as won/converted) mailshake.leads.close({ leadID: 98765 }) .then(() => console.log('Lead closed')) .catch((err) => console.error(`${err.code}: ${err.message}`)); // Reopen a closed lead mailshake.leads.reopen({ leadID: 98765 }) .then(() => console.log('Lead reopened')) .catch((err) => console.error(`${err.code}: ${err.message}`)); // Ignore an unqualified lead mailshake.leads.ignore({ leadID: 98765 }) .then(() => console.log('Lead ignored')) .catch((err) => console.error(`${err.code}: ${err.message}`)); ``` -------------------------------- ### Configure OAuth support Source: https://github.com/mailshake/mailshake-node/blob/master/README.md Customize or override request creation to support OAuth authentication flows. ```javascript const mailshake = require('mailshake-node')({ customizeRequest(options) => { // options.headers.authorization = [...oauth header...] return options; }), // or overrideCreateRequest(options, callbackFn) => { return https(options, callbackFn); }), }); ``` -------------------------------- ### Set Up PushHandler for Webhooks with Express.js Source: https://context7.com/mailshake/mailshake-node/llms.txt Configure real-time webhook notifications using the `PushHandler` class with Express.js. This handler manages subscription URLs and event routing for incoming Mailshake events. Requires Express and body-parser. ```javascript const express = require('express'); const bodyParser = require('body-parser'); const mailshake = require('mailshake-node')('my-api-key'); const PushHandler = require('mailshake-node').PushHandler; const app = express(); app.use(bodyParser.json()); // Configure the push handler const handler = new PushHandler(mailshake, { baseUrl: 'https://your-server.com', rootPath: 'webhooks/mailshake', secret: 'your-webhook-secret-key' }); // Listen for push events handler.on('push', (push) => { console.log('Received push event:', push.event); console.log('Data:', JSON.stringify(push, null, 2)); // Handle different event types if (push.type === 'Clicked') { console.log(`${push.recipient.emailAddress} clicked a link`); } else if (push.type === 'Replied') { console.log(`${push.recipient.emailAddress} replied to email`); } }); handler.on('pushError', (err) => { console.error(`Push error: ${err.code}: ${err.stack}`); }); // Register routes with Express handler.hookExpress(app); app.listen(3000, () => { console.log('Server running on port 3000'); }); ``` -------------------------------- ### activity.clicks Source: https://context7.com/mailshake/mailshake-node/llms.txt Monitor link click events. ```APIDOC ## activity.clicks ### Description Monitor link click events to track recipient engagement with your email content. ### Parameters #### Request Body - **campaignID** (number) - Required - The ID of the campaign. ``` -------------------------------- ### activity.opens Source: https://context7.com/mailshake/mailshake-node/llms.txt Track email open events. ```APIDOC ## activity.opens ### Description Track email open events across campaigns with optional filtering by campaign, recipient, or date range. ### Parameters #### Request Body - **campaignID** (number) - Required - The ID of the campaign. - **perPage** (number) - Optional - Number of results per page. ``` -------------------------------- ### Lead Management API Source: https://context7.com/mailshake/mailshake-node/llms.txt Retrieve, fetch details, create, close, reopen, or ignore leads. ```APIDOC ## GET /leads ### Description Retrieves a list of leads with optional filtering by campaign, status, or assignment. ### Method GET ### Endpoint /leads ### Parameters #### Query Parameters - **campaignID** (integer) - Optional - Filter leads by campaign ID. - **status** (string) - Optional - Filter leads by status (e.g., 'open'). ### Response #### Success Response (200) - **results** (array) - An array of lead objects. - **emailAddress** (string) - The email address of the lead. - **created** (string) - The creation timestamp of the lead. - **assignedToEmailAddress** (string) - The email address of the assigned user, if any. #### Response Example ```json { "results": [ { "emailAddress": "john@example.com", "created": "2023-10-27T10:00:00Z", "assignedToEmailAddress": "sales@example.com" } ] } ``` ## GET /leads/{leadID} ### Description Fetches detailed information about a specific lead, including activity and conversation history. ### Method GET ### Endpoint /leads/{leadID} ### Parameters #### Path Parameters - **leadID** (integer) - Required - The ID of the lead to retrieve. ### Response #### Success Response (200) - **emailAddress** (string) - The email address of the lead. - **status** (string) - The current status of the lead. - **campaign** (object) - Information about the associated campaign. - **title** (string) - The title of the campaign. - **fields** (object) - Custom fields for the lead. - **firstName** (string) - The first name of the lead. - **lastName** (string) - The last name of the lead. #### Response Example ```json { "emailAddress": "john@example.com", "status": "open", "campaign": { "title": "Spring Promotion" }, "fields": { "firstName": "John", "lastName": "Doe" } } ``` ## POST /leads ### Description Manually creates a new lead associated with a recipient in a campaign. ### Method POST ### Endpoint /leads ### Parameters #### Request Body - **recipientID** (integer) - Required - The ID of the recipient to associate the lead with. ### Request Example ```json { "recipientID": 11111 } ``` ### Response #### Success Response (200) - **id** (integer) - The ID of the newly created lead. - **status** (string) - The status of the newly created lead. #### Response Example ```json { "id": 98765, "status": "new" } ``` ## POST /leads/close ### Description Closes a lead, marking it as won or converted. ### Method POST ### Endpoint /leads/close ### Parameters #### Request Body - **leadID** (integer) - Required - The ID of the lead to close. ### Request Example ```json { "leadID": 98765 } ``` ## POST /leads/reopen ### Description Reopens a closed lead, making it active for further outreach. ### Method POST ### Endpoint /leads/reopen ### Parameters #### Request Body - **leadID** (integer) - Required - The ID of the lead to reopen. ### Request Example ```json { "leadID": 98765 } ``` ## POST /leads/ignore ### Description Ignores an unqualified lead, removing it from active consideration. ### Method POST ### Endpoint /leads/ignore ### Parameters #### Request Body - **leadID** (integer) - Required - The ID of the lead to ignore. ### Request Example ```json { "leadID": 98765 } ``` ``` -------------------------------- ### List Leads with Filtering Source: https://context7.com/mailshake/mailshake-node/llms.txt Retrieves a list of leads, with options to filter by campaign ID or status. Requires campaignID and optionally accepts status. ```javascript const mailshake = require('mailshake-node')('my-api-key'); mailshake.leads.list({ campaignID: 12345, status: 'open' }) .then((result) => { console.log('Open leads:', result.results.length); result.results.forEach((lead) => { console.log(`- ${lead.emailAddress}`); console.log(` Created: ${lead.created}`); console.log(` Assigned to: ${lead.assignedToEmailAddress || 'Unassigned'}`); }); }) .catch((err) => { console.error(`${err.code}: ${err.message}`); }); ``` -------------------------------- ### List Senders with Mailshake SDK Source: https://context7.com/mailshake/mailshake-node/llms.txt Fetch all configured sender email addresses available for use in campaigns. This helps in managing and verifying sender identities. Requires SDK initialization with an API key. ```javascript const mailshake = require('mailshake-node')('my-api-key'); mailshake.senders.list() .then((result) => { console.log('Available senders:'); result.results.forEach((sender) => { console.log(`- ${sender.emailAddress} (ID: ${sender.id})`); console.log(` Name: ${sender.fromName}`); console.log(` Verified: ${sender.isVerified}`); }); }) .catch((err) => { console.error(`${err.code}: ${err.message}`); }); ``` -------------------------------- ### Configure OAuth Authentication Source: https://context7.com/mailshake/mailshake-node/llms.txt Use custom request handlers to inject OAuth tokens or override the default HTTP request mechanism. ```javascript const mailshake = require('mailshake-node')({ customizeRequest(options) { // Add OAuth authorization header options.headers.authorization = 'Bearer your-oauth-token'; return options; } }); // Or completely override the request mechanism const mailshakeCustom = require('mailshake-node')({ overrideCreateRequest(options, callbackFn) { // Use your own HTTP client return customHttpClient.request(options, callbackFn); } }); ``` -------------------------------- ### Manually Create and Delete Push Subscriptions Source: https://context7.com/mailshake/mailshake-node/llms.txt Directly manage subscriptions using the push.create and push.delete methods for custom implementations. ```javascript const mailshake = require('mailshake-node')('my-api-key'); // Create a push subscription mailshake.push.create({ targetUrl: 'https://your-server.com/hooks/mailshake/clicked-12345', event: 'Clicked', filter: { campaignID: 12345 } }) .then(() => { console.log('Push subscription created'); }) .catch((err) => { console.error(`${err.code}: ${err.message}`); }); // Delete a push subscription mailshake.push.delete({ targetUrl: 'https://your-server.com/hooks/mailshake/clicked-12345' }) .then(() => { console.log('Push subscription deleted'); }) .catch((err) => { console.error(`${err.code}: ${err.message}`); }); ``` -------------------------------- ### Subscribe to push events Source: https://github.com/mailshake/mailshake-node/blob/master/README.md Register for specific event types to receive notifications via the configured PushHandler. ```javascript handler .subscribe('Clicked', { // Filter options }) .then((targetUrl) => { // Store targetUrl somewhere so you can unsubscribe later }) .catch((err) => { console.error(`${err.code}: ${err.stack}`); }); ``` -------------------------------- ### Export Campaign Data Asynchronously Source: https://context7.com/mailshake/mailshake-node/llms.txt Initiates an asynchronous export of campaign data. Use the returned statusID to poll for completion and retrieve the download URL. ```javascript const mailshake = require('mailshake-node')('my-api-key'); // Start export mailshake.campaigns.export({ campaignID: 12345 }) .then((exportResult) => { console.log('Export started, status ID:', exportResult.statusID); // Poll for completion const checkStatus = () => { return mailshake.campaigns.exportStatus({ statusID: exportResult.statusID }) .then((status) => { if (status.isFinished) { console.log('Export complete:', status.downloadUrl); return status; } console.log('Export in progress...'); return new Promise(resolve => setTimeout(resolve, 2000)) .then(checkStatus); }); }; return checkStatus(); }) .catch((err) => { console.error(`${err.code}: ${err.message}`); }); ``` -------------------------------- ### Subscribe to push notifications Source: https://github.com/mailshake/mailshake-node/blob/master/README.md Create a new push subscription for a specific event and filter. ```javascript return mailshake.push .create({ targetUrl: '[a unique url for this push to store for later so you can unsubscribe]', event: 'Clicked', filter: { // Filter options }, }) .then((result) => { // Nothing really to do here }) .catch((err) => { console.error(`${err.code}: ${err.message}`); }); ``` -------------------------------- ### Pause and Resume Campaigns Source: https://context7.com/mailshake/mailshake-node/llms.txt Toggle campaign activity status using pause and unpause methods. ```javascript const mailshake = require('mailshake-node')('my-api-key'); // Pause a campaign mailshake.campaigns.pause({ campaignID: 12345 }) .then(() => { console.log('Campaign paused successfully'); }) .catch((err) => { console.error(`${err.code}: ${err.message}`); }); // Resume a paused campaign mailshake.campaigns.unpause({ campaignID: 12345 }) .then(() => { console.log('Campaign resumed successfully'); }) .catch((err) => { console.error(`${err.code}: ${err.message}`); }); ``` -------------------------------- ### Handle paginated results Source: https://github.com/mailshake/mailshake-node/blob/master/README.md Use the attached next() method on result objects to fetch subsequent pages of data. ```javascript mailshake.campaigns.list() .then((result) => { console.log(`Page 1: ${JSON.stringify(result, null, 2)}`); // Just call `next` to get the next page of data return result.next(); }) .then((result) => { console.log(`Page 2: ${JSON.stringify(result, null, 2)}`); }); ``` -------------------------------- ### Campaign Export API Source: https://context7.com/mailshake/mailshake-node/llms.txt Initiate an asynchronous export of campaign data and poll for its status to retrieve the download URL. ```APIDOC ## POST /campaigns/export ### Description Starts an asynchronous export of campaign data. Returns a status ID to track the export progress. ### Method POST ### Endpoint /campaigns/export ### Parameters #### Request Body - **campaignID** (integer) - Required - The ID of the campaign to export. ### Request Example ```json { "campaignID": 12345 } ``` ### Response #### Success Response (200) - **statusID** (string) - The ID to poll for export status. #### Response Example ```json { "statusID": "export_status_id_123" } ``` ## GET /campaigns/exportStatus ### Description Polls the status of an asynchronous campaign data export. If the export is complete, it provides the download URL. ### Method GET ### Endpoint /campaigns/exportStatus ### Parameters #### Query Parameters - **statusID** (string) - Required - The status ID obtained from the `/campaigns/export` endpoint. ### Response #### Success Response (200) - **isFinished** (boolean) - Indicates if the export is complete. - **downloadUrl** (string) - The URL to download the exported data (available if isFinished is true). #### Response Example ```json { "isFinished": true, "downloadUrl": "https://example.com/path/to/export.zip" } ``` ``` -------------------------------- ### Handle Webhooks with pushHandlerExpress Source: https://context7.com/mailshake/mailshake-node/llms.txt Use the convenience function to resolve push notifications and handle Express responses automatically. ```javascript const mailshake = require('mailshake-node')('my-api-key'); const pushHandlerExpress = require('mailshake-node').pushHandlerExpress; app.post('/webhooks/mailshake', (req, res) => { pushHandlerExpress(mailshake, req.body, res) .then((result) => { // Response already sent (200 OK) console.log('Push processed:', result.type); // Handle the event switch (result.type) { case 'Clicked': console.log(`Click from ${result.recipient.emailAddress}`); break; case 'Replied': console.log(`Reply from ${result.recipient.emailAddress}`); break; case 'Opened': console.log(`Open from ${result.recipient.emailAddress}`); break; } }) .catch((err) => { // Response already sent (500 error) console.error(`Push error: ${err.code}: ${err.message}`); }); }); ``` -------------------------------- ### Create a New Lead Source: https://context7.com/mailshake/mailshake-node/llms.txt Manually creates a new lead associated with a specific recipient in a campaign. Requires the recipientID. ```javascript const mailshake = require('mailshake-node')('my-api-key'); mailshake.leads.create({ recipientID: 11111 }) .then((lead) => { console.log('Lead created with ID:', lead.id); console.log('Status:', lead.status); }) .catch((err) => { console.error(`${err.code}: ${err.message}`); }); ``` -------------------------------- ### List Campaigns Source: https://context7.com/mailshake/mailshake-node/llms.txt Retrieve a paginated list of campaigns, optionally filtered by a search term. ```javascript const mailshake = require('mailshake-node')('my-api-key'); mailshake.campaigns.list({ search: 'Q4 Outreach' }) .then((result) => { console.log('Campaigns found:', result.results.length); result.results.forEach((campaign) => { console.log(`- ${campaign.title} (ID: ${campaign.id})`); console.log(` Status: ${campaign.isPaused ? 'Paused' : 'Active'}`); console.log(` Created: ${campaign.created}`); }); }) .catch((err) => { console.error(`${err.code}: ${err.message}`); }); ``` -------------------------------- ### Activity Monitoring API Source: https://context7.com/mailshake/mailshake-node/llms.txt Endpoints to monitor lead-related activity including new leads, status changes, and team assignments. ```APIDOC ## activity.createdLeads / activity.leadStatusChanges / activity.leadAssignments ### Description Monitor lead-related activity including new leads, status changes, and team assignments. ### Parameters #### Request Body - **campaignID** (number) - Required - The ID of the campaign to filter activities. ``` -------------------------------- ### activity.replies Source: https://context7.com/mailshake/mailshake-node/llms.txt Retrieve email reply events. ```APIDOC ## activity.replies ### Description Retrieve email reply events to identify engaged prospects and manage follow-up conversations. ### Parameters #### Request Body - **campaignID** (number) - Required - The ID of the campaign. ``` -------------------------------- ### List Team Members with Mailshake SDK Source: https://context7.com/mailshake/mailshake-node/llms.txt Retrieve a list of all team members in your Mailshake account. This is useful for managing assignments and permissions. The SDK must be initialized with an API key. ```javascript const mailshake = require('mailshake-node')('my-api-key'); mailshake.team.listMembers() .then((result) => { console.log('Team members:', result.results.length); result.results.forEach((member) => { console.log(`- ${member.emailAddress}`); console.log(` Name: ${member.firstName} ${member.lastName}`); console.log(` Role: ${member.role}`); }); }) .catch((err) => { console.error(`${err.code}: ${err.message}`); }); ``` -------------------------------- ### POST /campaigns.pause / campaigns.unpause Source: https://context7.com/mailshake/mailshake-node/llms.txt Control campaign execution by pausing or resuming email sending. ```APIDOC ## POST /campaigns.pause / campaigns.unpause ### Description Control campaign execution by pausing or resuming email sending. Paused campaigns stop sending scheduled emails until unpaused. ### Method POST ### Endpoint campaigns.pause / campaigns.unpause ### Parameters #### Request Body - **campaignID** (integer) - Required - The unique identifier of the campaign. ``` -------------------------------- ### Push Subscriptions with PushHandler Source: https://context7.com/mailshake/mailshake-node/llms.txt Subscribe to specific Mailshake events and receive real-time notifications. The PushHandler class simplifies subscription and unsubscription management. ```APIDOC ## Push Subscriptions with PushHandler Subscribe to specific Mailshake events to receive real-time notifications. Each subscription returns a unique target URL for later unsubscription. ### Method POST ### Endpoint `/webhooks` (Implicitly handled by PushHandler) ### Parameters #### Request Body (for subscribe method) - **event** (string) - Required - The type of event to subscribe to (e.g., 'Clicked', 'Replied'). - **filter** (object) - Optional - Criteria to filter events. - **campaignID** (integer) - Required within filter - The ID of the campaign to monitor. ### Request Example (Subscribe) ```javascript const mailshake = require('mailshake-node')('my-api-key'); const PushHandler = require('mailshake-node').PushHandler; const handler = new PushHandler(mailshake, { baseUrl: 'https://your-server.com', rootPath: 'webhooks', secret: 'secret123' }); // Subscribe to click events for a specific campaign handler.subscribe('Clicked', { campaignID: 12345 }) .then((targetUrl) => { console.log('Subscribed to clicks at:', targetUrl); // Store targetUrl for later unsubscription return targetUrl; }) .catch((err) => { console.error(`${err.code}: ${err.message}`); }); ``` ### Request Example (Unsubscribe) ```javascript // Unsubscribe when no longer needed const savedTargetUrl = 'https://your-server.com/webhooks/secret123/unique-id'; handler.unsubscribe(savedTargetUrl) .then(() => { console.log('Successfully unsubscribed'); }) .catch((err) => { console.error(`${err.code}: ${err.message}`); }); ``` ### Response (Subscribe) - **targetUrl** (string) - The unique URL for the new subscription. ``` -------------------------------- ### Track Email Opens Source: https://context7.com/mailshake/mailshake-node/llms.txt Retrieve a list of email open events for a campaign. Supports filtering by campaign and setting the number of results per page. ```javascript const mailshake = require('mailshake-node')('my-api-key'); mailshake.activity.opens({ campaignID: 12345, perPage: 50 }) .then((result) => { console.log('Email opens:', result.results.length); result.results.forEach((open) => { console.log(`- ${open.recipient.emailAddress}`); console.log(` Opened at: ${open.actionDate}`); console.log(` Message: ${open.message.subject}`); }); }) .catch((err) => { console.error(`${err.code}: ${err.message}`); }); ``` -------------------------------- ### Express Webhook Handler (pushHandlerExpress) Source: https://context7.com/mailshake/mailshake-node/llms.txt A convenience function that combines push resolution with Express response handling in a single call, simplifying webhook processing in Express applications. ```APIDOC ## pushHandlerExpress A convenience function that combines push resolution with Express response handling in a single call. ### Method POST (Implicitly used when calling `pushHandlerExpress`) ### Endpoint (Your application's webhook endpoint, e.g., `/webhooks/mailshake`) ### Parameters - **mailshakeInstance** (object) - Required - An initialized Mailshake SDK instance. - **receivedPush** (object) - Required - The raw webhook payload received. - **response** (object) - Required - The Express response object. ### Request Example ```javascript const mailshake = require('mailshake-node')('my-api-key'); const pushHandlerExpress = require('mailshake-node').pushHandlerExpress; app.post('/webhooks/mailshake', (req, res) => { pushHandlerExpress(mailshake, req.body, res) .then((result) => { // Response already sent (200 OK) console.log('Push processed:', result.type); // Handle the event switch (result.type) { case 'Clicked': console.log(`Click from ${result.recipient.emailAddress}`); break; case 'Replied': console.log(`Reply from ${result.recipient.emailAddress}`); break; case 'Opened': console.log(`Open from ${result.recipient.emailAddress}`); break; } }) .catch((err) => { // Response already sent (500 error) console.error(`Push error: ${err.code}: ${err.message}`); }); }); ``` ### Response #### Success Response (200) - The function automatically sends a 200 OK response upon successful processing. #### Error Response (500) - The function automatically sends a 500 error response if processing fails. ``` -------------------------------- ### Retrieve Email Replies Source: https://context7.com/mailshake/mailshake-node/llms.txt Fetch email reply events for a campaign, including sender information, subject, and whether the reply was positive. ```javascript const mailshake = require('mailshake-node')('my-api-key'); mailshake.activity.replies({ campaignID: 12345 }) .then((result) => { console.log('Replies received:', result.results.length); result.results.forEach((reply) => { console.log(`- From: ${reply.recipient.emailAddress}`); console.log(` Subject: ${reply.subject}`); console.log(` Received: ${reply.actionDate}`); console.log(` Is positive: ${reply.isPositive}`); }); }) .catch((err) => { console.error(`${err.code}: ${err.message}`); }); ``` -------------------------------- ### Add Recipients to Campaign Asynchronously Source: https://context7.com/mailshake/mailshake-node/llms.txt Adds new recipients to a campaign. This is an asynchronous operation; use the returned statusID to track progress. ```javascript const mailshake = require('mailshake-node')('my-api-key'); mailshake.recipients.add({ campaignID: 12345, addAsNewList: true, addresses: [ { emailAddress: 'john@example.com', firstName: 'John', lastName: 'Doe', company: 'Acme Inc' }, { emailAddress: 'jane@example.com', firstName: 'Jane', lastName: 'Smith', company: 'Tech Corp' } ] }) .then((result) => { console.log('Add operation started, status ID:', result.statusID); }) .catch((err) => { console.error(`${err.code}: ${err.message}`); }); ``` -------------------------------- ### recipients.get Source: https://context7.com/mailshake/mailshake-node/llms.txt Fetch detailed information about a specific recipient. ```APIDOC ## recipients.get ### Description Fetch detailed information about a specific recipient including their complete activity history. ### Parameters #### Request Body - **recipientID** (number) - Required - The ID of the recipient. ``` -------------------------------- ### activity.sent Source: https://context7.com/mailshake/mailshake-node/llms.txt Track sent emails. ```APIDOC ## activity.sent ### Description Track all sent emails for auditing and delivery monitoring purposes. ### Parameters #### Request Body - **campaignID** (number) - Required - The ID of the campaign. - **perPage** (number) - Optional - Number of results per page. ``` -------------------------------- ### Track Link Clicks Source: https://context7.com/mailshake/mailshake-node/llms.txt Monitor link click events within emails for a given campaign to understand recipient engagement. ```javascript const mailshake = require('mailshake-node')('my-api-key'); mailshake.activity.clicks({ campaignID: 12345 }) .then((result) => { console.log('Link clicks:', result.results.length); result.results.forEach((click) => { console.log(`- ${click.recipient.emailAddress}`); console.log(` Clicked: ${click.url}`); console.log(` At: ${click.actionDate}`); }); }) .catch((err) => { console.error(`${err.code}: ${err.message}`); }); ``` -------------------------------- ### Handle push notifications with Express Source: https://github.com/mailshake/mailshake-node/blob/master/README.md Use the pushHandlerExpress function to process push details and communicate receipt status within an Express route handler. ```javascript const pushHandlerExpress = require('mailshake-node').pushHandlerExpress; // NOTE: Put this code inside the handler for your endpoint: pushHandlerExpress(mailshake, receivedPush, response) .then((result) => { console.log(JSON.stringify(result, null, 2)); }) .catch((err) => { console.error(`${err.code}: ${err.message}`); }); ``` -------------------------------- ### List Campaign Recipients Source: https://context7.com/mailshake/mailshake-node/llms.txt Retrieve a list of recipients for a specific campaign. Supports filtering by status (e.g., 'paused') and pagination. ```javascript const mailshake = require('mailshake-node')('my-api-key'); mailshake.recipients.list({ campaignID: 12345, filter: 'paused' }) .then((result) => { console.log('Recipients:', result.results.length); result.results.forEach((recipient) => { console.log(`- ${recipient.emailAddress}`); console.log(` Status: ${recipient.isPaused ? 'Paused' : 'Active'}`); console.log(` Sent: ${recipient.sent}, Opens: ${recipient.opened}`); }); }) .catch((err) => { console.error(`${err.code}: ${err.message}`); }); ``` -------------------------------- ### Handle Mailshake API Errors with Promises Source: https://context7.com/mailshake/mailshake-node/llms.txt Use the .catch() method on Promises returned by Mailshake API calls to handle errors. The error object contains 'code', 'message', and 'time' properties. Handle specific error codes using a switch statement. ```javascript const mailshake = require('mailshake-node')('my-api-key'); mailshake.campaigns.get({ campaignID: 99999 // Non-existent campaign }) .then((campaign) => { console.log('Campaign:', campaign.title); }) .catch((err) => { // err.code contains the Mailshake API error code // err.message contains the human-readable error message // err.time contains the server timestamp console.error('Error code:', err.code); console.error('Error message:', err.message); // Handle specific error codes switch (err.code) { case 'not_found': console.log('Campaign does not exist'); break; case 'invalid_api_key': console.log('Check your API key'); break; case 'rate_limit_exceeded': console.log('Too many requests, please slow down'); break; default: console.log('Unexpected error occurred'); } }); ``` -------------------------------- ### recipients.list Source: https://context7.com/mailshake/mailshake-node/llms.txt Retrieve a list of recipients for a specific campaign with optional filtering. ```APIDOC ## recipients.list ### Description Retrieve recipients for a campaign with optional filtering and pagination support. ### Parameters #### Request Body - **campaignID** (number) - Required - The ID of the campaign. - **filter** (string) - Optional - Filter criteria (e.g., 'paused'). ``` -------------------------------- ### Resolve push notification data Source: https://github.com/mailshake/mailshake-node/blob/master/README.md Fetch the full data associated with a received push notification. ```javascript const resolvePush = require('mailshake-node').resolvePush; resolvePush(mailshake, { // The object Mailshake sent your server }) .then((result) => { console.log(JSON.stringify(result, null, 2)); }) .catch((err) => { console.error(`${err.code}: ${err.message}`); }); ```