Canva Analytics API
The analytics API from Canva — 5 operation(s) for analytics.
The analytics API from Canva — 5 operation(s) for analytics.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/canva-analytics-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
contact:
name: Canva Developer Community
url: https://community.canva.dev/
description: API for building integrations with Canva via a REST api
license:
name: ©2023 All Rights Reserved
termsOfService: https://www.canva.com/trust/legal/
title: Canva Connect Analytics API
version: 2024-06-18
servers:
- description: Canva Connect API
url: https://api.canva.com/rest
tags:
- name: analytics
paths:
/v1/designs/{designId}/analytics:
get:
description: '<Warning>
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](https://www.canva.dev/docs/connect/versions/).
- Public integrations that use preview APIs will not pass the review process, and can''t be made available to all Canva users.
</Warning>
<Availability>
To use this API, your integration must act on behalf of a user who is a member of a [Canva Enterprise](https://www.canva.com/enterprise/) organization.
</Availability>
Gets the aggregated analytics for a design.
The response includes total views, unique viewers, and view duration metrics.'
operationId: getDesignAnalytics
parameters:
- description: The design ID.
explode: false
in: path
name: designId
required: true
schema:
pattern: ^[a-zA-Z0-9_-]{1,50}$
type: string
style: simple
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/GetDesignAnalyticsResponse'
description: OK
'400':
content:
application/json:
examples:
analytics_invalid_design_id:
$ref: '#/components/examples/AnalyticsInvalidDesignIdError'
schema:
$ref: '#/components/schemas/Error'
description: Bad Request
'401':
content:
application/json:
examples:
invalid_access_token:
$ref: '#/components/examples/InvalidAccessToken'
schema:
$ref: '#/components/schemas/Error'
description: Unauthorized
'403':
content:
application/json:
examples:
analytics_permission_denied:
$ref: '#/components/examples/AnalyticsPermissionDeniedError'
schema:
$ref: '#/components/schemas/Error'
description: Forbidden
'404':
content:
application/json:
examples:
analytics_design_not_found:
$ref: '#/components/examples/AnalyticsDesignNotFoundError'
schema:
$ref: '#/components/schemas/Error'
description: Not Found
'429':
content:
application/json:
examples:
too_many_requests:
$ref: '#/components/examples/TooManyRequestsError'
schema:
$ref: '#/components/schemas/Error'
description: Too Many Requests
default:
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
description: Error Response
security:
- oauthAuthCode:
- design:content:read
tags:
- analytics
x-required-capabilities:
- analytics
x-rate-limit-per-client-user: 100
/v1/designs/{designId}/analytics/viewers:
get:
description: '<Warning>
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](https://www.canva.dev/docs/connect/versions/).
- Public integrations that use preview APIs will not pass the review process, and can''t be made available to all Canva users.
</Warning>
<Availability>
To use this API, your integration must act on behalf of a user who is a member of a [Canva Enterprise](https://www.canva.com/enterprise/) organization.
</Availability>
Lists viewers for a design, ordered by most recent view first.'
operationId: getDesignAnalyticsViewers
parameters:
- description: The design ID.
explode: false
in: path
name: designId
required: true
schema:
pattern: ^[a-zA-Z0-9_-]{1,50}$
type: string
style: simple
- description: Filters viewers by a specific trackable link. If omitted, only viewers who visited the design without using a trackable link are returned.
explode: true
in: query
name: link_id
required: false
schema:
example: hddb98a3716
pattern: ^[a-zA-Z0-9_-]{1,50}$
type: string
style: form
- description: Only returns viewers whose first view happened after this time, as a Unix timestamp (in seconds since the Unix Epoch).
explode: true
in: query
name: first_viewed_after
required: false
schema:
example: 1745452800
format: int64
type: integer
style: form
- description: The maximum number of viewers to return per page.
explode: true
in: query
name: limit
required: false
schema:
default: 50
example: 50
format: int32
maximum: 100
minimum: 1
type: integer
style: form
- description: 'If the success response contains a continuation token, there are more viewers you can list. You can use this token as a query parameter and retrieve more viewers from the list, for example `/v1/designs/{designId}/analytics/viewers?continuation={continuation}`.
To retrieve all viewers, you might need to make multiple requests.'
explode: true
in: query
name: continuation
required: false
schema:
example: RkFGMgXlsVTDbMd:MR3L0QjiaUzycIAjx0yMyuNiV0OildoiOwL0x32G4NjNu4FwtAQNxowUQNMMYN
type: string
style: form
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/GetDesignAnalyticsViewersResponse'
description: OK
'400':
content:
application/json:
examples:
analytics_invalid_query_parameter:
$ref: '#/components/examples/ExpectedLongQueryParam'
analytics_invalid_continuation_token:
$ref: '#/components/examples/AnalyticsInvalidContinuationError'
schema:
$ref: '#/components/schemas/Error'
description: Bad Request
'401':
content:
application/json:
examples:
invalid_access_token:
$ref: '#/components/examples/InvalidAccessToken'
schema:
$ref: '#/components/schemas/Error'
description: Unauthorized
'403':
content:
application/json:
examples:
analytics_permission_denied:
$ref: '#/components/examples/AnalyticsPermissionDeniedError'
schema:
$ref: '#/components/schemas/Error'
description: Forbidden
'404':
content:
application/json:
examples:
analytics_design_not_found:
$ref: '#/components/examples/AnalyticsDesignNotFoundError'
schema:
$ref: '#/components/schemas/Error'
description: Not Found
'429':
content:
application/json:
examples:
too_many_requests:
$ref: '#/components/examples/TooManyRequestsError'
schema:
$ref: '#/components/schemas/Error'
description: Too Many Requests
default:
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
description: Error Response
security:
- oauthAuthCode:
- design:content:read
tags:
- analytics
x-required-capabilities:
- analytics
x-rate-limit-per-client-user: 100
/v1/designs/{designId}/analytics/views-over-time:
get:
description: '<Warning>
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](https://www.canva.dev/docs/connect/versions/).
- Public integrations that use preview APIs will not pass the review process, and can''t be made available to all Canva users.
</Warning>
<Availability>
To use this API, your integration must act on behalf of a user who is a member of a [Canva Enterprise](https://www.canva.com/enterprise/) organization.
</Availability>
Lists the view counts over time for a design.
Each response item represents one time bucket.'
operationId: getDesignAnalyticsViewsOverTime
parameters:
- description: The design ID.
explode: false
in: path
name: designId
required: true
schema:
pattern: ^[a-zA-Z0-9_-]{1,50}$
type: string
style: simple
- description: The inclusive start of the requested time range, as a Unix timestamp (in seconds since the Unix Epoch).
explode: true
in: query
name: start_time
required: false
schema:
example: 1745452800
format: int64
type: integer
style: form
- description: The inclusive end of the requested time range, as a Unix timestamp (in seconds since the Unix Epoch).
explode: true
in: query
name: end_time
required: false
schema:
example: 1748044800
format: int64
type: integer
style: form
- description: The timezone to use for bucketing, as a UTC offset in the form `+HH:MM` (for example, `+10:00`).
explode: true
in: query
name: timezone
required: false
schema:
default: +00:00
example: '600'
type: string
style: form
- description: The maximum number of time buckets to return per page.
explode: true
in: query
name: limit
required: false
schema:
default: 50
example: 50
format: int32
maximum: 100
minimum: 1
type: integer
style: form
- description: 'If the success response contains a continuation token, there are more time buckets you can list. You can use this token as a query parameter and retrieve more time buckets from the list, for example `/v1/designs/{designId}/analytics/views-over-time?continuation={continuation}`.
To retrieve all time buckets, you might need to make multiple requests.'
explode: true
in: query
name: continuation
required: false
schema:
example: RkFGMgXlsVTDbMd:MR3L0QjiaUzycIAjx0yMyuNiV0OildoiOwL0x32G4NjNu4FwtAQNxowUQNMMYN
type: string
style: form
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/GetDesignAnalyticsViewsOverTimeResponse'
description: OK
'400':
content:
application/json:
examples:
analytics_invalid_query_parameter:
$ref: '#/components/examples/ExpectedLongQueryParam'
analytics_invalid_time_range:
$ref: '#/components/examples/AnalyticsInvalidTimeRangeError'
analytics_invalid_timezone:
$ref: '#/components/examples/AnalyticsInvalidTimezoneError'
analytics_invalid_continuation_token:
$ref: '#/components/examples/AnalyticsInvalidContinuationError'
schema:
$ref: '#/components/schemas/Error'
description: Bad Request
'401':
content:
application/json:
examples:
invalid_access_token:
$ref: '#/components/examples/InvalidAccessToken'
schema:
$ref: '#/components/schemas/Error'
description: Unauthorized
'403':
content:
application/json:
examples:
analytics_permission_denied:
$ref: '#/components/examples/AnalyticsPermissionDeniedError'
schema:
$ref: '#/components/schemas/Error'
description: Forbidden
'404':
content:
application/json:
examples:
analytics_design_not_found:
$ref: '#/components/examples/AnalyticsDesignNotFoundError'
schema:
$ref: '#/components/schemas/Error'
description: Not Found
'429':
content:
application/json:
examples:
too_many_requests:
$ref: '#/components/examples/TooManyRequestsError'
schema:
$ref: '#/components/schemas/Error'
description: Too Many Requests
default:
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
description: Error Response
security:
- oauthAuthCode:
- design:content:read
tags:
- analytics
x-required-capabilities:
- analytics
x-rate-limit-per-client-user: 100
/v1/designs/{designId}/analytics/page-views:
post:
description: '<Warning>
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](https://www.canva.dev/docs/connect/versions/).
- Public integrations that use preview APIs will not pass the review process, and can''t be made available to all Canva users.
</Warning>
<Availability>
To use this API, your integration must act on behalf of a user who is a member of a [Canva Enterprise](https://www.canva.com/enterprise/) organization.
</Availability>
Lists the page-level view duration data for a design.
The request body can include page filters and pagination controls.'
operationId: getDesignAnalyticsPageViews
parameters:
- description: The design ID.
explode: false
in: path
name: designId
required: true
schema:
pattern: ^[a-zA-Z0-9_-]{1,50}$
type: string
style: simple
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/GetDesignAnalyticsPageViewsRequest'
required: true
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/GetDesignAnalyticsPageViewsResponse'
description: OK
'400':
content:
application/json:
examples:
analytics_invalid_request_body:
$ref: '#/components/examples/FailedToReadRequestBody'
analytics_invalid_page_views_filter:
$ref: '#/components/examples/AnalyticsInvalidPageViewsFilterError'
analytics_invalid_continuation_token:
$ref: '#/components/examples/AnalyticsInvalidContinuationError'
schema:
$ref: '#/components/schemas/Error'
description: Bad Request
'401':
content:
application/json:
examples:
invalid_access_token:
$ref: '#/components/examples/InvalidAccessToken'
schema:
$ref: '#/components/schemas/Error'
description: Unauthorized
'403':
content:
application/json:
examples:
analytics_permission_denied:
$ref: '#/components/examples/AnalyticsPermissionDeniedError'
schema:
$ref: '#/components/schemas/Error'
description: Forbidden
'404':
content:
application/json:
examples:
analytics_design_not_found:
$ref: '#/components/examples/AnalyticsDesignNotFoundError'
schema:
$ref: '#/components/schemas/Error'
description: Not Found
'429':
content:
application/json:
examples:
too_many_requests:
$ref: '#/components/examples/TooManyRequestsError'
schema:
$ref: '#/components/schemas/Error'
description: Too Many Requests
default:
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
description: Error Response
security:
- oauthAuthCode:
- design:content:read
tags:
- analytics
x-required-capabilities:
- analytics
x-rate-limit-per-client-user: 100
/v1/designs/{designId}/analytics/links:
get:
description: '<Warning>
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](https://www.canva.dev/docs/connect/versions/).
- Public integrations that use preview APIs will not pass the review process, and can''t be made available to all Canva users.
</Warning>
<Availability>
To use this API, your integration must act on behalf of a user who is a member of a [Canva Enterprise](https://www.canva.com/enterprise/) organization.
</Availability>
Lists trackable links and their metrics for a design.'
operationId: getDesignAnalyticsLinks
parameters:
- description: The design ID.
explode: false
in: path
name: designId
required: true
schema:
pattern: ^[a-zA-Z0-9_-]{1,50}$
type: string
style: simple
- description: The maximum number of links to return per page.
explode: true
in: query
name: limit
required: false
schema:
default: 50
example: 50
format: int32
maximum: 100
minimum: 1
type: integer
style: form
- description: 'If the success response contains a continuation token, there are more links you can list. You can use this token as a query parameter and retrieve more links from the list, for example `/v1/designs/{designId}/analytics/links?continuation={continuation}`.
To retrieve all links, you might need to make multiple requests.'
explode: true
in: query
name: continuation
required: false
schema:
example: RkFGMgXlsVTDbMd:MR3L0QjiaUzycIAjx0yMyuNiV0OildoiOwL0x32G4NjNu4FwtAQNxowUQNMMYN
type: string
style: form
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/GetDesignAnalyticsLinksResponse'
description: OK
'400':
content:
application/json:
examples:
analytics_invalid_query_parameter:
$ref: '#/components/examples/ExpectedLongQueryParam'
analytics_invalid_continuation_token:
$ref: '#/components/examples/AnalyticsInvalidContinuationError'
schema:
$ref: '#/components/schemas/Error'
description: Bad Request
'401':
content:
application/json:
examples:
invalid_access_token:
$ref: '#/components/examples/InvalidAccessToken'
schema:
$ref: '#/components/schemas/Error'
description: Unauthorized
'403':
content:
application/json:
examples:
analytics_permission_denied:
$ref: '#/components/examples/AnalyticsPermissionDeniedError'
schema:
$ref: '#/components/schemas/Error'
description: Forbidden
'404':
content:
application/json:
examples:
analytics_design_not_found:
$ref: '#/components/examples/AnalyticsDesignNotFoundError'
schema:
$ref: '#/components/schemas/Error'
description: Not Found
'429':
content:
application/json:
examples:
too_many_requests:
$ref: '#/components/examples/TooManyRequestsError'
schema:
$ref: '#/components/schemas/Error'
description: Too Many Requests
default:
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
description: Error Response
security:
- oauthAuthCode:
- design:content:read
tags:
- analytics
x-required-capabilities:
- analytics
x-rate-limit-per-client-user: 100
components:
examples:
AnalyticsInvalidPageViewsFilterError:
summary: The page views filter is invalid.
value:
code: bad_request_body
message: filter must include a valid type discriminator and required fields
FailedToReadRequestBody:
summary: Failed to read request body
value:
code: bad_request_body
message: Failed to read request body
AnalyticsDesignNotFoundError:
summary: The design was not found, or analytics are unavailable.
value:
code: design_not_found
message: Design not found or analytics are not available for this design
TooManyRequestsError:
summary: Rate limit exceeded
value:
code: too_many_requests
message: Too many requests to {operation}
AnalyticsInvalidTimeRangeError:
summary: The requested time range is invalid.
value:
code: invalid_field
message: start_time must be before end_time
AnalyticsInvalidDesignIdError:
summary: The design ID does not match the expected format.
value:
code: invalid_field
message: designId does not match expected format
AnalyticsInvalidTimezoneError:
summary: The timezone value is invalid.
value:
code: invalid_field
message: timezone is not a valid UTC offset
ExpectedLongQueryParam:
summary: Expected long for query parameter
value:
code: bad_query_params
message: Expected long for query parameter `{key}` but found {value}
AnalyticsPermissionDeniedError:
summary: The caller is not allowed to access design analytics.
value:
code: permission_denied
message: Not allowed to access analytics for this design
InvalidAccessToken:
summary: Access token could not be decoded or signature could not be verified.
value:
code: invalid_access_token
message: Access token is invalid
AnalyticsInvalidContinuationError:
summary: The continuation token is invalid or expired.
value:
code: invalid_field
message: Invalid continuation token
schemas:
ViewsAtTime:
description: A single time bucket of view counts.
properties:
count:
description: The number of views in this bucket.
example: 15
format: int64
type: integer
bucket_start_at:
description: When this time bucket starts, as a Unix timestamp (in seconds since the Unix Epoch).
example: 1745452800
format: int64
type: integer
required:
- bucket_start_at
- count
type: object
PageViewDuration:
description: View duration metrics for a single page.
properties:
page_id:
description: The page ID. This is omitted for design types that do not support page IDs.
example: PBBKfZml7MRHRQVw
type: string
total_view_duration_seconds:
description: The total time spent viewing this page, in seconds.
example: 1860
format: int64
type: integer
average_duration_seconds:
description: The average time spent viewing this page, in seconds. This is omitted for `by_viewer` filters.
example: 21.5
format: double
type: number
unique_view_count:
description: The number of unique viewers for this page. This is omitted for `by_viewer` filters.
example: 87
format: int64
type: integer
required:
- total_view_duration_seconds
type: object
GetDesignAnalyticsLinksResponse:
description: Successful response from a `getDesignAnalyticsLinks` request.
properties:
items:
description: The list of trackable links.
items:
$ref: '#/components/schemas/TrackableLink'
type: array
continuation:
description: 'If the success response contains a continuation token, there are more links you can list. You can use this token as a query parameter and retrieve more links from the list, for example `/v1/designs/{designId}/analytics/links?continuation={continuation}`.
To retrieve all links, you might need to make multiple requests.'
example: RkFGMgXlsVTDbMd:MR3L0QjiaUzycIAjx0yMyuNiV0OildoiOwL0x32G4NjNu4FwtAQNxowUQNMMYN
type: string
required:
- items
type: object
PageViewFilterByViewer:
properties:
type:
enum:
- by_viewer
example: by_viewer
type: string
link_id:
description: Filters to viewer traffic from a specific trackable link. Omit this field to target viewer traffic that did not come from a trackable link.
example: hddb98a3716
type: string
viewer_id:
description: The viewer ID to filter by.
example: b2d44753-f996-46ff-8f01-d4143911550f
type: string
required:
- type
- viewer_id
type: object
GetDesignAnalyticsResponse:
description: Aggregated analytics metrics for a design.
properties:
average_view_duration_seconds:
description: The average view duration in seconds.
example: 42
format: int64
type: integer
total_view_duration_seconds:
description: The total view duration in seconds.
example: 5040
format: int64
type: integer
unique_view_count:
description: The number of unique viewers.
example: 87
format: int64
type: integer
total_view_count:
description: The total number of views.
example: 120
format: int64
type: integer
required:
- total_view_count
- unique_view_count
type: object
DesignAnalyticsViewerType:
description: How the viewer accessed the design.
enum:
- editor
- commenter
- viewer
type: string
x-enum-descriptions:
- The viewer accessed the design with edit access.
- The viewer accessed the design with comment access.
- The viewer accessed the design with view-only access.
TrackableLink:
description: Metrics for a trackable link.
properties:
link_id:
description: The ID of the trackable link.
example: hddb98a3716
type: string
name:
description: The user-visible name of the trackable link.
example: Newsletter link
type: string
total_view_count:
description: The total number of views for this link.
example: 64
format: int64
type: integer
unique_view_count:
description: The number of unique viewers for this link.
example: 41
format: int64
type: integer
total_view_duration_seconds:
description: The total time this link has been viewed, in seconds.
example: 2580
format: int64
type: integer
average_view_duration_seconds:
description: The average time this link has been viewed, in seconds.
example: 40
format: int64
type: integer
last_viewed_at:
description: When this link was most recently viewed, as a Unix timestamp (in seconds since the Unix Epoch).
example: 1748044800
format: int64
type: integer
required:
- link_id
type: object
Error:
properties:
code:
$ref: '#/components/schemas/ErrorCode'
message:
description: A human-readable description of what went wrong.
type: string
required:
- code
- message
type: object
DesignAnalyticsViewerVisibility:
description: How this viewer should be presented to the caller.
enum:
- shown
- anonymous
- opt_out
- another_team
- deleted
type: string
x-enum-descriptions:
- The viewer's identity is visible, and their user details are included.
- The viewer is anonymous, so their identity is not available.
- The viewer has opted out of design analytics, but some data was already collected for this viewer previosly.
- The viewer belongs to a different team, so their identity is not shared.
- The viewer's account has been deleted.
ErrorCode:
description: 'A short string indicating what failed. This field can be used to handle errors programmatically.
'
enum:
- internal_error
- invalid_field
- invalid_header_value
- permission_denied
- too_many_requests
- not_found
- bad_request_body
- bad_http_method
- bad_request_params
- bad_query_params
- user_role_required
- endpoint_not_found
- endpoint_gone
- unsupported_version
- invalid_access_token
- revoked_access_token
- missing_field
- missing_scope
- invalid_grant
- invalid_request
- invalid_client
- unauthorized_client
- unsupported_grant_type
- invalid_scope
- invalid_basic_header
- invalid_file_format
- quota_exceeded
- ai_credit_quota_exceeded
- ai_credit_quota_cooldown
- unsupported_content_type
- request_too_large
- folder_not_found
- item_in_multiple_folders
- asset_not_found
- max_limit_reached
- permission_not_found
- permission_exists
- unauthorized_user
- user_not_found
- user_not_eligible
- group_not_found
- app_not_found
- app_has_non_draft_versions
- invalid_status_transition
- translation_validation_failed
- content_not_found
- doctype_not_found
- design_not_found
- offset_too_large
- page_not_found
- design_or_comment_not_found
- design_or_thread_not_found
- review_dismissed
- design_type_not_found
- team_not_found
- team_is_default
- comment_not_found
- too_many_comments
- too_many_replies
- message_too_long
- thread_not_found
- reply_not_found
- design_not_fillable
- autofill_data_invalid
- feature_not_available
- unsupported_design_type
- design_gener
# --- truncated at 32 KB (41 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/canva/refs/heads/main/openapi/canva-analytics-api-openapi.yml