Export Canvas data summary analytics
/canvas/data_summary
Use this endpoint to export rollups of time series data for a Canvas, providing a concise summary of Canvas results.
Prerequisites
To use this endpoint, you’ll need an API key with the canvas.data_summary permission.
Rate limit
We apply the default Braze rate limit of 250,000 requests per hour to this endpoint, as documented in API rate limits.
Request parameters
| Parameter | Required | Data Type | Description |
|---|---|---|---|
canvas_id |
Required | String | See Canvas API identifier. |
ending_at |
Required | Datetime (ISO-8601 string) |
End date for the data export. Defaults to the time of the request. |
starting_at |
Optional* | Datetime (ISO-8601 string) |
Start date for the data export. * Either length or starting_at is required. |
length |
Optional* | String | Maximum number of days before ending_at included in the returned series. Must be between 1 and 14 (inclusive). * Either length or starting_at is required. |
include_variant_breakdown |
Optional | Boolean | Whether to include variant statistics (defaults to false). |
include_step_breakdown |
Optional | Boolean | Whether to include step statistics (defaults to false). |
include_deleted_step_data |
Optional | Boolean | Whether to include step statistics for deleted steps (defaults to false). |

Canvas analytics are aggregated by day in your company’s configured time zone in Braze (the same time zone the dashboard uses). The API normalizes starting_at and ending_at to midnight in that time zone.
Example request
1
2
curl --location -g --request GET 'https://rest.iad-01.braze.com/canvas/data_summary?canvas_id={{canvas_id}}&ending_at=2018-05-30T23:59:59-05:00&starting_at=2018-05-28T23:59:59-05:00&length=5&include_variant_breakdown=true&include_step_breakdown=true&include_deleted_step_data=true' \
--header 'Authorization: Bearer YOUR-REST-API-KEY'
Response

In total_stats, variant_stats, and step_stats, conversions is the count for the primary conversion event of the Canvas. When you configure additional conversion events, the payload can also include conversions1, conversions2, and higher-indexed fields for the second, third, and further events. This is similar to the multivariate response for the ` /campaigns/data_series endpoint. Where present, fields ending in _by_entry_time` attribute those conversions by Canvas entry time.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
{
"data": {
"name": (string) the Canvas name,
"total_stats": {
"revenue": (float) the number of dollars of revenue (USD),
"conversions": (int) the number of conversions,
"conversions_by_entry_time": (int) the number of conversions for the conversion event by entry time,
"entries": (int) the number of entries
},
"variant_stats": (optional) {
"00000000-0000-0000-0000-0000000000000": (string) the API identifier for the variant {
"name": (string) the name of the variant,
"revenue": (float) the number of dollars of revenue (USD),
"conversions": (int) the number of conversions,
"entries": (int) the number of entries
},
... (more variants)
},
"step_stats": (optional) {
"00000000-0000-0000-0000-0000000000000": (string) the API identifier for the step {
"name": (string) the name of the step,
"revenue": (float) the number of dollars of revenue (USD),
"conversions": (int) the number of conversions,
"conversions_by_entry_time": (int) the number of conversions for the conversion event by entry time,
"messages": {
"android_push": (name of channel) [
{
"sent": (int) the number of sends,
"opens": (int) the number of opens,
"influenced_opens": (int) the total number of opens (includes both direct opens and influenced opens),
"bounces": (int) the number of bounces
... (more stats for channel)
}
],
... (more channels)
}
},
... (more steps)
}
},
"message": (required, string) the status of the export, returns 'success' on successful completion
}

In the API response, the influenced_opens field represents the total number of opens (both direct and influenced opens combined). In the Braze dashboard, “influenced opens” refers only to influenced opens, excluding direct opens. This is due to a legacy naming convention in the API.