<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Canva Developers</title>
    <description>The latest articles on DEV Community by Canva Developers (@canvadevs).</description>
    <link>https://dev.to/canvadevs</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F7595%2Fa3f6cf4a-c779-4749-9568-d7b896fc9ee9.png</url>
      <title>DEV Community: Canva Developers</title>
      <link>https://dev.to/canvadevs</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/canvadevs"/>
    <language>en</language>
    <item>
      <title>Streamlining Real Estate content creation</title>
      <dc:creator>Meredith Hassett</dc:creator>
      <pubDate>Tue, 06 May 2025 14:42:51 +0000</pubDate>
      <link>https://dev.to/canvadevs/streamlining-real-estate-content-creation-dhb</link>
      <guid>https://dev.to/canvadevs/streamlining-real-estate-content-creation-dhb</guid>
      <description>&lt;p&gt;In today’s fast-moving real estate market, marketing is constant, high-volume, and essential. Every property—past, present, and future—needs its own set of branded assets: flyers, brochures, social posts, signage, and more. Canva has become a go-to tool for agents, brokers, and marketing teams to create these assets quickly and beautifully.&lt;/p&gt;

&lt;p&gt;If you’re in the real estate tech space, building a Canva App can offer a serious competitive advantage, with teams at eXp, Cloze, and Ray White already seeing huge benefits for their teams. Whether you're managing a brokerage platform, CRM, or listing syndication service, integrating directly with Canva lets your users seamlessly access listing assets inside the Canva editor—boosting productivity and brand consistency.&lt;/p&gt;

&lt;p&gt;Here’s why and how to do it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Real Estate Professionals Use Canva (And Why You Should Integrate With It)
&lt;/h2&gt;

&lt;p&gt;Real estate teams rely on Canva for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;High-frequency marketing: Each listing needs multiple creative assets.&lt;/li&gt;
&lt;li&gt;Design flexibility: Templates, branding kits, and team collaboration tools.&lt;/li&gt;
&lt;li&gt;Device flexibility: Mobile-first agents and desktop-based marketers both benefit.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Many companies—large and small—have already built public or private Canva apps to streamline real estate marketing workflows. These apps connect property databases, image libraries, and listing metadata directly into Canva. The result? Less time copy/pasting, more time selling.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Use Case: You Need an App That...
&lt;/h2&gt;

&lt;p&gt;Most teams end up needing an integration that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pulls listing data (photos, text, metadata) from their system&lt;/li&gt;
&lt;li&gt;Supports listings across all statuses (live, pending, sold, etc.)&lt;/li&gt;
&lt;li&gt;Organizes content in a structured, browsable format&lt;/li&gt;
&lt;li&gt;Works well on both mobile and desktop&lt;/li&gt;
&lt;li&gt;Allows users to drag images and text into designs&lt;/li&gt;
&lt;li&gt;Optionally, exports finished designs back to their source system&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We know many teams end up printing their designs. At the time of publication of this guide, exporting as Print Quality PDF isn't currently supported using the API. If your team needs to print these created resources, it would be best to manually download instead of programatic API export.&lt;/p&gt;

&lt;p&gt;Let’s walk through the architecture and some practical implementation tips.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Connect to Your Source System
&lt;/h3&gt;

&lt;p&gt;While many Canva apps avoid a login-first flow, real estate integrations are an exception. Users need access to their own listings, which usually requires authentication. Many real estate companies also choose to make their Apps team restricted. Since these apps are specific to the team, the advertising in the Apps Marketplace may not be necessary. For the team restricted real estate app to work best, make sure the organization is all in one Canva Team or Enterprise account.&lt;/p&gt;

&lt;p&gt;We recommend using &lt;a href="https://www.canva.dev/docs/apps/authenticating-users/oauth/" rel="noopener noreferrer"&gt;OAuth 2.0&lt;/a&gt; for secure, token-based auth. We’ve created functions to help manage access and token refresh. Remember to register your app on your 3rd party service. &lt;/p&gt;

&lt;p&gt;When building out the Auth flow, we know most development teams build it once and then never touch it again. To make it easier to build our auth, we have created auth patterns and samples to simply the UX and token exchange. Check out our &lt;a href="https://www.canva.com/link?target=https%3A%2F%2Fgithub.com%2Fcanva-sdks%2Fcanva-apps-sdk-starter-kit%2Ftree%2Fmain%2Fexamples%2Fauthentication&amp;amp;design=DAGlr4RRlFg&amp;amp;accessRole=owner&amp;amp;linkSource=document" rel="noopener noreferrer"&gt;sample auth flow&lt;/a&gt; on GitHub.&lt;/p&gt;

