> ## 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.
# Get thread
Get metadata for a comment thread.
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.
Gets a comment or suggestion thread on a design.
To retrieve a reply to a comment thread, use the [Get reply](https://www.canva.dev/docs/apps/rest-apis/reference/comments/get-reply/) API.
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
GET https\://api.canva.com/rest/v1/designs/\{designId}/comments/\{threadId}
This operation is rate limited to 100 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:read`
## Header parameters
Provides credentials to authenticate the request, in the form of a `Bearer` token.
For example: `Authorization: Bearer {token}`
## Path parameters
The design ID.
The ID of the thread.
## Example request
Examples for using the `/v1/designs/{designId}/comments/{threadId}` endpoint:
```sh
curl --request GET 'https://api.canva.com/rest/v1/designs/{designId}/comments/{threadId}' \
--header 'Authorization: Bearer {token}'
```
```js
const fetch = require("node-fetch");
fetch("https://api.canva.com/rest/v1/designs/{designId}/comments/{threadId}", {
method: "GET",
headers: {
"Authorization": "Bearer {token}",
},
})
.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}"))
.header("Authorization", "Bearer {token}")
.method("GET", HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse response = HttpClient.newHttpClient().send(
request,
HttpResponse.BodyHandlers.ofString()
);
System.out.println(response.body());
}
}
```
```py
import requests
headers = {
"Authorization": "Bearer {token}"
}
response = requests.get("https://api.canva.com/rest/v1/designs/{designId}/comments/{threadId}",
headers=headers
)
print(response.json())
```
```csharp
using System.Net.Http;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("https://api.canva.com/rest/v1/designs/{designId}/comments/{threadId}"),
Headers =
{
{ "Authorization", "Bearer {token}" },
},
};
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"
)
func main() {
url := "https://api.canva.com/rest/v1/designs/{designId}/comments/{threadId}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer {token}")
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}",
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => array(
'Authorization: Bearer {token}',
),
));
$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}')
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request['Authorization'] = 'Bearer {token}'
response = http.request(request)
puts response.read_body
```
## Success response
If successful, the endpoint returns a `200` response with a JSON body with the following parameters:
A discussion thread on a design.
The `type` of the thread can be found in the `thread_type` object, along with additional type-specific properties.
The `author` of the thread might be missing if that user account no longer exists.
Properties of thread>} defaultExpanded={true}>
The ID of the thread.
You can use this ID to create replies to the thread using the [Create reply API](https://www.canva.dev/docs/apps/rest-apis/reference/comments/create-reply/).
The ID of the design that the discussion thread is on.
The type of the discussion thread, along with additional type-specific properties.
A comment thread.
**Available values:** The only valid value is `comment`.
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.
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.
A suggestion thread.
**Available values:** The only valid value is `suggestion`.
The type of the suggested edit, along with additional type-specific properties.
**Minimum items:** `1`
A suggestion to add some text.
**Available values:** The only valid value is `add`.
A suggestion to delete some text.
**Available values:** The only valid value is `delete`.
A suggestion to format some text.
**Available values:** The only valid value is `format`.
The suggested format change.
**Available values:**
* `font_family`
* `font_size`
* `font_weight`
* `font_style`
* `color`
* `background_color`
* `decoration`
* `strikethrough`
* `link`
* `letter_spacing`
* `line_height`
* `direction`
* `text_align`
* `list_marker`
* `list_level`
* `margin_inline_start`
* `text_indent`
* `font_size_modifier`
* `vertical_align`
The current status of the suggestion.
**Available values:**
* `open`: A suggestion was made, but it hasn't been accepted or rejected yet.
* `accepted`: A suggestion was accepted and applied to the design.
* `rejected`: A suggestion was rejected and not applied to the design.
When the thread was created, as a Unix timestamp
(in seconds since the Unix Epoch).
When the thread 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.
The comment object, which contains metadata about the comment.
Deprecated in favor of the new `thread` object.
Data about the comment, including the message, author, and
the object (such as a design) the comment is attached to.
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.
Data about the reply comment, including the message, author, and
the object (such as a design) the comment is attached to.
The type of comment. When creating a reply to a top-level
comment, the `type` is `reply`.
**Available values:** The only valid value is `reply`.
The ID of the comment.
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.
The ID of the comment thread this reply is in. This ID is the same as the `id` of the
parent comment.
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).
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
{
"thread": {
"id": "KeAbiEAjZEj",
"design_id": "DAFVztcvd9z",
"thread_type": {
"type": "comment",
"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"
}
}
},
"assignee": {
"id": "uKakKUfI03Fg8k2gZ6OkT",
"display_name": "John Doe"
},
"resolver": {
"id": "uKakKUfI03Fg8k2gZ6OkT",
"display_name": "John Doe"
}
},
"author": {
"id": "uKakKUfI03Fg8k2gZ6OkT",
"display_name": "John Doe"
},
"created_at": 1692928800,
"updated_at": 1692928900
}
}
```
## Error responses
### 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
##### Not allowed to fetch this comment
```json
{
"code": "permission_denied",
"message": "Not allowed to fetch this comment"
}
```
##### Not allowed to fetch this suggestion
```json
{
"code": "permission_denied",
"message": "Not allowed to fetch this suggestion"
}
```
### 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
##### No thread with ID found
```json
{
"code": "thread_not_found",
"message": "No thread with ID {threadId} found"
}
```
##### Thread not attached to design
```json
{
"code": "thread_not_found",
"message": "Thread with ID {threadId} is not attached to design {designId}, or design not found"
}
```
##### No suggestion thread with ID found
```json
{
"code": "thread_not_found",
"message": "Suggestion with ID {threadId} not found"
}
```