Content types

In the Developer Portal, content extensions have a Content type field.
This field determines:
  • The type of content the extension can import into Canva
  • The work required to create the extension
This topic describes the types of content that Canva supports and the implications of supporting them.
If you're looking for the API reference, see /content/resources/find.

Supported content types

You can configure a content extension to support the following types of content:
To learn more about each specific content type, see the linked documentation.
For guidelines on choosing the layout that’s most appropriate for your content type, see Choose the best layout.
For additional requirements that apply to each content type, see Choose the best content types.

Request-response cycle

As a user interacts with a content extension, Canva sends POST requests to the following endpoint:
<base_url> is a placeholder that's replaced with the extension's Base URL.
This is an example of a request:
"user": "AQ_7dBCCJN5yCxQiBX-QjJLT8ZnLwn-0kISpwpHqh68=",
"brand": "AQ_7dBC9ihGVL06M4KkBKreDsSoZcZZAwbrdzwgDkjs=",
"label": "CONTENT",
"limit": 8,
"locale": "en",
"type": "IMAGE",
"types": ["IMAGE"]
The body of this request contains a types array. Each value in this array is an uppercase string that corresponds to one of the supported content types:
  • "EMBED"
  • "IMAGE"
  • "VIDEO"
In response to this request, the extension must provide an array of resources. (The term resource is how Canva’s API generally refers to an individual piece of content.)
In the request body, the types property has superseded the now-deprecated type property. Canva only sends the type property for backwards compatibility reasons.
This is an example of a response that doesn't have any resources:
"type": "SUCCESS",
"resources": []
The type of content an extension can include in a response depends on the value of the types array. For example, if the types array contains "IMAGE" and "EMBED", the extension can respond with images, embeds, or a combination of the two.
You can represent each resource as an object with a type property and metadata that describes the resource. For example, this is an "IMAGE" resource:
"type": "IMAGE",
"id": "1025",
"name": "Matthew Wiebe",
"thumbnail": { "url": "" },
"url": "",
"contentType": "image/jpeg"
Some properties are required for all content types, such as id and name, but other properties are only required for certain types of content. The details are described in the API reference.
After receiving a response from the extension, Canva renders the resources in the side panel. This is an example of an extension that renders a container, image, and embed:
For guidelines on keeping the users informed when you can’t show the initial content, see Handle empty states.


  • You can't submit an app for review if it has a content extension that only has the Container option selected for its Content type. This is because an extension that only provides users with containers isn't useful.


To see a complete preview of this extension, configure it to support images, embeds, containers, and videos.
const express = require("express");
const app = express();
app.use(express.static("public"));"/content/resources/find", async (request, response) => {
const resources = [];
if (request.body.types.includes("CONTAINER")) {
type: "CONTAINER",
id: "things",
name: "Things",
if (request.body.types.includes("IMAGE")) {
type: "IMAGE",
id: "1025",
name: "Matthew Wiebe",
thumbnail: { url: "" },
url: "",
contentType: "image/jpeg",
if (request.body.types.includes("EMBED")) {
id: "dQw4w9WgXcQ",
name: "Rick Astley - Never Gonna Give You Up",
type: "EMBED",
thumbnail: {
url: "",
url: "",
if (request.body.types.includes("VIDEO")) {
id: "125",
name: "Yellow flowers",
type: "VIDEO",
thumbnail: {
url: "",
url: "",
type: "SUCCESS",
app.listen(process.env.PORT || 3000);
Last modified 5mo ago