&lt;p&gt;To get started with Auth, simply import the auth resource from the Canva User API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;auth&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@canva/user”
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Your backend code for your Canva app
&lt;/h3&gt;

&lt;p&gt;When building Canva apps, Canva hosts the frontend/UI of the app in the editor, so any backend services you need will have to be self hosted. You can use any cloud provider or hosting service. Canva frontends use browser fetch to communicate with their backends, so just make sure your backend architecture supports fetch calls.&lt;/p&gt;

&lt;p&gt;Many teams handle OAuth in the backend. This adds an additional layer of security, as the browser can always be inspected to find keys or tokens. We have found most teams backends typically consists of an authorization layer, that connects the frontend to the MLS datasource.&lt;/p&gt;

&lt;p&gt;After gaining authorization to the MLS datasource, your app will need to pull in the actually listing data. Some data manipulation may also be needed, as listing information can come in different formatting. Also consider any potential sorting, filtering, or paging you may want to do. &lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Organize Listing Resources
&lt;/h3&gt;

&lt;p&gt;Once your user have access to your listing data, it’s time to access those resources in an organized way. Keep in mind real estate assets work best when visually and contextually grouped. One common pattern we see among our real estate apps is organizing listings this way:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tabs = Listing status

&lt;ul&gt;
&lt;li&gt;Active, Pending, In Escrow, Sold, For Rent, Rented, etc&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Top-level folders = Properties&lt;/li&gt;

&lt;li&gt;Inside folders = Photos and Text Content&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.canva.dev%2F_next%2Fstatic%2Fmedia%2Fexample_layouts.373aa913.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.canva.dev%2F_next%2Fstatic%2Fmedia%2Fexample_layouts.373aa913.png" alt="examples of how to layout the listing pages" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We’ve created a pattern called &lt;a href="https://www.canva.dev/docs/apps/app-components/searchable-list-view/" rel="noopener noreferrer"&gt;SearchableListView&lt;/a&gt; that supports this general structure. SearchableListView lets you to define a layout, which it would be best to use List or Full Width for the real estate listing use case. This makes sure that properties are quickly browsable by agents. It’s supports a tabbed structure to quickly layout the top filter your team may use. To enable tabs, use the &lt;code&gt;containerTypes&lt;/code&gt; config, and specify an array similar to below. See all the configs in the &lt;a href="https://www.canva.dev/docs/apps/app-templates/storybook/?path=/docs/app-components-searchable-list-view-searchablelistview--docs" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"collection"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Collections"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"listingSurfaces"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"section"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Sections"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"listingSurfaces"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"folder"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Folders"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"listingSurfaces"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"icon"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"folder"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also provide filtering and sorting options, which are fully customizable to match your teams need.&lt;/p&gt;

&lt;p&gt;When laying out properties, we would recommend keeping a folder like experience with an optional hero image and clear text for the property, most likely it’s address. You can use components like our &lt;a href="https://www.canva.dev/docs/apps/app-ui-kit/storybook/?path=/docs/components-card-imagecard--docs" rel="noopener noreferrer"&gt;image cards&lt;/a&gt; or &lt;a href="https://www.canva.dev/docs/apps/app-ui-kit/storybook/?path=/docs/components-card-horizontalcard--docs" rel="noopener noreferrer"&gt;horizontal cards&lt;/a&gt;. Make sure to use the &lt;a href="https://www.canva.dev/docs/apps/app-ui-kit/storybook/?path=/story/components-layout-rows--rows-spacing" rel="noopener noreferrer"&gt;rows&lt;/a&gt; layout component to keep the look and feel clean. &lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Keep the metadata clean
&lt;/h3&gt;

&lt;p&gt;Each property will have both text and image assets. Your user’s properties may also have videos. When an agent clicks into a singular listing, they will need to be able to locate assets quickly and efficiently. Organizing them by type, text or image, the agents will be able to quickly get to the metadata they need.&lt;/p&gt;

&lt;p&gt;When building out the individual listing pages, you can also use &lt;a href="https://www.canva.dev/docs/apps/app-ui-kit/storybook/?path=/docs/components-tabs-tabs--docs" rel="noopener noreferrer"&gt;tabs&lt;/a&gt; to make it easy to switch between the types of assets. Tabs are also flexible, so if you need an optional 3rd tab for videos on some listings, it’s easy to include more in the list. &lt;/p&gt;

