Skip to content

Connect API — Designs

Designs Overview

The Canva Connect APIs for managing designs.

The designs endpoint lets you interact with the designs present in a user's content library. For more information about Canva designs, see Canva concepts.

Designs APIs

  • Create design: Create a new Canva design.
  • List designs: List all the user's designs.
  • Get design: Get the metadata for one of the user's designs.
  • Get design pages: Get the metadata for pages in a design.
  • Get design export formats: Get the export formats available for a design.

Create Design

Create a Canva design.

Creates a new Canva design. To create a new design, you can either:

  • Use a preset design type.
  • Set height and width dimensions for a custom design.

Additionally, you can also provide the asset_id of an asset in the user's projects to add to the new design. Currently, this only supports image assets. To list the assets in a folder in the user's projects, use the List folder items API.

NOTE: Blank designs created with this API are automatically deleted if they're not edited within 7 days. These blank designs bypass the user's Canva trash and are permanently deleted.

HTTP method and URL path

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

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

Authentication and authorization

This endpoint requires a valid access token that acts on behalf of a user.

Scopes

The access token must have all the following scopes (permissions):

  • design:content:write

Header parameters

<Prop.List> <Prop name="Authorization" type="string" required> Provides credentials to authenticate the request, in the form of a Bearer token.

For example: `Authorization: Bearer {token}`

</Prop>

<Prop name="Content-Type" type="string" 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`

</Prop> </Prop.List>

Body parameters

<Tabs> <Tab name="type_and_asset"> For backward compatibility, if type isn't specified in the request, the request type will be assumed to be type_and_asset.

&lt;Prop.List&gt;
  &lt;Prop name="type" type="string" required&gt;
    For backward compatibility, if `type` isn't specified in the request, the request type will be assumed to be `type_and_asset`.
  &lt;/Prop&gt;

  &lt;Prop name="design_type" type="DesignTypeInput"&gt;
    The desired design type.

    &lt;Tabs&gt;
      &lt;Tab name="preset"&gt;
        Provide the common design type.

        &lt;Prop.List&gt;
          &lt;Prop name="type" type="string" required&gt;
            &lt;Prop.Extras&gt;
              **Available values:** The only valid value is `preset`.
            &lt;/Prop.Extras&gt;
          &lt;/Prop&gt;

          &lt;Prop name="name" type="string" required&gt;
            The name of the design type.

            &lt;Prop.Extras&gt;
              **Available values:**

              * `doc`: A Canva doc; a document for Canva's online text editor.
              * `email`: An email; for creating email campaign designs.
              * `presentation`: A presentation; lets you create and collaborate for presenting to an audience.
              * `whiteboard`: A whiteboard; a design which gives you infinite space to collaborate.
            &lt;/Prop.Extras&gt;
          &lt;/Prop&gt;
        &lt;/Prop.List&gt;
      &lt;/Tab&gt;

      &lt;Tab name="custom"&gt;
        Provide the width and height to define a custom design type.

        &lt;Prop.List&gt;
          &lt;Prop name="type" type="string" required&gt;
            &lt;Prop.Extras&gt;
              **Available values:** The only valid value is `custom`.
            &lt;/Prop.Extras&gt;
          &lt;/Prop&gt;

          &lt;Prop name="width" type="integer" required&gt;
            The width of the design, in pixels.

            &lt;Prop.Extras&gt;
              **Minimum:** `40`

              **Maximum:** `8000`
            &lt;/Prop.Extras&gt;
          &lt;/Prop&gt;

          &lt;Prop name="height" type="integer" required&gt;
            The height of the design, in pixels.

            &lt;Prop.Extras&gt;
              **Minimum:** `40`

              **Maximum:** `8000`
            &lt;/Prop.Extras&gt;
          &lt;/Prop&gt;
        &lt;/Prop.List&gt;
      &lt;/Tab&gt;
    &lt;/Tabs&gt;
  &lt;/Prop&gt;

  &lt;Prop name="asset_id" type="string"&gt;
    The ID of an asset to insert into the created design. Currently, this only supports image assets.
  &lt;/Prop&gt;

  &lt;Prop name="title" type="string"&gt;
    The name of the design.

    &lt;Prop.Extras&gt;
      **Minimum length:** `1`

      **Maximum length:** `255`
    &lt;/Prop.Extras&gt;
  &lt;/Prop&gt;
&lt;/Prop.List&gt;

</Tab> </Tabs>

Example request

Examples for using the /v1/designs endpoint:

<Tabs storageKey="example.language" disableContentTransition> <Tab name="cURL"> sh curl --request POST 'https://api.canva.com/rest/v1/designs' \ --header 'Authorization: Bearer {token}' \ --header 'Content-Type: application/json' \ --data '{ "type": "type_and_asset", "design_type": { "type": "preset", "name": "doc" }, "asset_id": "Msd59349ff", "title": "My Holiday Presentation" }' </Tab>

<Tab name="Node.js"> ```js const fetch = require("node-fetch");

