Get design analytics
This API is currently provided as a preview. Be aware of the following:
- There might be unannounced breaking changes.
- Any breaking changes to preview APIs won't produce a new API version.
- Public integrations that use preview APIs will not pass the review process, and can't be made available to all Canva users.
To use this API, your integration must act on behalf of a user who is a member of a Canva Enterprise(opens in a new tab or window) organization.
Gets the aggregated analytics for a design.
The response includes total views, unique viewers, and view duration metrics.
HTTP method and URL path
https://api.canva.com /rest /v1 /designs/{designId}/analyticsThis operation is rate limited to 100 requests per minute for each user of your integration.
Authentication and authorization
This endpoint requires a valid access token that acts on behalf of a user.
Scopes
The access token must have all the following scopes (permissions):
design:content:read
Capabilities
The user must have at least one of the following capabilities:
analytics
Header parameters
Path parameters
designIdstringThe design ID.
Example request
Examples for using the /v1/designs/{designId}/analytics endpoint:
curl --request GET 'https://api.canva.com/rest/v1/designs/{designId}/analytics' \--header 'Authorization: Bearer {token}'
const fetch = require("node-fetch");fetch("https://api.canva.com/rest/v1/designs/{designId}/analytics", {method: "GET",headers: {"Authorization": "Bearer {token}",},}).then(async (response) => {const data = await response.json();console.log(data);}).catch(err => console.error(err));
import java.io.IOException;import java.net.URI;import java.net.http.*;public class ApiExample {public static void main(String[] args) throws IOException, InterruptedException {HttpRequest request = HttpRequest.newBuilder().uri(URI.create("https://api.canva.com/rest/v1/designs/{designId}/analytics")).header("Authorization", "Bearer {token}").method("GET", HttpRequest.BodyPublishers.noBody()).build();HttpResponse<String> response = HttpClient.newHttpClient().send(request,HttpResponse.BodyHandlers.ofString());System.out.println(response.body());}}
import requestsheaders = {"Authorization": "Bearer {token}"}response = requests.get("https://api.canva.com/rest/v1/designs/{designId}/analytics",headers=headers)print(response.json())
using System.Net.Http;var client = new HttpClient();var request = new HttpRequestMessage{Method = HttpMethod.Get,RequestUri = new Uri("https://api.canva.com/rest/v1/designs/{designId}/analytics"),Headers ={{ "Authorization", "Bearer {token}" },},};using (var response = await client.SendAsync(request)){response.EnsureSuccessStatusCode();var body = await response.Content.ReadAsStringAsync();Console.WriteLine(body);};
package mainimport ("fmt""io""net/http")func main() {url := "https://api.canva.com/rest/v1/designs/{designId}/analytics"req, _ := http.NewRequest("GET", url, nil)req.Header.Add("Authorization", "Bearer {token}")res, _ := http.DefaultClient.Do(req)defer res.Body.Close()body, _ := io.ReadAll(res.Body)fmt.Println(string(body))}
$curl = curl_init();curl_setopt_array($curl, array(CURLOPT_URL => "https://api.canva.com/rest/v1/designs/{designId}/analytics",CURLOPT_CUSTOMREQUEST => "GET",CURLOPT_RETURNTRANSFER => true,CURLOPT_HTTPHEADER => array('Authorization: Bearer {token}',),));$response = curl_exec($curl);$err = curl_error($curl);curl_close($curl);if (empty($err)) {echo $response;} else {echo "Error: " . $err;}
require 'net/http'require 'uri'url = URI('https://api.canva.com/rest/v1/designs/{designId}/analytics')http = Net::HTTP.new(url.host, url.port)http.use_ssl = truerequest = Net::HTTP::Get.new(url)request['Authorization'] = 'Bearer {token}'response = http.request(request)puts response.read_body
Success response
If successful, the endpoint returns a 200 response with a JSON body with the following parameters:
unique_view_countintegerThe number of unique viewers.
total_view_countintegerThe total number of views.
average_view_duration_secondsintegerThe average view duration in seconds.
total_view_duration_secondsintegerThe total view duration in seconds.
Example response
{"average_view_duration_seconds": 42,"total_view_duration_seconds": 5040,"unique_view_count": 87,"total_view_count": 120}
Error responses
400 Bad Request
codestringA short string indicating what failed. This field can be used to handle errors programmatically. For a complete list of error codes, see Error responses.
messagestringA human-readable description of what went wrong.
Example error response
The design ID does not match the expected format.
{"code": "invalid_field","message": "designId does not match expected format"}
401 Unauthorized
codestringA short string indicating what failed. This field can be used to handle errors programmatically. For a complete list of error codes, see Error responses.
messagestringA human-readable description of what went wrong.
Example error response
Access token could not be decoded or signature could not be verified.
{"code": "invalid_access_token","message": "Access token is invalid"}
403 Forbidden
codestringA short string indicating what failed. This field can be used to handle errors programmatically. For a complete list of error codes, see Error responses.
messagestringA human-readable description of what went wrong.
Example error response
The caller is not allowed to access design analytics.
{"code": "permission_denied","message": "Not allowed to access analytics for this design"}
404 Not Found
codestringA short string indicating what failed. This field can be used to handle errors programmatically. For a complete list of error codes, see Error responses.
messagestringA human-readable description of what went wrong.
Example error response
The design was not found, or analytics are unavailable.
{"code": "design_not_found","message": "Design not found or analytics are not available for this design"}
429 Too Many Requests
codestringA short string indicating what failed. This field can be used to handle errors programmatically. For a complete list of error codes, see Error responses.
messagestringA human-readable description of what went wrong.
Example error response
Rate limit exceeded
{"code": "too_many_requests","message": "Too many requests to {operation}"}