&lt;p&gt;For the assets within the tabs, your users may be on desktop or mobile, so make sure to support both drag and click actions. To support both onDragStart and onClick functions, we’ve created some helpful components:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.canva.dev/docs/apps/app-ui-kit/storybook/?path=/docs/components-card-imagecard--docs" rel="noopener noreferrer"&gt;Image Card&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.canva.dev/docs/apps/app-ui-kit/storybook/?path=/docs/components-card-typographycard--docs" rel="noopener noreferrer"&gt;Typography Card&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For the image layout, image cards can be used in a masonry layout. &lt;a href="https://www.canva.dev/docs/apps/app-ui-kit/storybook/?path=/docs/components-layout-masonry--docs" rel="noopener noreferrer"&gt;Masonry&lt;/a&gt; is the best way to optimize screen layout utilization and is responsive to screen and editor size. There’s a great &lt;a href="https://github.com/canva-sdks/canva-apps-sdk-starter-kit/tree/main/examples/masonry" rel="noopener noreferrer"&gt;example&lt;/a&gt; of the masonry component in our GitHub sample code library.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ImageCard&lt;/span&gt;
  &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{}}&lt;/span&gt;
  &lt;span class="nx"&gt;onDragStart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{}}&lt;/span&gt;
  &lt;span class="nx"&gt;thumbnailUrl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="err"&gt;”&lt;/span&gt;&lt;span class="nx"&gt;ADD&lt;/span&gt; &lt;span class="nx"&gt;YOUR&lt;/span&gt; &lt;span class="nx"&gt;URL&lt;/span&gt; &lt;span class="nx"&gt;HERE&lt;/span&gt;&lt;span class="err"&gt;”&lt;/span&gt;
&lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;TypographyCard&lt;/span&gt;
    &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{}}&lt;/span&gt;
    &lt;span class="nx"&gt;onDragStart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{}}&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Text&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;ADD&lt;/span&gt; &lt;span class="nx"&gt;YOUR&lt;/span&gt; &lt;span class="nx"&gt;TEXT&lt;/span&gt; &lt;span class="nx"&gt;HERE&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Text&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/TypographyCard&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 5: Exporting Designs Back to Your System (if needed)
&lt;/h3&gt;

&lt;p&gt;Want to close the loop? You can include an &lt;a href="https://www.canva.dev/docs/apps/exporting-designs/" rel="noopener noreferrer"&gt;export&lt;/a&gt; capability so that users can save their finished Canva designs (e.g., brochures or social posts) back to your platform or listing CMS. The Canva design API lets you to request design exports as common file types like PNG, PDF, video, and PPTX. Once an export is complete, you will receive an export blob. Make sure your source system can accept the exported blob. As a reminder, this API at time of publishing this guide doesn't support exporting as print quality PDF, so if these resources will be printed, it is best to manually export. &lt;/p&gt;

&lt;p&gt;To get started with exporting, import the requestExport resource from the design API.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;requestExport&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@canva/design&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There’s &lt;a href="https://github.com/canva-sdks/canva-apps-sdk-starter-kit/tree/main/examples/export" rel="noopener noreferrer"&gt;sample code&lt;/a&gt; available on GitHub. &lt;/p&gt;

&lt;h2&gt;
  
  
  Templates and Sample Code
&lt;/h2&gt;

&lt;p&gt;Much of this logic is already encapsulated in our &lt;a href="https://www.canva.dev/docs/apps/app-templates/digital-asset-management/" rel="noopener noreferrer"&gt;Digital Assets Management&lt;/a&gt; template and accessible in the Canva CLI. You’ll find:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Auth flow examples&lt;/li&gt;
&lt;li&gt;Container and card layouts&lt;/li&gt;
&lt;li&gt;Tabbed views and filters&lt;/li&gt;
&lt;li&gt;Drag-and-drop image and text components&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Try out using the DAM template to help you get started. You can quickly spin up the DAM example directly from your command line tool of choice. Make sure you have node and npm installed and run this command to install our CLI.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @canva/cli@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once the CLI is installed, you can run the create command to generate all the code needed for the DAM template.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;canva apps create &lt;span class="nt"&gt;--template&lt;/span&gt; &lt;span class="s2"&gt;"dam"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And as always you can find more sample code in our &lt;a href="https://github.com/canva-sdks/canva-apps-sdk-starter-kit/tree/main/examples/digital_asset_management" rel="noopener noreferrer"&gt;GitHub repo&lt;/a&gt;. Each new API we release always comes accompanied by sample code, as well as some of our more complex UI patterns. &lt;/p&gt;

