Distribution

Scheduled Email Sharing

This example shows how to use the Mode API to create an email schedule and subscribe people by adding their emails. You can use this example to create multiple schedules with different parameter values, to add a batch of emails to a schedule, or both.

Endpoints used

.../{organization}/reports/{report_token}/subscriptions
Supported methods:

  • GET: returns all schedules for the given report
  • POST: creates a new schedule

.../{organization}/reports/{report_token}/subscriptions/{subscription_token}
Supported methods:

  • GET: returns a schedule
  • PATCH: updates a schedule

.../{organization}/reports/{report_token}/subscriptions/{subscription_token}/email_memberships
Supported methods:

  • GET: returns all emails subscribed to a given schedule
  • POST: subscribe an email to a schedule
  • PATCH: updates emails subscribed to a schedule

How this example works

In this example, the create_email_schedule method first makes a POST request to app.mode.com/api/{organization}/reports/{report_token}/subscriptions, creating a schedule. You can specify the time interval, preferences for CSV/PDF/preview/report links, and parameter values in the payload. We then make a GET request to that same endpoint so it returns all schedules for the report. We look at the first schedule on the list, the most recently created one, and get its subscription token. This subscription token lets us add emails to this subscription by making a subsequent POST request to app.mode.com/api/{organization}/reports/{report_token}/subscriptions/{subscription_token}/email_memberships.

To try it yourself

  • Download the example code to a .py file
  • Input your API token, API secret, organization name, and other custom information as needed. An API token and secret can be generated here
  • Save the .py file in your desired directory
  • Open the terminal and navigate to that directory
  • Run the command python3 {file_name}.py
  • All of our Python recipes require Python 3
import json
import requests

from requests.auth import HTTPBasicAuth

host = 'https://modeanalytics.com'
org = 'org_name'
un = 'api_token'
pw = 'api_secret'


def create_email_schedule(report_token, email):
  #create schedule and set up parameters the schedule should be run with
  url = '%s/api/%s/reports/%s/subscriptions' % (host, org, report_token)
  headers = {'Content-Type': 'application/json'}
  payload = {'report_subscription': {
               'csv_attachments_enabled':'false',
               'data_previews_enabled': 'true',
               'data_tables_enabled':'false',
               'pdf_attachments_enabled':'false',
               'report_links_enabled':'true',
               'report_schedule':{
                 'cron':{
                   'freq': 'daily',
                   'hour': 14,
                   'time_zone': 'UTC',
                   'day_of_week': 1,
                   'day_of_month': 1,
                   'minute': 0
                 },
                 # params optional
                 'params':{
                   'foo': 'bar'
                 },
                 'timeout':900
               }
             },
             'trk_source':'report'
            }
  r = requests.post(url, headers=headers, auth=HTTPBasicAuth(un, pw), json=payload)
  #get the newest report subscription token and path
  r = requests.get(url, headers=headers, auth=HTTPBasicAuth(un, pw))
  result = r.json()
  subscription_path = result['_embedded']['report_subscriptions'][0]['_links']['self']['href']
  #optional - subscribe an email to the schedule
  subscribe_email(subscription_path, email)

  return

#subscribe an email to the schedule
def subscribe_email(subscription_path, email):
  url = '%s%s/email_memberships' % (host, subscription_path)
  headers = {'Content-Type': 'application/json'}
  payload = {'membership': {'subscriber_email': email}, 'trk_source':'report'}
  r = requests.post(url, headers=headers, auth=HTTPBasicAuth(un, pw), json=payload)
  return r.status_code



create_email_schedule('report_token', 'email_address')
const request = require('request-promise');

const host = 'https://modeanalytics.com';
const org = 'orgName';
const username = 'apiToken';
const password = 'apiSecret';

const createEmailSchedule = async (reportToken, email) => {
  // create schedule and set up parameters the schedule should be run with
  const reportSubscription = {
    report_subscription: {
      csv_attachments_enabled: false,
      data_previews_enabled: true,
      data_tables_enabled: false,
      pdf_attachments_enabled: false,
      report_links_enabled: true,
      report_schedule: {
        cron: {
          freq: 'daily',
          hour: 14,
          time_zone: 'UTC',
          day_of_week: 1,
          day_of_month: 1,
          minute: 0
        },
        // params optional
        params: {
          'foo': 'bar'
        },
        timeout: 900,
      },
    },
    trk_source: 'report',
  };
  const res = await request({
    method: 'POST',
    url: `${host}/api/${org}/reports/${reportToken}/subscriptions`,
    auth: { username, password },
    json: true,
    body: reportSubscription,
  });
  // get the newest report subscription token and path
  const subscriptions = await request({
    url: `${host}/api/${org}/reports/${reportToken}/subscriptions`,
    auth: { username, password },
    json: true,
  });
  const subscriptionPath = subscriptions._embedded.report_subscriptions[0]._links.self.href;
  // optional - subscribe an email to the schedule
  return await subscribeEmail(subscriptionPath, email);
};

// subscribe an email to the schedule
const subscribeEmail = async (subscriptionPath, email) => {
  const payload = {
    membership: { subscriber_email: email },
    trk_source: 'report',
  };
  return await request({
    method: 'POST',
    url: `${host}${subscriptionPath}/email_memberships`,
    auth: { username, password },
    json: true,
    body: payload,
  }).status_code;
};

createEmailSchedule('reportToken', 'emailAddress');