> ## Documentation Index > Fetch the complete documentation index at: https://www.canva.dev/docs/apps/llms.txt > Use this file to discover all available pages before exploring further. # Create comment Create a new comment on a design. This preview API is deprecated. You should use the [Create thread](https://www.canva.dev/docs/apps/rest-apis/reference/comments/create-thread/) API instead. 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](https://www.canva.com/help/comments/). 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 app. ## Authentication and authorization This endpoint requires a valid access token that acts on behalf of a user. For more information, see [Generate an access token](/docs/apps/rest-apis/reference/authentication/generate-access-token). ### Scopes The access token must have all the following [scopes](/docs/apps/rest-apis/scopes) (permissions): * `comment:write` ## Header parameters Provides credentials to authenticate the request, in the form of a `Bearer` token. For example: `Authorization: Bearer {token}` 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 An object containing identifying information for the design or other object you want to attach the comment to. If the comment is attached to a Canva Design. **Available values:** The only valid value is `design`. The ID of the design you want to attach this comment to. 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. **Minimum length:** `1` **Maximum length:** `2048` 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: ```sh 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" }' ``` ```js 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)); ``` ```java 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 response = HttpClient.newHttpClient().send( request, HttpResponse.BodyHandlers.ofString() ); System.out.println(response.body()); } } ``` ```py 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()) ``` ```csharp 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); }; ``` ```go 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)) } ``` ```php $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; } ``` ```ruby 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 = < ## Success response If successful, the endpoint returns a `200` response with a JSON body with the following parameters: Data about the comment, including the message, author, and the object (such as a design) the comment is attached to. Properties of comment} defaultExpanded={true}> The type of comment. When creating a new parent (top-level) comment, the `type` is `parent`. **Available values:** The only valid value is `parent`. The ID of the comment. You can use this ID to create replies to the comment using the [Create reply API](https://www.canva.dev/docs/apps/rest-apis/reference/comments/create-reply/). 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]`. Metadata for the user, consisting of the User ID and display name. Properties of author}> The ID of the user. The name of the user as shown in the Canva UI. When the comment or reply was created, as a Unix timestamp (in seconds since the Unix Epoch). When the comment or reply was last updated, as a Unix timestamp (in seconds since the Unix Epoch). Metadata for the user, consisting of the User ID and display name. Properties of assignee}> The ID of the user. The name of the user as shown in the Canva UI. Metadata for the user, consisting of the User ID and display name. Properties of resolver}> The ID of the user. The name of the user as shown in the Canva UI. The Canva users mentioned in the comment. Properties of mentions}> Metadata for the user, consisting of the User ID, Team ID, and display name. The ID of the user. The ID of the user's Canva Team. The name of the user as shown in the Canva UI. Identifying information about the object (such as a design) that the comment is attached to. If the comment is attached to a Canva Design. **Available values:** The only valid value is `design`. The ID of the design this comment is attached to. ## Example response ```json {} ``` ## Error responses ### 400 Bad Request A short string indicating what failed. This field can be used to handle errors programmatically. For a complete list of error codes, see [Error responses](/docs/apps/rest-apis/error-responses/). A human-readable description of what went wrong. #### Example error responses ##### Assignee must be mentioned in comment content ```json { "code": "bad_request_body", "message": "Assignee must be mentioned in comment content" } ``` ##### Message is too long ```json { "code": "message_too_long", "message": "Message is too long" } ``` ##### Mentions with non-obfuscated IDs are not allowed for this client ```json { "code": "invalid_field", "message": "Invalid IDs" } ``` ### 403 Forbidden A short string indicating what failed. This field can be used to handle errors programmatically. For a complete list of error codes, see [Error responses](/docs/apps/rest-apis/error-responses/). A human-readable description of what went wrong. #### Example error responses ##### Design already has the maximum number of allowed comments ```json { "code": "too_many_comments", "message": "Design already has the maximum number of allowed comments" } ``` ##### Not allowed to comment on this design ```json { "code": "permission_denied", "message": "Not allowed to comment on this design" } ``` ### 404 Not Found A short string indicating what failed. This field can be used to handle errors programmatically. For a complete list of error codes, see [Error responses](/docs/apps/rest-apis/error-responses/). A human-readable description of what went wrong. #### Example error responses ##### Design not found ```json { "code": "design_not_found", "message": "Design not found" } ``` ##### A mentioned user could not be found ```json { "code": "user_not_found", "message": "Invalid user ID" } ``` ##### A mentioned user's team could not be found ```json { "code": "team_not_found", "message": "Invalid brand ID" } ```