&lt;h2&gt;
  
  
  Closing out
&lt;/h2&gt;

&lt;p&gt;For real estate tech platforms, Canva integration isn’t just a nice-to-have—it’s a productivity unlock for agents and teams under constant marketing pressure. By meeting your users where they already work (Canva), and feeding them the assets they already own (listings), you reduce friction and boost results.&lt;/p&gt;

&lt;p&gt;Ready to build your Canva app? Talk with your team about their requirements first. And then explore all the tools we have like the CLI and templates, and use this guide to structure your integration with some of Canva’s best practices.&lt;/p&gt;

</description>
      <category>realestate</category>
      <category>workflow</category>
      <category>automation</category>
    </item>
    <item>
      <title>Introducing the Canva Dev MCP Server</title>
      <dc:creator>Meredith Hassett</dc:creator>
      <pubDate>Wed, 16 Apr 2025 00:00:00 +0000</pubDate>
      <link>https://dev.to/canvadevs/introducing-the-canva-dev-mcp-server-4k5e</link>
      <guid>https://dev.to/canvadevs/introducing-the-canva-dev-mcp-server-4k5e</guid>
      <description>&lt;p&gt;AI coding assistants can significantly boost developer velocity but can struggle when they lack platform-specific knowledge. For example, Canva developers face the frustration of having to repeatedly teach AI assistants about Canva's unique components, patterns, and best practices in every new session.&lt;/p&gt;

&lt;p&gt;To help solve this, we're excited to introduce the &lt;strong&gt;Canva Dev MCP Server&lt;/strong&gt;: a tool designed to transform your AI assistants from generic coding helpers into Canva development experts.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is the Canva Dev MCP Server?
&lt;/h2&gt;

&lt;p&gt;Let's first define the Model Context Protocol (&lt;a href="https://modelcontextprotocol.io/introduction" rel="noopener noreferrer"&gt;MCP&lt;/a&gt;):&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;MCP is an open protocol that standardizes how applications provide context to LLMs. Think of MCP like a USB-C port for AI applications. Just as USB-C provides a standardized way to connect your devices to various peripherals and accessories, MCP provides a standardized way to connect AI models to different data sources and tools.&lt;/p&gt;

&lt;p&gt;— &lt;a href="https://modelcontextprotocol.io/introduction" rel="noopener noreferrer"&gt;Model Context Protocol Documentation&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Building on this foundation, the Canva Dev MCP Server provides comprehensive, real-time Canva development context and tools to LLMs to help you build on Canva faster.&lt;/p&gt;

&lt;h2&gt;
  
  
  What can you do with the Canva Dev MCP Server?
&lt;/h2&gt;

&lt;p&gt;Let's dive straight into some demos, to give you a glimpse of what you can do with the Canva Dev MCP.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Generate Canva apps
&lt;/h3&gt;

&lt;p&gt;With a single prompt, the MCP Server can create a fully structured app that follows established best practices, by invoking the &lt;a href="https://www.npmjs.com/package/@canva/cli" rel="noopener noreferrer"&gt;Canva CLI&lt;/a&gt; app generator. Then, once your app is created, it can help you add new features using various methods from the &lt;a href="https://www.canva.dev/docs/apps/" rel="noopener noreferrer"&gt;Apps SDK&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsg5402l0hdt2k8zu7v7e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsg5402l0hdt2k8zu7v7e.png" alt="Generate Canva Apps with prompts in VS Code" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.canva.com/design/DAGkMW20EY8/1BkClpkiUPrA6KJgq0VdqA/watch" rel="noopener noreferrer"&gt;Video demo of generating Canva Apps with prompts in VS Code&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Adopt the App UI Kit
&lt;/h3&gt;

&lt;p&gt;Migrate your existing UI to the &lt;a href="https://www.canva.dev/docs/apps/app-ui-kit/" rel="noopener noreferrer"&gt;App UI Kit&lt;/a&gt; components, to ensure consistency in both functionality and aesthetics across your app.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7cimz9aqg0evc7v6tzbw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7cimz9aqg0evc7v6tzbw.png" alt="Apply the Canva UI Kit to your app in VS Code" width="800" height="442"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.canva.com/design/DAGkrCIVrdw/VpeH8gGWphqs3Eo3FOLbCw/watch" rel="noopener noreferrer"&gt;Video demo of applying the Canva UI Kit to your app in VS Code&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Localize your app
&lt;/h3&gt;

