> ## 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 reply
Reply to a 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](https://www.canva.dev/docs/apps/rest-apis/versions/).
* Public apps that use preview APIs will not pass the review process, and can't be made available to all Canva users.
Creates a reply to a comment or suggestion thread on a design.
To reply to an existing thread, you must provide the ID of the thread
which is returned when a thread is created, or from the `thread_id` value
of an existing reply in the thread. Each thread can
have a maximum of 100 replies created for it.
For information on comments and how they're used in the Canva UI, see the
[Canva Help Center](https://www.canva.com/help/comments/).
## HTTP method and URL path
POST https\://api.canva.com/rest/v1/designs/\{designId}/comments/\{threadId}/replies
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`
## Path parameters
The design ID.
The ID of the thread.
## Body parameters
The comment message of the reply in plaintext. This is the reply comment 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]`.
**Minimum length:** `1`
**Maximum length:** `2048`
## Example request
Examples for using the `/v1/designs/{designId}/comments/{threadId}/replies` endpoint:
```sh
curl --request POST 'https://api.canva.com/rest/v1/designs/{designId}/comments/{threadId}/replies' \
--header 'Authorization: Bearer {token}' \
--header 'Content-Type: application/json' \
--data '{
"message_plaintext": "Thanks!"
}'
```
```js
const fetch = require("node-fetch");
fetch("https://api.canva.com/rest/v1/designs/{designId}/comments/{threadId}/replies", {
method: "POST",
headers: {
"Authorization": "Bearer {token}",
"Content-Type": "application/json",
},
body: JSON.stringify({
"message_plaintext": "Thanks!"
}),
})
.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/designs/{designId}/comments/{threadId}/replies"))
.header("Authorization", "Bearer {token}")
.header("Content-Type", "application/json")
.method("POST", HttpRequest.BodyPublishers.ofString("{\"message_plaintext\": \"Thanks!\"}"))
.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 = {
"message_plaintext": "Thanks!"
}
response = requests.post("https://api.canva.com/rest/v1/designs/{designId}/comments/{threadId}/replies",
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/designs/{designId}/comments/{threadId}/replies"),
Headers =
{
{ "Authorization", "Bearer {token}" },
},
Content = new StringContent(
"{\"message_plaintext\": \"Thanks!\"}",
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(`{
"message_plaintext": "Thanks!"
}`)
url := "https://api.canva.com/rest/v1/designs/{designId}/comments/{threadId}/replies"
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/designs/{designId}/comments/{threadId}/replies",
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => array(
'Authorization: Bearer {token}',
'Content-Type: application/json',
),
CURLOPT_POSTFIELDS => json_encode([
"message_plaintext" => "Thanks!"
])
));
$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/designs/{designId}/comments/{threadId}/replies')
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:
A reply to a thread.
The `author` of the reply might be missing if that user account no longer exists.
Properties of reply>} defaultExpanded={true}>
The ID of the reply.
The ID of the design that the thread for this reply is attached to.
The ID of the thread this reply is in.
The content of a comment thread or reply.
Properties of content>}>
The content in plaintext.
Any user mention tags are shown in the format `[user_id:team_id]`.
The content in markdown.
Any user mention tags are shown in the format `[user_id:team_id]`
The Canva users mentioned in the comment thread or reply.
Properties of mentions>}>
Information about the user mentioned in a comment thread or reply. Each user mention is keyed using the user's user ID and team ID separated by a colon (`user_id:team_id`).
```json
{
"oUnPjZ2k2yuhftbWF7873o:oBpVhLW22VrqtwKgaayRbP": {
"tag": "oUnPjZ2k2yuhftbWF7873o:oBpVhLW22VrqtwKgaayRbP",
"user": {
"user_id": "oUnPjZ2k2yuhftbWF7873o",
"team_id": "oBpVhLW22VrqtwKgaayRbP",
"display_name": "John Doe"
}
}
}
```
The mention tag for the user mentioned in the comment thread or reply content. This has the format of the user's user ID and team ID separated by a colon (`user_id:team_id`).
Metadata for the user, consisting of the User ID, Team ID, and display name.
Properties of user>}>
The ID of the user.
The ID of the user's Canva Team.
The name of the user as shown in the Canva UI.
When the reply was created, as a Unix timestamp
(in seconds since the Unix Epoch).
When the 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 author>}>
The ID of the user.
The name of the user as shown in the Canva UI.
## Example response
```json
{
"reply": {
"id": "KeAZEAjijEb",
"design_id": "DAFVztcvd9z",
"thread_id": "KeAbiEAjZEj",
"author": {
"id": "uKakKUfI03Fg8k2gZ6OkT",
"display_name": "John Doe"
},
"content": {
"plaintext": "Great work [oUnPjZ2k2yuhftbWF7873o:oBpVhLW22VrqtwKgaayRbP]!",
"markdown": "*_Great work_* [oUnPjZ2k2yuhftbWF7873o:oBpVhLW22VrqtwKgaayRbP]!"
},
"mentions": {
"oUnPjZ2k2yuhftbWF7873o:oBpVhLW22VrqtwKgaayRbP": {
"tag": "oUnPjZ2k2yuhftbWF7873o:oBpVhLW22VrqtwKgaayRbP",
"user": {
"user_id": "oUnPjZ2k2yuhftbWF7873o",
"team_id": "oBpVhLW22VrqtwKgaayRbP",
"display_name": "John Doe"
}
}
},
"created_at": 1692929800,
"updated_at": 1692929900
}
}
```
## 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
##### 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
##### This comment thread already has the maximum number of allowed replies
```json
{
"code": "too_many_replies",
"message": "This comment thread already has the maximum number of allowed replies"
}
```
##### Not allowed to reply on this design
```json
{
"code": "permission_denied",
"message": "Not allowed to reply 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 or comment not found
```json
{
"code": "design_not_found",
"message": "Design or comment 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"
}
```