Periscope Data Documentation

Connecting to Periscope

First Time Connecting

Connection Definitions

Common Connection Errors

Private Network SSH Tunnels



Getting Started

Keyboard Shortcuts

Charts & Dashboards

Chart Overview

Chart Options

Dashboard Overview

Refresh Mechanics

Organizing Charts

Organizing Dashboards

Table-like Charts

Table Overview

Cohort Grids

Pivot Tables

Graph-like Charts

Overview & General Settings

Chart Types and Settings

Mixing Chart Types

Map Charts

Map Chart Overview


Clusters and Bubbles

Satellite Maps


Other Charts & Customizations

Pie Charts

Image Charts

Chart Annotations

Site Administration

Adding Users

Removing Users

User Types

User Groups

Two-Factor Authentication

Managing User Permissions

Dashboard Permissions

Site Preferences

Query Management

Periscope Cache

Caching Strategies

Querying the Periscope Cache

Cross-Database Joins

CSV Upload

Materializing Views

SQL Formatters

Using SQL Formatters

Composing SQL Formatters

Dollars and Percentages

Time Zone Formatters

Date Aggregation

Date Parts

Basic Filters

Custom Filters

Date Range Filters

Aggregation Filter

Adding, Moving, and Hiding Filters

Advanced Filters

Default Filters


Parent-Child Filters

Matching Filter Values

Time Zone Conversions

Direct Replacement

User Friendly Names


SQL Views

Joining to Views

More SQL Tools

SQL Snippets

Parameterized SQL Snippets

SQL Alerts

Automatic Joins

Sharing and Embedding

Sharing Dashboards Externally

Email Reports

Easy Embedding

Embed API

Embed API Options

Public CSV URL

Slack API

Slack Linking Reports

Data Management

Adding and Deleting Datasource

Spaces: Data-Level Permissions

Improving Query Throughput

Revoking Table Permissions

Salesforce Datasource

Schema Browser

SSO Integrations




Google Apps

Embed API - Embed Options


The dashboard number can be found in the dashboard's URL. i.e. if the URL looks like

then the dashboard number is 10, and the JSON blob will say

"dashboard": 10,

Embed Version

The default embed version is "true." In case the extra padding from the embed should be removed, use embed version "v2":

"embed": "v2"

Daterange Filter

When using the pre-built daterange filter options or selecting a number of days before the current date, include it using:

"daterange": {"days": 7}

When using a custom range, the user must specify the start and end dates:

"daterange": {"start": "2015-01-01", "end": "2015-01-01"}

Aggregation Filter

To include the dashboard aggregation in the JSON blob, add the following on its own line in the blob:

"aggregation": "daily"

Custom Filters

If the user wants to pass custom filters to the embed, include them like so:

"filters": [{"name": "Filter1", "value": "value1"}, {"name": "Filter2", "value": "1234"}]

If there are multiple filter values to be included for the same filter, there are the options to either include it twice or pass an array:

"filters": [{"name": "Filter1", "value": "1234"}, {"name": "Filter1", "value": "5678"}]
"filters": [{"name": "Filter1", "value": ["1234", "5678"]}]

To embed child filters, an additional parameter that specifies the group (parent value) must be included. This will always be equivalent to the value of the parent filter being embedded:

"filters": [{"name": "ParentFilter", "value": 1234}, {"name": "ChildFilter", "value": "5678", "group": "1234"}]

When using filters in the chart titles, the display value, which is populated into the chart title, must be included. The JSON blob cannot be used with the array syntax to ensure proper parsing:

"filters": [{"name": "Filter1", "value": "1234", "display": "Display1"}]

Unused Filters

If the user is not using a filter, simply omit it from the blob and no value will be passed for it.

Visible Filters

If the filters should be accessible to the end user of the embed, include the filter names in the JSON blob as visible filters. The selected filters must be visible on the underlying dashboard in Periscope as well.

"visible": ["Filter2", "Filter3", "aggregation", "daterange"]

Chart Borders

Turn chart borders off by setting them to off:

"border": "off"

Data Latency

Embedded dashboards automatically refresh in the background. If there are special requirements around the freshness of the data, add a time threshold to the request:

"data_ts": 1446069112

The data_ts value is integer seconds since the epoch (Note: millisecond precision is not supported). Charts with data older than this timestamp will show loading and get scheduled to refresh when page loads.

Expiration Date

Limit how long the embedded dashboard link is valid with

"expires_at": 1456069112

The expires_at value is integer seconds since the epoch. Accessing the embedded dashboard after this time will show a message explaining the dashboard has expired.

Putting It All Together

After each piece is assembled, the final product will look something like this:

    "dashboard": 7863,
    "embed": "v2",
    "aggregation": "daily",
    "daterange": {"start": "2015-01-01", "end": "2015-01-01"},
    "filters": [{"name": "Filter1", "value": "value1"}, {"name": "Filter2", "value": "1234"}],
    "visible": ["Filter2", "Filter3", "aggregation", "daterange"],
    "border": "off",
    "data_ts": 1446069112,
    "expires_at": 1456069112


Embedded dashboards release two different PostMessages to communicate with the outer webpage.

Embedded Dashboard Size

Upon page load, Periscope will send a PostMessage with the size of the dashboard. The message will be in the following format, with the height and width of the dashboard, which can then be used to properly size the iFrame for the embed.

    event_type: "dashboard_resize", 
    dashboard_height: 100, 
    dashboard_width: 200 

Embedded Drilldown

When a user clicks on an embedded chart with drilldowns enabled, Periscope will send a PostMessage in the following format. The PostMessage contains the new dashboard ID and the new/updated filters and values. The webpage code can use this information to update the JSON used to create the embedded URL.

    event_type: "drilldown", 
    destination_dashboard_id: 1234, 
    filter_values: [{filter_name: "foo", column_value: "bar"}, ... ]

With the information from the PostMessage, the website code can be written to create a new JSON to create a new URL for the target dashboard. This new JSON blob has the same available parameters from above, and is entirely controlled by the user.