Create comment

Create a new comment on a design.

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.

Create a new top-level comment on a design. For information on comments and how they're used in the Canva UI, see the Canva Help Center(opens in a new tab or window). A design can have a maximum of 1000 comments.

HTTP method and URL path

POST https://api.canva.com/rest/v1/comments

This operation is rate limited to 20 requests per minute for each user of your integration.

Authentication

This endpoint requires a valid access token that acts on behalf of a user. The token must have the following scopes (permissions):

  • comment:write

For more information, see Scopes.

Header parameters

Authorizationstring
REQUIRED

Provides credentials to authenticate the request, in the form of a Bearer token.

For example: Authorization: Bearer {token}

Content-Typestring
REQUIRED

Indicates the media type of the information sent in the request. This must be set to application/json.

For example: Content-Type: application/json

Body parameters

attached_toCommentObjectInput
REQUIRED

An object containing identifying information for the design or other object you want to attach the comment to.

Properties of attached_to
typestring
REQUIRED

This can be one of the following:

  • design: If the comment is attached to a Canva Design.
design_idstring
REQUIRED

The ID of the design you want to attach this comment to.

messagestring
REQUIRED

The comment message. This is the comment body shown in the Canva UI.

You can also mention users in your message by specifying their User ID and Team ID using the format [user_id:team_id]. If the assignee_id parameter is specified, you must mention the assignee in the message.

assignee_idstring
OPTIONAL

Lets you assign the comment to a Canva user using their User ID. You must mention the assigned user in the message.

Example request

Examples for using the /v1/comments endpoint:

curl --request POST 'https://api.canva.com/rest/v1/comments' \
--header 'Authorization: Bearer {token}' \
--header 'Content-Type: application/json' \
--data '{
"attached_to": {
"design_id": "DAFVztcvd9z",
"type": "design"
},
"message": "Great work [oUnPjZ2k2yuhftbWF7873o:oBpVhLW22VrqtwKgaayRbP]!",
"assignee_id": "oUnPjZ2k2yuhftbWF7873o"
}'
SH
const fetch = require("node-fetch");
fetch("https://api.canva.com/rest/v1/comments", {
method: "POST",
headers: {
"Authorization": "Bearer {token}",
"Content-Type": "application/json",
},
body: JSON.stringify({
"attached_to": {
"design_id": "DAFVztcvd9z",
"type": "design"
},
"message": "Great work [oUnPjZ2k2yuhftbWF7873o:oBpVhLW22VrqtwKgaayRbP]!",
"assignee_id": "oUnPjZ2k2yuhftbWF7873o"
}),
})
.then(async (response) => {
const data = await response.json();
console.log(data);
})
.catch(err => console.error(err));
JS
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/comments"))
.header("Authorization", "Bearer {token}")
.header("Content-Type", "application/json")
.method("POST", HttpRequest.BodyPublishers.ofString("{\"attached_to\": {\"design_id\": \"DAFVztcvd9z\", \"type\": \"design\"}, \"message\": \"Great work [oUnPjZ2k2yuhftbWF7873o:oBpVhLW22VrqtwKgaayRbP]!\", \"assignee_id\": \"oUnPjZ2k2yuhftbWF7873o\"}"))
.build();
HttpResponse<String> response = HttpClient.newHttpClient().send(
request,
HttpResponse.BodyHandlers.ofString()
);
System.out.println(response.body());
}
}
JAVA
import requests
headers = {
"Authorization": "Bearer {token}",
"Content-Type": "application/json"
}
data = {
"attached_to": {
"design_id": "DAFVztcvd9z",
"type": "design"
},
"message": "Great work [oUnPjZ2k2yuhftbWF7873o:oBpVhLW22VrqtwKgaayRbP]!",
"assignee_id": "oUnPjZ2k2yuhftbWF7873o"
}
response = requests.post("https://api.canva.com/rest/v1/comments",
headers=headers,
json=data
)
print(response.json())
PY
using System.Net.Http;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Post,
RequestUri = new Uri("https://api.canva.com/rest/v1/comments"),
Headers =
{
{ "Authorization", "Bearer {token}" },
},
Content = new StringContent(
"{\"attached_to\": {\"design_id\": \"DAFVztcvd9z\", \"type\": \"design\"}, \"message\": \"Great work [oUnPjZ2k2yuhftbWF7873o:oBpVhLW22VrqtwKgaayRbP]!\", \"assignee_id\": \"oUnPjZ2k2yuhftbWF7873o\"}",
Encoding.UTF8,
"application/json"
),
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
};
CSHARP
package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
payload := strings.NewReader(`{
"attached_to": {
"design_id": "DAFVztcvd9z",
"type": "design"
},
"message": "Great work [oUnPjZ2k2yuhftbWF7873o:oBpVhLW22VrqtwKgaayRbP]!",
"assignee_id": "oUnPjZ2k2yuhftbWF7873o"
}`)
url := "https://api.canva.com/rest/v1/comments"
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer {token}")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}
GO
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://api.canva.com/rest/v1/comments",
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => array(
'Authorization: Bearer {token}',
'Content-Type: application/json',
),
CURLOPT_POSTFIELDS => json_encode([
"attached_to" => [
"design_id" => "DAFVztcvd9z",
"type" => "design"
],
"message" => "Great work [oUnPjZ2k2yuhftbWF7873o:oBpVhLW22VrqtwKgaayRbP]!",
"assignee_id" => "oUnPjZ2k2yuhftbWF7873o"
])
));
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if (empty($err)) {
echo $response;
} else {
echo "Error: " . $err;
}
PHP
require 'net/http'
require 'uri'
url = URI('https://api.canva.com/rest/v1/comments')
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request['Authorization'] = 'Bearer {token}'
request['Content-Type'] = 'application/json'
request.body = <<REQUEST_BODY
{
"attached_to": {
"design_id": "DAFVztcvd9z",
"type": "design"
},
"message": "Great work [oUnPjZ2k2yuhftbWF7873o:oBpVhLW22VrqtwKgaayRbP]!",
"assignee_id": "oUnPjZ2k2yuhftbWF7873o"
}
REQUEST_BODY
response = http.request(request)
puts response.read_body
RUBY