&lt;p&gt;Integrate your app with our &lt;a href="https://www.canva.dev/docs/apps/localization/" rel="noopener noreferrer"&gt;App I18n Kit&lt;/a&gt;, to rewrite your UI to be localizable with clear translator notes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9bqxqpmeko8z6m5cnh9d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9bqxqpmeko8z6m5cnh9d.png" alt="Update your Canva app to include i18n strings" width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.canva.com/design/DAGkrel6pHs/OMtb7DoZ4EjPuWLXpj9CsQ/watch" rel="noopener noreferrer"&gt;Video demo of updating your app to include i18n strings&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Comply with Canva's design guidelines
&lt;/h3&gt;

&lt;p&gt;Run our Design Review tool to ensure your app UI adheres to Canva's standards. The MCP Server can generate a report with &lt;strong&gt;must/should/could&lt;/strong&gt; recommendations based on Canva's &lt;a href="https://www.canva.dev/docs/apps/design-guidelines/" rel="noopener noreferrer"&gt;design guidelines&lt;/a&gt;, and even give suggestions on improvements to your code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxiw8xrouciw5vzlf8zqm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxiw8xrouciw5vzlf8zqm.png" alt="quick app review before submitting" width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.canva.com/design/DAGkro06BK4/DTkm4q2_ugyoYcB6_n0w7g/watch" rel="noopener noreferrer"&gt;Video demo of doing a quick app review before submitting&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Integrate with AI chat assistants
&lt;/h3&gt;

&lt;p&gt;The MCP Server can also be integrated with AI chat assistants like &lt;a href="https://claude.ai/" rel="noopener noreferrer"&gt;Claude&lt;/a&gt;, where you can chat about the Canva Apps SDK or Connect APIs.&lt;br&gt;
Your favorite chat assistant can now also be your personal Canva development expert!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9jtknpb42i8sjt952wc3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9jtknpb42i8sjt952wc3.png" alt="Chat with Claude to to deep dive into Canva Dev documentation" width="800" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.canva.com/design/DAGkrnBYPCI/KKE7VXXd2zoCbbdHfiGLUQ/watch" rel="noopener noreferrer"&gt;Video demo of chatting with Claude to to deep dive into Canva Dev documentation&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Integrate with Canva via the Connect API
&lt;/h3&gt;

&lt;p&gt;Last but not least, you can build integrations with Canva via the &lt;a href="https://www.canva.dev/docs/connect/" rel="noopener noreferrer"&gt;Connect API&lt;/a&gt;, by generating Canva Connect API client code to create new designs or upload assets.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffjl8zvc70nt1ld6d515u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffjl8zvc70nt1ld6d515u.png" alt="Use Claude to write code for a Canva Integration" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.canva.com/design/DAGkr_APJdg/dcMv_DnkPM59ngJn07leQQ/watch" rel="noopener noreferrer"&gt;Video demo of using Claude to write code for a Canva Integration&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are many more use cases to explore, so we're excited to see what you'll build!&lt;/p&gt;

&lt;h2&gt;
  
  
  Next steps and future plans
&lt;/h2&gt;

&lt;p&gt;We're just getting started with AI-assisted app development. Expect ongoing enhancements and new capabilities based on your invaluable feedback via our &lt;a href="https://community.canva.dev/" rel="noopener noreferrer"&gt;community forum&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check out the &lt;a href="https://www.canva.dev/docs/apps/mcp-server/" rel="noopener noreferrer"&gt;setup guide&lt;/a&gt; now&lt;/strong&gt; to unlock the full power of AI-assisted development for Canva Apps and Integrations.&lt;/p&gt;

&lt;p&gt;Happy hacking!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>modelcontextprotocol</category>
      <category>appssdk</category>
    </item>
    <item>
      <title>Apply Canva Brand Templates with the Autofill API</title>
      <dc:creator>Meredith Hassett</dc:creator>
      <pubDate>Wed, 09 Oct 2024 00:00:01 +0000</pubDate>
      <link>https://dev.to/canvadevs/apply-canva-brand-templates-with-the-autofill-api-4o6p</link>
      <guid>https://dev.to/canvadevs/apply-canva-brand-templates-with-the-autofill-api-4o6p</guid>
      <description>&lt;p&gt;Protecting brand integrity means sometimes defending a brand fiercely, and always applying the brand design consistently. If your project or web app can’t provide your customers a consistent way to find and apply brand templates, you risk spending time catching up on repeated request for a brand template feature. Canva Connect API provides the solution, giving your customers consistency in how they:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Access and apply Canva Brand Templates.&lt;/li&gt;
