On September 25th, 2024, we released v2 of the Apps SDK. To learn what’s new and how to upgrade, see Migration FAQ and Migration guide.

Exporting designs

How to export a design from Canva.

When Canva's users are ready to share their designs with the world, they can export them in a variety of formats, such as images, videos, and PDF documents.

Apps can also trigger the export of a user's design and then access the URLs of the exported files. This unlocks a range of possibilities for integrating apps with third-party platforms.

Canva is currently not accepting public export-only apps. We intend the export function to be part of a workflow that enhances designing with Canva. To discuss special circumstances, contact Developer support(opens in a new tab or window).

The user experience

At any point in its lifecycle, an app can open an export dialog. In this dialog, the user can customize the settings of the export, such as the file format and resolution.

If a design has more than one page, the user can choose to only export certain pages.

When the user confirms the export, the dialog closes, and the app is responsible for what happens next — for example, showing an alert that confirms the export was successful.

Supported export formats

Apps can export designs in the following formats:

Name
MIME type
Common file extensions
GIF
image/gif
.gif
JPG
image/jpeg
.jpg, .jpeg
MP4 video
video/mp4
.mp4
PDF Standard
application/pdf
.pdf
PNG
image/png
.png
PPTX
application/vnd.ms-powerpoint
.pptx
SVG
image/svg+xml
.svg

How to export a design

Step 1: Open an export dialog

Import the requestExport method from the @canva/design package:

import { requestExport } from "@canva/design";
TS

This method opens a dialog that lets the user configure the export of their design. When calling the method, you need to pass in an array of accepted file types:

await requestExport({
acceptedFileTypes: ["jpg", "png"],
});
TS

These file types appear as selectable options in the export dialog.

Apps must support at least one file type.

Step 2: Download the exported files

When the user exports their design, the requestExport method returns a title for the export and an array of objects. Each of these objects has a url property that points to a static file:

const result = await requestExport({
acceptedFileTypes: ["jpg", "png"],
});
console.log(result); // => { status: "complete", title: "My design", exportBlobs: [{ url: "https://example.com/image.png" }] }
TS

The URL expires after 60 minutes and is secured with a Content Security Policy. We recommend downloading the exported design via the app's backend.

What the app does with the downloaded file is at the discretion of the app.

Handling multi-page designs

A design can have multiple pages, but not all export formats support multiple pages. For example, a PDF can have multiple pages, but there is no such thing as a multi-page PNG.

If the user's design contains multiple pages but is exported in a format that doesn't support multiple pages, the URL will point to a ZIP file that contains each page as a separate file.

For example:

  • If a single-page design is exported as a JPG, the URL will point to a JPG file.
  • If a multi-page design is exported as a JPG, the URL will point to a ZIP file that contains a separate JPG file for each page.
  • If a multi-page design is exported as a PDF, the URL will point to a PDF file that contains all of the pages.

The following file types support multiple pages:

  • "gif"
  • "pdf_standard"
  • "pptx"
  • "video"

The following file types do not support multiple pages:

  • "jpg"
  • "png"
  • "svg"

If a user selects the "video" option, they have the choice of exporting each page as a separate file. In this case, the URL will point to a ZIP file that contains a separate video for each page.

(Optional) Step 3: Handle abandoned exports

The export dialog has a Back button.

When a user clicks this button, the requestExport method returns an object with a status property that has a value of "aborted":

const result = await requestExport({
acceptedFileTypes: ["jpg", "png"],
});
// The user closed the export dialog
console.log(result); // => { status: "aborted" }
TS

After the user clicks the Back button, you should return the user to the previous step of the app's workflow. For example, in an asset management app such as SharePoint, the user should be returned to a view of their connected images.

You can use the status property to update the UI when a user cancels an export.

Known limitations

  • Apps must support at least one export file type.

  • Apps are limited to 500 exports per user, per day, and 75 exports per user every 5 minutes.

  • When a user exports a video, they can't set the quality.

  • If a user without a Canva Pro subscription attempts to export a design that contains premium content, the design will have a watermark. To remove the watermark, the user will have to either:

    • Upgrade to Canva Pro
    • Export the design with a watermark
    • Purchase the premium content.

    For more information about how designs work with premium elements, see Premium elements(opens in a new tab or window).

API reference

Code sample

import React from "react";
import { requestExport } from "@canva/design";
export function App() {
async function handleClick() {
const result = await requestExport({
acceptedFileTypes: ["jpg", "png"],
});
console.log(result);
}
return (
<div>
<button onClick={handleClick}>Export design</button>
</div>
);
}
TSX