Skip navigation Skip to main content [](https://www.canva.com/developers/) * [Home](/) * Documentation * Blogs * [Your apps](https://www.canva.com/developers/apps) * [Your integrations](https://www.canva.com/developers/integrations) Designs [Overview](/docs/connect/api-reference/designs/)[Create design](/docs/connect/api-reference/designs/create-design/)[List designs](/docs/connect/api-reference/designs/list-designs/)[Get design](/docs/connect/api-reference/designs/get-design/)[Get design pages](/docs/connect/api-reference/designs/get-design-pages/)[Get design export formats](/docs/connect/api-reference/designs/get-design-export- formats/) [Designs](/docs/connect/api-reference/designs/) # Create design Create a Canva design. Copy page 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⁠(opens in a new tab or window)](https://www.canva.com/help/find- designs-and-folders/) 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](/docs/connect/api-reference/folders/list-folder- items/). 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](/docs/connect/appendix/scopes/) (permissions): * `design:content:write` ## Header parameters `Authorization``string` Required Provides credentials to authenticate the request, in the form of a `Bearer` token. For example: `Authorization: Bearer {token}` `Content-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` ## Body parameters Expand all `design_type``DesignTypeInput` Optional The desired design type. presetpreset customcustom Provide the common design type. `type``string` Required **Available values:** The only valid value is `preset`. `name``string` Required The name of the design type. **Available values:** * `doc`: A [Canva doc⁠(opens in a new tab or window)](https://www.canva.com/docs/); a document for Canva's online text editor. * `whiteboard`: A [whiteboard⁠(opens in a new tab or window)](https://www.canva.com/online-whiteboard/); a design which gives you infinite space to collaborate. * `presentation`: A [presentation⁠(opens in a new tab or window)](https://www.canva.com/presentations/); lets you create and collaborate for presenting to an audience. Provide the width and height to define a custom design type. `type``string` Required **Available values:** The only valid value is `custom`. `width``integer` Required The width of the design, in pixels. **Minimum:** `40` **Maximum:** `8000` `height``integer` Required The height of the design, in pixels. **Minimum:** `40` **Maximum:** `8000` `asset_id``string` Optional The ID of an asset to insert into the created design. Currently, this only supports image assets. `title``string` Optional The name of the design. **Minimum length:** `1` **Maximum length:** `255` ## Example request Examples for using the `/v1/designs` endpoint: cURLcURL Node.jsNode.js JavaJava PythonPython C#C# GoGo PHPPHP RubyRuby curl --request POST 'https://api.canva.com/rest/v1/designs' \ --header 'Authorization: Bearer {token}' \ --header 'Content-Type: application/json' \ --data '{ "design_type": { "type": "preset", "name": "doc" }, "asset_id": "Msd59349ff", "title": "My Holiday Presentation" }' SH Copy 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({ "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)); JS Copy 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("{\"design_type\": {\"type\": \"preset\", \"name\": \"doc\"}, \"asset_id\": \"Msd59349ff\", \"title\": \"My Holiday Presentation\"}")) .build(); HttpResponse response = HttpClient.newHttpClient().send( request, HttpResponse.BodyHandlers.ofString() ); System.out.println(response.body()); } } JAVA Copy import requests headers = { "Authorization": "Bearer {token}", "Content-Type": "application/json" } data = { "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()) PY Copy 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( "{\"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); }; CSHARP Copy package main import ( "fmt" "io" "net/http" "strings" ) func main() { payload := strings.NewReader(`{ "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)) } GO Copy $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([ "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; } PHP Copy 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 = <" }, "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 } } JSON Copy ## Try it out **This uses your live Canva data.** This is not a sandbox/playground. This form performs API requests against your account's actual live Canva data. Make sure that you understand what the request is doing, as well as the requirements for each parameter detailed above. ### Step 1: Enter your access token To get started, generate an access token or provide your own below Generate an access token Access token [Community](https://community.canva.dev/)[Get Help](https://canva- external.atlassian.net/servicedesk/customer/portal/2/group/2)[GitHub](https://github.com/canva- sdks/canva-connect-api-starter-kit) Was this page useful?YesNo * * * © 2025 All Rights Reserved. Canva® [Privacy policy](https://www.canva.com/policies/privacy- policy/)[Terms](https://www.canva.com/policies/) [](https://www.facebook.com/canva)[](https://x.com/canva)[](https://www.pinterest.com/canva)[](https://instagram.com/canva)