&lt;li&gt;Automatically fill out new designs from templates.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This guide shows you how to build an example integration using the Brand template and Autofill APIs to access Canva Brand Templates and apply them consistently to a design. These APIs let your web app apply a Canva Brand Template to a Canva design entirely within your integration. Your customers won’t need to use the Canva editor to edit their design manually.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You can try out the APIs right now:&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.canva.dev/docs/connect/api-reference/autofills/create-design-autofill-job/#try-it-out" rel="noopener noreferrer"&gt;From the docs page&lt;/a&gt; (be aware this sends API requests to your Canva account's live data).&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.canva.dev/docs/connect/quickstart/" rel="noopener noreferrer"&gt;Using the Canva Connect API Starter Kit&lt;/a&gt;, which provides a working e-commerce web app showcasing the API's features.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;When you're ready to use the Autofill API for your own applications, see the &lt;a href="https://www.canva.dev/docs/connect/autofill-guide/" rel="noopener noreferrer"&gt;Autofill guide&lt;/a&gt;. It explains how to create a Canva Brand Template and apply it to a new design automatically.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Before you begin
&lt;/h2&gt;

&lt;p&gt;Before applying a brand template, you need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A Canva account&lt;/strong&gt;: With multi-factor authentication enabled.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An &lt;a href="https://www.canva.dev/docs/connect/creating-integrations/" rel="noopener noreferrer"&gt;integration in your account&lt;/a&gt;&lt;/strong&gt;: To connect your application to Canva, prepare for authorization, and configure API scopes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Autofill API access&lt;/strong&gt;: When you've created your integration, register for access (under &lt;strong&gt;Scopes &amp;gt; Data autofill APIs&lt;/strong&gt;, click the &lt;strong&gt;Register for access&lt;/strong&gt; button).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A Canva Brand Template&lt;/strong&gt;: To create one, you need a Canva Teams account. A &lt;a href="https://www.canva.com/for-teams/" rel="noopener noreferrer"&gt;free trial is available&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An access token&lt;/strong&gt;: To &lt;a href="https://www.canva.dev/docs/connect/creating-integrations/" rel="noopener noreferrer"&gt;create a token&lt;/a&gt;:

&lt;ol&gt;
&lt;li&gt;Create &lt;a href="https://www.canva.dev/docs/connect/authentication/#create-the-authorization-url" rel="noopener noreferrer"&gt;an authorization URL&lt;/a&gt; to get an authorization code.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.canva.dev/docs/connect/authentication/#generate-access-tokens" rel="noopener noreferrer"&gt;Generate an access token&lt;/a&gt; using a &lt;a href="https://www.canva.dev/docs/connect/api-reference/authentication/generate-access-token/" rel="noopener noreferrer"&gt;request to the Authentication API&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tools&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Text editor&lt;/li&gt;
&lt;li&gt;Command-line shell with the &lt;a href="https://nodejs.org/api/cli.html" rel="noopener noreferrer"&gt;Node.js CLI&lt;/a&gt; (version 18 or higher) installed.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;When you have your access token ready, you can use it to test out the Brand template and Autofill APIs.&lt;/p&gt;

&lt;p&gt;Access tokens have a limited lifespan. When your current token expires, use the refresh token to request a new access token.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configure API scopes
&lt;/h2&gt;

&lt;p&gt;Scopes let you specify what actions your integration can perform on behalf of the end user. To grant Brand template and Autofill APIs access to your integration, set the following scope permissions under the &lt;strong&gt;Scopes&lt;/strong&gt; tab:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;design:content:write&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;design:content:read&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;brandtemplate:content:read&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;brandtemplate:meta:read&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 1. Collect and view brand templates
&lt;/h2&gt;

&lt;p&gt;The example in the following steps uses JavaScript and the &lt;code&gt;node&lt;/code&gt; command to make an API call, collect your Canva Brand Templates, and display the response returned by the Canva API in the console. The logged output can give you an idea of what parameters you can parse and display when building your integration.&lt;/p&gt;

&lt;p&gt;To collect your Canva Brand Template and view the API response:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a new JavaScript file named &lt;code&gt;brandTemplate.js&lt;/code&gt; and add the following.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;   &lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;init&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://api.canva.com/rest/v1/brand-templates?dataset=non_empty&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
           &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;GET&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
              &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Authorization&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Bearer &amp;lt;Add your Access Token Here&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="p"&gt;},&lt;/span&gt;
         &lt;span class="p"&gt;})&lt;/span&gt;
           &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
             &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
             &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
           &lt;span class="p"&gt;})&lt;/span&gt;
           &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
       &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Use the &lt;code&gt;dataset=non_empty&lt;/code&gt; &lt;a href="https://www.canva.dev/docs/connect/api-reference/brand-templates/list-brand-templates/#query-parameters" rel="noopener noreferrer"&gt;query parameter&lt;/a&gt; to filter and return only Canva Brand Templates that have a dataset.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