Success response

If successful, the endpoint returns a 200 response with a JSON body with the following parameters:

commentParentComment

Data about the comment, including the message, author, and the object (such as a design) the comment is attached to.

Properties of comment
typestring

The type of comment. When creating a new parent (top-level) comment, the type is parent.

idstring

The ID of the comment.

You can use this ID to create replies to the comment using the Create reply API.

messagestring

The comment message. This is the comment body shown in the Canva UI. User mentions are shown here in the format [user_id:team_id].

authorUser

Metadata for the user, consisting of the User ID and display name.

Properties of author
idstring

The ID of the user.

display_namestring
OPTIONAL

The name of the user as shown in the Canva UI.

mentionsobject

The Canva users mentioned in the comment.

Properties of mentions
<KEY>object of TeamUsers

Metadata for the user, consisting of the User ID, Team ID, and display name.

{
"oUnPjZ2k2yuhftbWF7873o:oBpVhLW22VrqtwKgaayRbP": {
"user_id": "oUnPjZ2k2yuhftbWF7873o",
"team_id": "oBpVhLW22VrqtwKgaayRbP",
"display_name": "John Doe"
}
}
JSON
user_idstring
OPTIONAL

The ID of the user.

team_idstring
OPTIONAL

The ID of the user's Canva Team.

display_namestring
OPTIONAL

The name of the user as shown in the Canva UI.

attached_toCommentObject
OPTIONAL

Identifying information about the object (such as a design) that the comment is attached to.

Properties of attached_to
typestring

This can be one of the following:

  • design: If the comment is attached to a Canva Design.
design_idstring

The ID of the design this comment is attached to.

created_atinteger
OPTIONAL

When the comment or reply was created, as a Unix timestamp (in seconds since the Unix Epoch).

updated_atinteger
OPTIONAL

When the comment or reply was last updated, as a Unix timestamp (in seconds since the Unix Epoch).

assigneeUser
OPTIONAL

Metadata for the user, consisting of the User ID and display name.

Properties of assignee
idstring

The ID of the user.

display_namestring
OPTIONAL

The name of the user as shown in the Canva UI.

resolverUser
OPTIONAL

Metadata for the user, consisting of the User ID and display name.

Properties of resolver
idstring

The ID of the user.

display_namestring
OPTIONAL

The name of the user as shown in the Canva UI.

Example response

{
"comment": {
"type": "parent",
"id": "KeAbiEAjZEj",
"attached_to": {
"design_id": "DAFVztcvd9z",
"type": "design"
},
"message": "Great work [oUnPjZ2k2yuhftbWF7873o:oBpVhLW22VrqtwKgaayRbP]!",
"author": {
"id": "uKakKUfI03Fg8k2gZ6OkT",
"display_name": "John Doe"
},
"created_at": 1692928800,
"updated_at": 1692928900,
"mentions": {
"oUnPjZ2k2yuhftbWF7873o:oBpVhLW22VrqtwKgaayRbP": {
"user_id": "oUnPjZ2k2yuhftbWF7873o",
"team_id": "oBpVhLW22VrqtwKgaayRbP",
"display_name": "John Doe"
}
},
"assignee": {
"id": "uKakKUfI03Fg8k2gZ6OkT",
"display_name": "John Doe"
},
"resolver": {
"id": "uKakKUfI03Fg8k2gZ6OkT",
"display_name": "John Doe"
}
}
}
JSON

Try it out

Step 1: Enter your access token

To get started, generate an access token or provide your own below