Skip to content
Scalekit Docs
Talk to an Engineer Dashboard

Connect AI agents to Canva

Scalekit connector
Open markdown

The Canva connector lets your AI agent act in each user's Canva account. Each user signs in to Canva once, and Scalekit stores and refreshes their tokens, so your agent never handles credentials. It comes with 48 tools.

Tools
48
What they doRead · write · destructive
31 · 15 · 231 read15 write2 destructive
Users sign in with
OAuth app
Your own Canva app

Setup

  1. Install the SDK

    Terminal window
    npm install @scalekit-sdk/node dotenv
  2. Set your credentials

    Add your Scalekit credentials to your .env file. Find values in app.scalekit.com > Developers > API Credentials.

    .env
    SCALEKIT_ENVIRONMENT_URL=<your-environment-url>
    SCALEKIT_CLIENT_ID=<your-client-id>
    SCALEKIT_CLIENT_SECRET=<your-client-secret>
  3. Create the Canva connection

    In AgentKit > Connections, create a Canva connection and copy its redirect URI. The name you give it is the connection_name your code passes. See Configure connections.

  4. Register an OAuth app

    Canva connections use your own OAuth app. Register one with Canva and add the redirect URI you copied.

    Then enter the app's Client ID and Client Secret on the Canva connection.

    Console steps with screenshots

    Register your Scalekit environment with the Canva connector so Scalekit handles the authentication flow and token lifecycle for you. The connection name you create will be used to identify and invoke the connection programmatically. Then complete the configuration in your application as follows:

    1. Create a Canva integration

      • In Scalekit dashboard, go to AgentKit > Connections > Create Connection. Find Canva and click Create.

      • Go to Canva Developer Portal > Your integrations and click Create an integration.

      • Choose Public or Private based on who should be able to install it, then enter an integration name (for example, Agent Connect).

        Configure your Canva integration

    2. Get client credentials

      • On the Configuration page, under Credentials, copy the Client ID.
      • Click Generate a secret to create a Client Secret, then copy it. Canva only shows the secret once — store it securely.
    3. Set up auth redirects

      • In the Scalekit dashboard, on the connection you created, copy the redirect URI. It looks like https://<SCALEKIT_ENVIRONMENT_URL>/sso/v1/oauth/<CONNECTION_ID>/callback.

      • In the Canva Developer Portal, go to Authentication in the left menu. Under Authorized redirects, click Add another URL, paste the redirect URI from Scalekit, and save.

        Add authorized redirect URL in Canva

    4. Add credentials in Scalekit

      • In the Scalekit dashboard, open the connection you created and enter:
        • Client ID (from step 2)
        • Client Secret (from step 2)
        • Scopes (see Canva Connect API scopes reference — grant only what your agent needs, for example design:content:read and design:content:write)
      • Click Save.
    5. Submit for review Required for production

      Canva integrations start in Draft and only work for accounts on your own team. Before other users can connect, go to Submit for review in the Canva Developer Portal and follow the checklist to move your integration to production.

  5. Authorize a user and make your first call

    quickstart.mts
    import { ScalekitClient } from '@scalekit-sdk/node'
    import 'dotenv/config'
    import { createInterface } from 'node:readline/promises'
    const scalekit = new ScalekitClient(
    process.env.SCALEKIT_ENVIRONMENT_URL,
    process.env.SCALEKIT_CLIENT_ID,
    process.env.SCALEKIT_CLIENT_SECRET,
    )
    const actions = scalekit.actions
    const connector = 'canva'
    const identifier = 'user_123'
    // Generate an authorization link for the user
    const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
    console.log('Authorize Canva:', link)
    const rl = createInterface({ input: process.stdin, output: process.stdout })
    await rl.question('Press Enter after authorizing...')
    rl.close()
    // Make your first call
    const result = await actions.executeTool({
    connector,
    identifier,
    toolName: 'canva_oidc_userinfo_get',
    toolInput: {},
    })
    console.log(result)
    Terminal window
    npx tsx quickstart.mts

    Each user signs in once. See Authorize a user for the full flow and statuses.

Tools