&lt;li&gt;Run the following &lt;code&gt;node&lt;/code&gt; command to make your API request.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   node &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s1"&gt;'require("./brandTemplate.js").init()'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The API response returns a list of available Canva Brand Templates, as well as other important response parameters, as shown in the following example.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="err"&gt;continuation:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'&amp;lt;token-value&amp;gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="err"&gt;items:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
       &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
         &lt;/span&gt;&lt;span class="err"&gt;id:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'&amp;lt;id-value&amp;gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
         &lt;/span&gt;&lt;span class="err"&gt;title:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'Limited&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Presentation'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
         &lt;/span&gt;&lt;span class="err"&gt;view_url:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'https://www.canva.com/design/&amp;lt;id-value&amp;gt;/view'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
         &lt;/span&gt;&lt;span class="err"&gt;create_url:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'https://www.canva.com/design/&amp;lt;id-value&amp;gt;/remix'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
         &lt;/span&gt;&lt;span class="err"&gt;thumbnail:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
         &lt;/span&gt;&lt;span class="err"&gt;created_at:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1701760702&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
         &lt;/span&gt;&lt;span class="err"&gt;updated_at:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1715904777&lt;/span&gt;&lt;span class="w"&gt;
       &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If customers have more Canva Brand Templates than the response's pagination parameters can handle, the response returns a &lt;a href="https://www.canva.dev/docs/connect/api-reference/brand-templates/list-brand-templates/#success-response" rel="noopener noreferrer"&gt;&lt;code&gt;continuation&lt;/code&gt; token&lt;/a&gt;. Use this token in your integration as a query parameter to request the next set of results.&lt;/p&gt;

&lt;p&gt;The Brand Template API returns the Canva Brand Template ID, which you need to apply templates consistently. The next step uses this ID to retrieve the information you need about each template so you can apply it to a design.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2. Collect a brand template dataset
&lt;/h2&gt;

&lt;p&gt;To collect information about a specific brand template, including the dataset for applying the template to a design:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a new JavaScript file named &lt;code&gt;getBrandTemplate.js&lt;/code&gt; and add the following code.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;   &lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;init&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://api.canva.com/rest/v1/brand-templates/&amp;lt;add your Canva Brand Template ID here&amp;gt;/dataset&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
           &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;GET&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
             &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Authorization&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Bearer &amp;lt;Add your access token here&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="p"&gt;},&lt;/span&gt;
         &lt;span class="p"&gt;})&lt;/span&gt;
           &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
             &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
             &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
           &lt;span class="p"&gt;})&lt;/span&gt;
           &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
       &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Run the following &lt;code&gt;node&lt;/code&gt; command to make the API request.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   node &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s1"&gt;'require("./getBrandTemplate.js").init()'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A successful response returns the requested Canva Brand Template's dataset, including the data fields you can change when creating a new design from the template.&lt;/p&gt;

&lt;p&gt;If you receive the following error when testing your web application, check your integration has the correct permissions to access the brand template.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="err"&gt;code:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'permission_denied'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="err"&gt;message:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'Not&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;allowed&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;get&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;brand&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;template&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;with&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;ID&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;lt;ID-value&amp;gt;'&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 3. Apply the brand template using the Autofill API
&lt;/h2&gt;

&lt;p&gt;To apply the brand template using the Autofill API:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a new file called &lt;code&gt;autofillBrand.js&lt;/code&gt; and add the following code.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;   &lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;init&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://api.canva.com/rest/v1/autofills&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
           &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
             &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Authorization&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Bearer &amp;lt;Add your Access Token Here&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
             &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
           &lt;span class="p"&gt;},&lt;/span&gt;
           &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
               &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;brand_template_id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;Add your Canva Brand Template ID here&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
               &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;title&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
               &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;data&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                 &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;title&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                   &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                   &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Brand template autofill completed&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
                 &lt;span class="p"&gt;}&lt;/span&gt;
               &lt;span class="p"&gt;}&lt;/span&gt;
             &lt;span class="p"&gt;}),&lt;/span&gt;
         &lt;span class="p"&gt;})&lt;/span&gt;
           &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
             &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
             &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
           &lt;span class="p"&gt;})&lt;/span&gt;
           &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
       &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This request initiates an asynchronous design autofill job based on the included Canva Brand Template data and ID. If successful, it creates a new design based on the template.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Run the following &lt;code&gt;node&lt;/code&gt; command to send the &lt;code&gt;POST&lt;/code&gt; request and check for a response.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   node &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s1"&gt;'require("./autofillBrand.js").init()'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"job"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
       &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;design autofill job id value&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
       &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"in_progress"&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A successful response means the design autofill job has started and is in progress, as indicated by the &lt;code&gt;status&lt;/code&gt;. In the next step, use the Autofill job ID (&lt;code&gt;job.id&lt;/code&gt;) to check on the status of the new design.&lt;/p&gt;

