> ## Documentation Index
> Fetch the complete documentation index at: https://docs.modulex.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Canva Integration for AI Agents & Workflows

> Design platform for creating visual content, presentations, and documents

{/* Self-hosted logo — build-time vendored from modulex.json / Iconify (see scripts/lib/logo.js). */}

<img src="https://mintcdn.com/modulexaillc/zKB2qsP6Q61VNLfB/logos/canva.svg?fit=max&auto=format&n=zKB2qsP6Q61VNLfB&q=85&s=7a8efde649d041eab3e5c94904289b0a" alt="Canva logo" width="72" height="72" data-path="logos/canva.svg" />

## Overview

Add **Canva** to any ModuleX agent or workflow. Design platform integration for creating, listing, exporting, and importing visual content via the Canva Connect REST API (`api.canva.com/rest/v1`).

<Info>
  **Categories**: Productivity & Collaboration · Design & Creative Tools · **Auth**: OAuth2 · **Actions**: 5
</Info>

## Authentication

### OAuth2 Authentication

Connect using Canva OAuth (recommended)

#### Required Credentials

| Field         | Description                               | Required | Format |
| ------------- | ----------------------------------------- | -------- | ------ |
| Client ID     | Canva Connect API OAuth App Client ID     | Yes      | `-`    |
| Client Secret | Canva Connect API OAuth App Client Secret | Yes      | `-`    |

#### OAuth Configuration

* **Authorization URL**: `https://www.canva.com/api/oauth/authorize`
* **Token URL**: `https://api.canva.com/rest/v1/oauth/token`
* **Scopes**: `design:content:read`, `design:content:write`, `design:meta:read`, `asset:read`, `asset:write`

## Available Actions