fetch("https://api.canva.com/rest/v1/designs", {
  method: "POST",
  headers: {
    "Authorization": "Bearer {token}",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "type": "type_and_asset",
    "design_type": {
      "type": "preset",
      "name": "doc"
    },
    "asset_id": "Msd59349ff",
    "title": "My Holiday Presentation"
  }),
})
  .then(async (response) => {
    const data = await response.json();
    console.log(data);
  })
  .catch(err => console.error(err));
```

</Tab>

<Tab name="Java"> ```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"))
            .header("Authorization", "Bearer {token}")
            .header("Content-Type", "application/json")
            .method("POST", HttpRequest.BodyPublishers.ofString("{\"type\": \"type_and_asset\", \"design_type\": {\"type\": \"preset\", \"name\": \"doc\"}, \"asset_id\": \"Msd59349ff\", \"title\": \"My Holiday Presentation\"}"))
            .build();

        HttpResponse<String> response = HttpClient.newHttpClient().send(
            request,
            HttpResponse.BodyHandlers.ofString()
        );
        System.out.println(response.body());
    }
}
```

</Tab>

<Tab name="Python"> ```py import requests

headers = {
    "Authorization": "Bearer {token}",
    "Content-Type": "application/json"
}

data = {
    "type": "type_and_asset",
    "design_type": {
        "type": "preset",
        "name": "doc"
    },
    "asset_id": "Msd59349ff",
    "title": "My Holiday Presentation"
}

response = requests.post("https://api.canva.com/rest/v1/designs",
    headers=headers,
    json=data
)
print(response.json())
```

</Tab>

<Tab name="C#"> ```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"),
  Headers =
  {
    { "Authorization", "Bearer {token}" },
  },
  Content = new StringContent(
    "{\"type\": \"type_and_asset\", \"design_type\": {\"type\": \"preset\", \"name\": \"doc\"}, \"asset_id\": \"Msd59349ff\", \"title\": \"My Holiday Presentation\"}",
    Encoding.UTF8,
    "application/json"
  ),
};

using (var response = await client.SendAsync(request))
{
  response.EnsureSuccessStatusCode();
  var body = await response.Content.ReadAsStringAsync();
  Console.WriteLine(body);
};
```

</Tab>

<Tab name="Go"> ```go package main

import (
	"fmt"
	"io"
	"net/http"
	"strings"
)

func main() {
	payload := strings.NewReader(`{
	  "type": "type_and_asset",
	  "design_type": {
	    "type": "preset",
	    "name": "doc"
	  },
	  "asset_id": "Msd59349ff",
	  "title": "My Holiday Presentation"
	}`)

	url := "https://api.canva.com/rest/v1/designs"
	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))
}
```

</Tab>

<Tab name="PHP"> ```php $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => "https://api.canva.com/rest/v1/designs", CURLOPT_CUSTOMREQUEST => "POST", CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => array( 'Authorization: Bearer {token}', 'Content-Type: application/json', ), CURLOPT_POSTFIELDS => json_encode([ "type" => "type_and_asset", "design_type" => [ "type" => "preset", "name" => "doc" ], "asset_id" => "Msd59349ff", "title" => "My Holiday Presentation" ]) ));

$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);

if (empty($err)) {
  echo $response;
} else {
  echo "Error: " . $err;
}
```

</Tab>

<Tab name="Ruby"> ```ruby require 'net/http' require 'uri'

url = URI('https://api.canva.com/rest/v1/designs')
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
{
  "type": "type_and_asset",
  "design_type": {
    "type": "preset",
    "name": "doc"
  },
  "asset_id": "Msd59349ff",
  "title": "My Holiday Presentation"
}
REQUEST_BODY