&lt;h3&gt;
  
  
  Troubleshoot the asset ID
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"invalid_field"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"'asset_id' must not be null."&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the response returns this error, your Canva Brand Template has an image data field, so you must supply a Canva asset ID in the Autofill API body section. You can use the &lt;a href="https://www.canva.dev/docs/connect/api-reference/assets/" rel="noopener noreferrer"&gt;Assets Canva API endpoint&lt;/a&gt; to provide customers with the ability to upload their image assets. The Assets API can help you access and use uploaded media asset IDs when automatically filling designs from Canva Brand Templates.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4. Query autofill job status
&lt;/h2&gt;

&lt;p&gt;To check if a new design is successfully created from a Canva Brand Template, you can query the autofill job's status:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a new file named &lt;code&gt;queryAutofill.js&lt;/code&gt; and add the following code.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;   &lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;init&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://api.canva.com/rest/v1/autofills/&amp;lt;Add your autofill job id value here&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
           &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;GET&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
             &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Authorization&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Bearer &amp;lt;Add your Access Token Here&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="p"&gt;},&lt;/span&gt;
         &lt;span class="p"&gt;})&lt;/span&gt;
           &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
             &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
             &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;util&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;inspect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;depth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="p"&gt;}));&lt;/span&gt;
           &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="c1"&gt;//util.inspect makes sure the console.log displays the response object in full.&lt;/span&gt;
           &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
       &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Run the following &lt;code&gt;node&lt;/code&gt; command to query the autofill job.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   node &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s1"&gt;'require("./queryAutofill.js").init()'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Poll autofill job status
&lt;/h3&gt;

&lt;p&gt;Polling the autofill job often, and parsing the response, provides useful information for your web app's user experience.&lt;/p&gt;

&lt;p&gt;While the autofill job is running, the &lt;a href="https://www.canva.dev/docs/connect/api-reference/autofills/get-design-autofill-job" rel="noopener noreferrer"&gt;Get design autofill job API&lt;/a&gt; returns the following response.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"job"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;autofill design job id&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"in_progress"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;While the status is &lt;code&gt;in_progress&lt;/code&gt;, you can provide customers with a loading state, then display a new message when the status changes to &lt;code&gt;success&lt;/code&gt;. The following side-by-side example shows the &lt;code&gt;queryAutofill.js&lt;/code&gt; response alongside a response from the same &lt;code&gt;GET&lt;/code&gt; request directly on the &lt;a href="https://www.canva.dev/docs/connect/api-reference/autofills/get-design-autofill-job/" rel="noopener noreferrer"&gt;Autofill API docs page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7uq5813gk98byxd407gi.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7uq5813gk98byxd407gi.jpg" alt="Two images that show near-identical JSON output, one from Canva Docs and the other from the terminal shell. Some of the output is obscured" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The successful response includes a link to view the design, which is the &lt;code&gt;view_url&lt;/code&gt;. You can display this link in your integration to show users how the design looks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Apply Canva Brand Templates for consistent designs
&lt;/h2&gt;

&lt;p&gt;Using the Autofill API in your integration helps your customers apply their Canva Brand Templates consistently. They can view exactly what aspects of a design they're able to modify, and know the design follows their branding.&lt;/p&gt;

&lt;p&gt;Remember, you can try out the Canva APIs in &lt;a href="https://www.canva.dev/docs/connect/" rel="noopener noreferrer"&gt;the Connect API documentation&lt;/a&gt; anytime, and &lt;a href="https://github.com/canva-sdks/canva-connect-api-starter-kit" rel="noopener noreferrer"&gt;the Connect API Starter Kit&lt;/a&gt; is available for a complete demonstration of what you can build.&lt;/p&gt;

</description>
      <category>connectapi</category>
      <category>brandtemplate</category>
      <category>canvaintegration</category>
    </item>
  </channel>
</rss>