<AccordionGroup>
  <Accordion title="create_design — Creates a new Canva design with preset or custom dimensions">
    ### Parameters

    <ResponseField name="design_type" type="string" required>
      The desired design type: 'preset' (provide design\_type\_name) or 'custom' (provide width and height)
    </ResponseField>

    <ResponseField name="title" type="string">
      The name of the design
    </ResponseField>

    <ResponseField name="asset_id" type="string">
      The ID of the asset to add to the new design
    </ResponseField>

    <ResponseField name="design_type_name" type="string">
      The preset design type name: 'doc', 'whiteboard', or 'presentation'. Only applicable when design\_type is 'preset'
    </ResponseField>

    <ResponseField name="width" type="integer">
      Width in pixels (40-8000). Only applicable when design\_type is 'custom'
    </ResponseField>

    <ResponseField name="height" type="integer">
      Height in pixels (40-8000). Only applicable when design\_type is 'custom'
    </ResponseField>

    ### Response

    ```json theme={null}
    {
      "$defs": {
        "DesignSummary": {
          "additionalProperties": false,
          "description": "A design object returned by Canva.",
          "properties": {
            "id": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Id"
            },
            "title": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Title"
            },
            "owner": {
              "anyOf": [
                {
                  "additionalProperties": {
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "type": "object"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Owner"
            },
            "thumbnail": {
              "anyOf": [
                {
                  "additionalProperties": {
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "integer"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "type": "object"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Thumbnail"
            },
            "urls": {
              "anyOf": [
                {
                  "additionalProperties": {
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "type": "object"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Urls"
            },
            "created_at": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Created At"
            },
            "updated_at": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Updated At"
            }
          },
          "title": "DesignSummary",
          "type": "object"
        }
      },
      "additionalProperties": false,
      "properties": {
        "success": {
          "title": "Success",
          "type": "boolean"
        },
        "error": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Error"
        },
        "design": {
          "anyOf": [
            {
              "$ref": "#/$defs/DesignSummary"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        }
      },
      "required": [
        "success"
      ],
      "title": "CreateDesignOutput",
      "type": "object"
    }
    ```
  </Accordion>

  <Accordion title="create_design_import_job — Starts a job to import an external file as a new Canva design">
    ### Parameters

    <ResponseField name="title" type="string" required>
      The name for the imported design
    </ResponseField>

    <ResponseField name="file_url" type="string" required>
      URL of the file to import into Canva
    </ResponseField>

    ### Response

    ```json theme={null}
    {
      "$defs": {
        "ImportJob": {
          "additionalProperties": false,
          "description": "A design import job status object.",
          "properties": {
            "id": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Id"
            },
            "status": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Status"
            },
            "design_id": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Design Id"
            }
          },
          "title": "ImportJob",
          "type": "object"
        }
      },
      "additionalProperties": false,
      "properties": {
        "success": {
          "title": "Success",
          "type": "boolean"
        },
        "error": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Error"
        },
        "job": {
          "anyOf": [
            {
              "$ref": "#/$defs/ImportJob"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        }
      },
      "required": [
        "success"
      ],
      "title": "CreateDesignImportJobOutput",
      "type": "object"
    }
    ```
  </Accordion>

  <Accordion title="export_design — Starts a job to export a Canva design to a file format">
    ### Parameters

    <ResponseField name="design_id" type="string" required>
      The ID of the design to export
    </ResponseField>

    <ResponseField name="format_type" type="string" required>
      Export format: 'pdf', 'jpg', 'png', 'pptx', 'gif', or 'mp4'
    </ResponseField>

    <ResponseField name="pages" type="array">
      Array of page numbers (integers) to export. First page is 1. If omitted, all pages are exported
    </ResponseField>

    <ResponseField name="quality" type="integer">
      JPG quality 1-100. Only applicable for 'jpg' format
    </ResponseField>

    <ResponseField name="mp4_quality" type="string">
      MP4 resolution: 'horizontal\_480p', 'horizontal\_720p', 'horizontal\_1080p', 'horizontal\_4k', 'vertical\_480p', 'vertical\_720p', 'vertical\_1080p', 'vertical\_4k'
    </ResponseField>

    <ResponseField name="size" type="string">
      PDF paper size: 'a4', 'a3', 'letter', or 'legal'
    </ResponseField>

    <ResponseField name="lossless" type="boolean">
      Use lossless compression for PNG exports
    </ResponseField>

    <ResponseField name="as_single_image" type="boolean">
      Merge multi-page designs into a single PNG image
    </ResponseField>

    <ResponseField name="export_quality" type="string">
      Export quality tier: 'regular' or 'pro'. Pro may fail for premium elements
    </ResponseField>

    <ResponseField name="height" type="integer">
      Export height in pixels. Applicable for jpg, png, gif formats
    </ResponseField>

    <ResponseField name="width" type="integer">
      Export width in pixels. Applicable for jpg, png, gif formats
    </ResponseField>

    ### Response

    ```json theme={null}
    {
      "$defs": {
        "ExportJob": {
          "additionalProperties": false,
          "description": "An export job status object.",
          "properties": {
            "id": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Id"
            },
            "status": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Status"
            },
            "urls": {
              "items": {
                "type": "string"
              },
              "title": "Urls",
              "type": "array"
            }
          },
          "title": "ExportJob",
          "type": "object"
        }
      },
      "additionalProperties": false,
      "properties": {
        "success": {
          "title": "Success",
          "type": "boolean"
        },
        "error": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Error"
        },
        "job": {
          "anyOf": [
            {
              "$ref": "#/$defs/ExportJob"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        }
      },
      "required": [
        "success"
      ],
      "title": "ExportDesignOutput",
      "type": "object"
    }
    ```
  </Accordion>

  <Accordion title="list_designs — Lists designs owned by or shared with the authenticated Canva user">
    ### Parameters

    <ResponseField name="query" type="string">
      Search keyword or phrase (max 255 characters)
    </ResponseField>

    <ResponseField name="continuation" type="string">
      Pagination cursor from a previous response to get the next page
    </ResponseField>

    <ResponseField name="ownership" type="string">
      Filter by ownership: 'any', 'owned', or 'shared' (Default: `any`)
    </ResponseField>

    <ResponseField name="sort_by" type="string">
      Sort order: 'relevance', 'modified\_descending', 'modified\_ascending', 'title\_descending', 'title\_ascending' (Default: `relevance`)
    </ResponseField>

    <ResponseField name="limit" type="integer">
      Maximum designs to return per request (1-100) (Default: `25`)
    </ResponseField>

    ### Response

    ```json theme={null}
    {
      "$defs": {
        "DesignSummary": {
          "additionalProperties": false,
          "description": "A design object returned by Canva.",
          "properties": {
            "id": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Id"
            },
            "title": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Title"
            },
            "owner": {
              "anyOf": [
                {
                  "additionalProperties": {
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "type": "object"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Owner"
            },
            "thumbnail": {
              "anyOf": [
                {
                  "additionalProperties": {
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "integer"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "type": "object"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Thumbnail"
            },
            "urls": {
              "anyOf": [
                {
                  "additionalProperties": {
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "type": "object"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Urls"
            },
            "created_at": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Created At"
            },
            "updated_at": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Updated At"
            }
          },
          "title": "DesignSummary",
          "type": "object"
        }
      },
      "additionalProperties": false,
      "properties": {
        "success": {
          "title": "Success",
          "type": "boolean"
        },
        "error": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Error"
        },
        "items": {
          "items": {
            "$ref": "#/$defs/DesignSummary"
          },
          "title": "Items",
          "type": "array"
        },
        "continuation": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Continuation"
        }
      },
      "required": [
        "success"
      ],
      "title": "ListDesignsOutput",
      "type": "object"
    }
    ```
  </Accordion>

  <Accordion title="upload_asset — Uploads an asset to Canva from a URL">
    ### Parameters

    <ResponseField name="name" type="string" required>
      The asset's name
    </ResponseField>

    <ResponseField name="file_url" type="string" required>
      URL of the file to upload as an asset to Canva
    </ResponseField>

    ### Response

    ```json theme={null}
    {
      "$defs": {
        "UploadJob": {
          "additionalProperties": false,
          "description": "An asset upload job status object.",
          "properties": {
            "id": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Id"
            },
            "status": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Status"
            },
            "asset": {
              "anyOf": [
                {
                  "additionalProperties": {
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "type": "object"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Asset"
            }
          },
          "title": "UploadJob",
          "type": "object"
        }
      },
      "additionalProperties": false,
      "properties": {
        "success": {
          "title": "Success",
          "type": "boolean"
        },
        "error": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Error"
        },
        "job": {
          "anyOf": [
            {
              "$ref": "#/$defs/UploadJob"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        }
      },
      "required": [
        "success"
      ],
      "title": "UploadAssetOutput",
      "type": "object"
    }
    ```
  </Accordion>
</AccordionGroup>

## Limits & Quotas

* **Rate limits**: Canva Connect API enforces per-app rate limits (varies by plan; typically 100 requests/minute for standard apps).
* **Export/Import jobs**: Asynchronous — the tool polls until completion (up to \~60 seconds). Large designs may take longer.
* **File uploads**: Maximum file size varies by asset type (images up to 25 MB, videos up to 1 GB).
* **Error model**: Non-2xx responses and timeouts are caught and returned as `success=False` + `error` rather than raising.

## Related integrations

<CardGroup cols={3}>
  <Card title="Cal.com" href="/integrations/tools/cal-com" />

  <Card title="ConvertAPI" href="/integrations/tools/convertapi" />

  <Card title="DocuSign" href="/integrations/tools/docusign" />
</CardGroup>

## Links

* [Canva](https://www.canva.com)