response = http.request(request)
puts response.read_body
```

</Tab> </Tabs>

Success response

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

<Prop.List> <Prop name="design" type="Design" required mode="output"> The design object, which contains metadata about the design.

&lt;PillAccordion title={&lt;&gt;Properties of &lt;strong&gt;design&lt;/strong&gt;&lt;/&gt;} defaultExpanded={true}&gt;
  &lt;Prop.List&gt;
    &lt;Prop name="id" type="string" required mode="output"&gt;
      The design ID.
    &lt;/Prop&gt;

    &lt;Prop name="owner" type="TeamUserSummary" required mode="output"&gt;
      Metadata for the user, consisting of the User ID and Team ID.

      &lt;PillAccordion title={&lt;&gt;Properties of &lt;strong&gt;owner&lt;/strong&gt;&lt;/&gt;}&gt;
        &lt;Prop.List&gt;
          &lt;Prop name="user_id" type="string" required mode="output"&gt;
            The ID of the user.
          &lt;/Prop&gt;

          &lt;Prop name="team_id" type="string" required mode="output"&gt;
            The ID of the user's Canva Team.
          &lt;/Prop&gt;
        &lt;/Prop.List&gt;
      &lt;/PillAccordion&gt;
    &lt;/Prop&gt;

    &lt;Prop name="urls" type="DesignLinks" required mode="output"&gt;
      A temporary set of URLs for viewing or editing the design.

      &lt;PillAccordion title={&lt;&gt;Properties of &lt;strong&gt;urls&lt;/strong&gt;&lt;/&gt;}&gt;
        &lt;Prop.List&gt;
          &lt;Prop name="edit_url" type="string" required mode="output"&gt;
            A temporary editing URL for the design. This URL is only accessible to the user that made the API request, and is designed to support return navigation workflows.

            NOTE: This is not a permanent URL, it is only valid for 30 days.
          &lt;/Prop&gt;

          &lt;Prop name="view_url" type="string" required mode="output"&gt;
            A temporary viewing URL for the design. This URL is only accessible to the user that made the API request, and is designed to support return navigation workflows.

            NOTE: This is not a permanent URL, it is only valid for 30 days.
          &lt;/Prop&gt;
        &lt;/Prop.List&gt;
      &lt;/PillAccordion&gt;
    &lt;/Prop&gt;

    &lt;Prop name="created_at" type="integer" required mode="output"&gt;
      When the design was created in Canva, as a Unix timestamp (in seconds since the Unix
      Epoch).
    &lt;/Prop&gt;

    &lt;Prop name="updated_at" type="integer" required mode="output"&gt;
      When the design was last updated in Canva, as a Unix timestamp (in seconds since the
      Unix Epoch).
    &lt;/Prop&gt;

    &lt;Prop name="title" type="string" mode="output"&gt;
      The design title.
    &lt;/Prop&gt;

    &lt;Prop name="thumbnail" type="Thumbnail" mode="output"&gt;
      A thumbnail image representing the object.

      &lt;PillAccordion title={&lt;&gt;Properties of &lt;strong&gt;thumbnail&lt;/strong&gt;&lt;/&gt;}&gt;
        &lt;Prop.List&gt;
          &lt;Prop name="width" type="integer" required mode="output"&gt;
            The width of the thumbnail image in pixels.
          &lt;/Prop&gt;

          &lt;Prop name="height" type="integer" required mode="output"&gt;
            The height of the thumbnail image in pixels.
          &lt;/Prop&gt;

          &lt;Prop name="url" type="string" required mode="output"&gt;
            A URL for retrieving the thumbnail image.
            This URL expires after 15 minutes. This URL includes a query string
            that's required for retrieving the thumbnail.
          &lt;/Prop&gt;
        &lt;/Prop.List&gt;
      &lt;/PillAccordion&gt;
    &lt;/Prop&gt;

    &lt;Prop name="page_count" type="integer" mode="output"&gt;
      The total number of pages in the design. Some design types don't have pages (for example, Canva docs).
    &lt;/Prop&gt;
  &lt;/Prop.List&gt;
&lt;/PillAccordion&gt;

</Prop> </Prop.List>

Example response

json
{
  "design": {
    "id": "DAFVztcvd9z",
    "title": "My summer holiday",
    "owner": {
      "user_id": "auDAbliZ2rQNNOsUl5OLu",
      "team_id": "Oi2RJILTrKk0KRhRUZozX"
    },
    "thumbnail": {
      "width": 595,
      "height": 335,
      "url": "https://document-export.canva.com/Vczz9/zF9vzVtdADc/2/thumbnail/0001.png?<query-string>"
    },
    "urls": {
      "edit_url": "https://www.canva.com/api/design/eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2R0NNIiwiZXhwaXJ5IjoxNzQyMDk5NDAzMDc5fQ..GKLx2hrJa3wSSDKQ.hk3HA59qJyxehR-ejzt2DThBW0cbRdMBz7Fb5uCpwD-4o485pCf4kcXt_ypUYX0qMHVeZ131YvfwGPIhbk-C245D8c12IIJSDbZUZTS7WiCOJZQ.sNz3mPSQxsETBvl_-upMYA/edit",
      "view_url": "https://www.canva.com/api/design/eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2R0NNIiwiZXhwaXJ5IjoxNzQyMDk5NDAzMDc5fQ..GKLx2hrJa3wSSDKQ.hk3HA59qJyxehR-ejzt2DThBW0cbRdMBz7Fb5uCpwD-4o485pCf4kcXt_ypUYX0qMHVeZ131YvfwGPIhbk-C245D8c12IIJSDbZUZTS7WiCOJZQ.sNz3mPSQxsETBvl_-upMYA/view"
    },
    "created_at": 1377396000,
    "updated_at": 1692928800,
    "page_count": 5
  }
}

Canva Developer Documentation SOP Site