Pass the exact name to execute_tool
Try in PlaygroundRequest a tool
  • canva_analytics_page_views_getLists page-level view duration data for a Canva design.Read-only

    Get Design Analytics Page Views

    Lists page-level view duration data for a Canva design. This is a POST endpoint used as a read/query operation: pass the page IDs you want data for (plus optional filter and pagination controls) in the request body, and Canva returns each page's total view duration, average view duration, and unique viewer count. Use the List design pages tool first to discover page IDs. Note: Canva restricts this API to users who are a member of a Canva Enterprise organization (or a limited trial on paid plans) -- accounts outside that tier receive a permission-denied error from Canva, which is expected account-tier behavior, not a tool defect. This is a preview API and may change without a version bump.

    Inputs

    designIdstringrequired
    The unique ID of the Canva design these analytics apply to. Design IDs are alphanumeric strings (may include underscores or hyphens, 1-50 characters) and are found embedded in the design's Canva URL, e.g. the URL https://www.canva.com/design/DAFVztcvd9z/edit contains the design ID DAFVztcvd9z.
    page_idsarrayrequired
    The design page IDs to retrieve page-level view duration data for. Provide between 1 and 100 page IDs (obtain them from the List design pages API). Example: ["PBBKfZml7MRHRQVw", "PBBKfZml7Mghjsdg"].
    continuationstring
    A pagination cursor token from a previous response. If the previous response's continuation field was non-empty, pass its value here to fetch the next page of page-view results.
    filterobject
    Optional filter object to narrow the page-view results. Must be one of three shapes, distinguished by their "type" field: {"type":"by_viewer","viewer_id":"<id>","link_id":"<optional link id>"} to scope to a specific viewer; {"type":"for_editor"} to scope to the design owner/editor's own views; or {"type":"by_link","link_id":"<id>"} to scope to traffic from a specific trackable link. Omit entirely to include all page views.
    limitinteger
    The maximum number of page results to return per page. Must be between 1 and 100. Defaults to 50.default 50
  • canva_analytics_summary_getGets the aggregated analytics for a Canva design, given its design ID.Read-only

    Get Design Analytics Summary

    Gets the aggregated analytics for a Canva design, given its design ID. The response includes the total number of views, the number of unique viewers, the total view duration in seconds, and the average view duration per view in seconds. Note: Canva restricts this API to users who are a member of a Canva Enterprise organization (or a limited trial on paid plans) -- accounts outside that tier receive a permission-denied error from Canva, which is expected account-tier behavior, not a tool defect. This is a preview API and may change without a version bump.

    Inputs

    designIdstringrequired
    The unique ID of the Canva design these analytics apply to. Design IDs are alphanumeric strings (may include underscores or hyphens, 1-50 characters) and are found embedded in the design's Canva URL, e.g. the URL https://www.canva.com/design/DAFVztcvd9z/edit contains the design ID DAFVztcvd9z.
  • canva_analytics_viewers_listLists viewers for a Canva design, ordered by most recent view first.Read-only

    List Design Analytics Viewers

    Lists viewers for a Canva design, ordered by most recent view first. Each item includes the viewer's opaque viewer ID, user details (when visible), first/last viewed Unix timestamps, viewer type (editor/commenter/viewer), visibility, total view count and duration, pages viewed, device form factor, operating system, and city/country for anonymous viewers. Supports cursor-based pagination via the continuation token, and can be filtered by a specific trackable link ID or by a minimum first-viewed timestamp. Note: Canva restricts this API to users who are a member of a Canva Enterprise organization (or a limited trial on paid plans) -- accounts outside that tier receive a permission-denied error from Canva, which is expected account-tier behavior, not a tool defect. This is a preview API and may change without a version bump.

    Inputs

    designIdstringrequired
    The unique ID of the Canva design these analytics apply to. Design IDs are alphanumeric strings (may include underscores or hyphens, 1-50 characters) and are found embedded in the design's Canva URL, e.g. the URL https://www.canva.com/design/DAFVztcvd9z/edit contains the design ID DAFVztcvd9z.
    continuationstring
    A pagination cursor token from a previous response. If the previous response's continuation field was non-empty, pass its value here to fetch the next page of viewers.
    first_viewed_afterinteger
    Only returns viewers whose first view happened after this time, expressed as a Unix timestamp in seconds since the Unix Epoch.
    limitinteger
    The maximum number of viewers to return per page. Must be between 1 and 100. Defaults to 50.default 50
    link_idstring
    Filters viewers by a specific trackable link ID. If omitted, only viewers who visited the design without using a trackable link are returned.
  • canva_analytics_views_over_time_getLists the view counts over time for a Canva design, bucketed into a sequence of time periods.Read-only

    Get Design Analytics Views Over Time

    Lists the view counts over time for a Canva design, bucketed into a sequence of time periods. Each response item represents one time bucket, with a Unix timestamp for the bucket's start and the number of views recorded in that bucket. Optionally scope the request to a specific Unix-timestamp time range with start_time/end_time, control the bucketing timezone with a UTC offset, and page through results with limit and continuation. Note: Canva restricts this API to users who are a member of a Canva Enterprise organization (or a limited trial on paid plans) -- accounts outside that tier receive a permission-denied error from Canva, which is expected account-tier behavior, not a tool defect. This is a preview API and may change without a version bump.

    Inputs

    designIdstringrequired
    The unique ID of the Canva design these analytics apply to. Design IDs are alphanumeric strings (may include underscores or hyphens, 1-50 characters) and are found embedded in the design's Canva URL, e.g. the URL https://www.canva.com/design/DAFVztcvd9z/edit contains the design ID DAFVztcvd9z.
    continuationstring
    A pagination cursor token from a previous response. If the previous response's continuation field was non-empty, pass its value here to fetch the next page of time buckets.
    end_timeinteger
    The inclusive end of the requested time range, expressed as a Unix timestamp in seconds since the Unix Epoch. Omit to have Canva pick a default end (typically now).
    limitinteger
    The maximum number of time buckets to return per page. Must be between 1 and 100. Defaults to 50.default 50
    start_timeinteger
    The inclusive start of the requested time range, expressed as a Unix timestamp in seconds since the Unix Epoch. Omit to have Canva pick a default start.
    timezonestring
    The timezone to use when bucketing views into time periods, expressed as a UTC offset in the form +HH:MM (for example +10:00). Defaults to +00:00 (UTC).default +00:00
  • canva_asset_getRetrieve the metadata of a Canva asset (an uploaded image or video in the user's content library) by its asset ID.Read-only

    Get Asset

    Retrieve the metadata of a Canva asset (an uploaded image or video in the user's content library) by its asset ID. Returns the asset's type (image or video), name, user-facing tags, creation and last-updated Unix timestamps, owner (team and user IDs), thumbnail image details, and type-specific metadata. Use this when you already know the asset ID (e.g. from an asset upload job result) and need its current metadata.

    Inputs

    assetIdstringrequired
    The unique ID of the Canva asset to retrieve. Asset IDs are alphanumeric strings (may include underscores or hyphens, 1-50 characters), e.g. Msd59349ff. Obtain asset IDs from asset upload job results or from a design's asset references.
  • canva_asset_upload_getGet the current status and result of an asset upload job that was started by directly uploading file bytes (outside this connector, e.g.Read-only

    Get Asset Upload Job

    Get the current status and result of an asset upload job that was started by directly uploading file bytes (outside this connector, e.g. via the Canva SDK or another integration), identified by its job ID. Returns a job object with `status` of `in_progress`, `success`, or `failed`. When `status` is `success`, the job includes the full `asset` object. When `status` is `failed`, the job includes an `error` object with a code (e.g. `file_too_big`, `import_failed`) and message. Note: this connector cannot itself start such a job, since the create endpoint requires a raw binary request body; use canva_asset_url_upload_create instead to both create and poll a job entirely through this connector.

    Inputs

    jobIdstringrequired
    The ID of the asset upload job to check. Job IDs are alphanumeric strings (may include underscores or hyphens, 1-50 characters).
  • canva_asset_url_upload_getPREVIEW API.Read-only

    Get Asset Upload Job From URL

    PREVIEW API. Get the current status and result of an asset upload-from-URL job that was started with canva_asset_url_upload_create, identified by its job ID. Returns a job object with `status` of `in_progress`, `success`, or `failed`. When `status` is `success`, the job includes the full `asset` object (ID, name, tags, timestamps, owner, thumbnail). When `status` is `failed`, the job includes an `error` object with a code (e.g. `file_too_big`, `import_failed`, `fetch_failed`) and message. You may need to poll this endpoint multiple times until the job reaches a terminal state.

    Inputs

    jobIdstringrequired
    The ID of the URL asset upload job to check, as returned by canva_asset_url_upload_create. Job IDs are alphanumeric strings (may include underscores or hyphens, 1-50 characters).