Canva

Live

OAUTH 2.0

DESIGN

Design

Canva gives your agent authenticated access to designs, brand templates, and assets, so design work happens under the account of the user who asked.

  • Per-user credentials: each call uses the actual user's token, never a shared bot.
  • Encrypted per-tenant vault: AES-256, resolved at request time, never in LLM context.
  • Scoped before every call: pre-call scope check, 90-day SIEM-exportable audit chain.
Canva
agent · Acme Q3
Run
Generate the launch social pack from our brand template.
S
canva_design_create
152ms
Design agent
4 designs created from the Launch template. Exports queued as PNG at 1080x1080.
Sources: 1 brand template, 4 designs
canva
4 designs
18:29
Message Claude...

Tools your agent reaches for on Canva, scoped per user.

CALL ANY TOOL
Create and export designs, apply brand templates, and manage assets and folders with the signed-in user's own Canva access.
canva_analytics_links_list
List analytics links
Lists trackable links and their metrics for a Canva design. Each item includes the link ID, its user-visible name, total view count, unique viewer count, total and average view duration in seconds, and the Unix timestamp of the most recent view. Supports cursor-based pagination via the continuation token. 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.
Parameters
Name
Type
Required
Description
designId
string
Required
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.
continuation
string
Optional
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 trackable links.
limit
integer
Optional
The maximum number of trackable links to return per page. Must be between 1 and 100. Defaults to 50.
canva_analytics_page_views_get
Get analytics page views
canva_analytics_summary_get
Get analytics summary
canva_analytics_viewers_list
List analytics viewers
canva_asset_delete
Delete asset
canva_asset_get
Get asset
canva_asset_update
Update asset
canva_asset_upload_get
Get asset upload
canva_asset_url_upload_create
Create asset url upload
canva_autofill_create
Create autofill
canva_autofill_get
Get autofill
canva_brand_template_get
Get brand template
canva_brand_template_publish
Publish brand template
canva_comment_reply_create
Create comment reply
canva_comment_reply_get
Get comment reply
canva_comment_reply_list
List comment reply
canva_comment_thread_create
Create comment thread
canva_design_dataset_get
Get design dataset
canva_design_export_formats_list
List design export formats
canva_design_import_get
Get design import
canva_design_pages_list
List design pages
canva_design_url_import_create
Create design url import
canva_design_url_import_get
Get design url import
canva_export_create
Create export
canva_folder_get
Get folder
canva_folder_item_move
Move folder item
canva_merge_create
Create merge
canva_oidc_userinfo_get
Get oidc userinfo
canva_resize_get
Get resize
canva_user_me_get
Get user me

For more tools, view docs.

Build your Agent
Same auth pattern across LangChain, OpenAI, Anthropic, and Google ADK.
Python · LlamaIndex
import { ScalekitClient } from "@scalekit-sdk/node";
import { createReactAgent } from "@langchain/langgraph/prebuilt";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

// Canva tools scoped to this user
const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["canva"], toolNames: [
    "canva_analytics_links_list",
    "canva_analytics_page_views_get",
    "canva_analytics_summary_get"] },
  pageSize: 100,
});

const agent = createReactAgent({ llm, tools });
await agent.invoke({ messages: [{ role: "user", content: "Is the Salesforce sync healthy?" }] });
import OpenAI from "openai";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const openai = new OpenAI();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["canva"] }, pageSize: 100,
});

const res = await openai.chat.completions.create({
  model: "gpt-5",
  messages: [{ role: "user", content: "Which data sources are connected?" }],
  tools,
});

// Execute the tool call with the user's vaulted Canva credential
await sk.tools.executeTool(res.choices[0].message.tool_calls[0], "user_123");
import Anthropic from "@anthropic-ai/sdk";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const anthropic = new Anthropic();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["canva"] }, pageSize: 100,
});

const msg = await anthropic.messages.create({
  model: "claude-sonnet-5",
  max_tokens: 1024,
  messages: [{ role: "user", content: "Pull open Zendesk tickets created this week." }],
  tools,
});

// Tool call runs with the user's vaulted Canva credential
await sk.tools.executeTool(msg.content, "user_123");
import { Agent } from "@google/adk/agents";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["canva"] }, pageSize: 100,
});

const agent = new Agent({
  name: "canva_agent",
  model: "gemini-2.5-pro",
  instruction: "Work with Canva for the signed-in user.",
  tools,
});

await agent.run("What auth does the Shopify connector need?");
Try these prompts
Paste any prompt into your agent to get started.
Design creation
Copy the prompt
Copied
Create a social post from our launch brand template.
Copy the prompt
Copied
Duplicate this design and swap the headline.
Copy the prompt
Copied
List the brand templates available to me.
Export
Copy the prompt
Copied
Export this design as PNG at presentation size.
Copy the prompt
Copied
Check the status of my export job.
Copy the prompt
Copied
Get the shareable link for this design.
Assets
Copy the prompt
Copied
Upload this image to our asset library.
Copy the prompt
Copied
List the folders in my Canva account.
Copy the prompt
Copied
Show me the view analytics for this design.
SEE HOW AUTH WORKS
Your users connect Canva once. Their credentials stay vaulted, every call is scope checked, and every design change is logged.
1
Authorize
Your user connects
Canva
once. We tie it to their identity and the meetings they approved — no shared bot account, no org-wide access
Who:
user ‘A’
when:
Once per user
access:
Limited to user
2
Store
Their
Canva
token lives in a vault scoped to them. User A's meetings are never reachable by an agent acting for user B, even on the same connection
vault:
encrypted
scope:
per-user
tokens:
auto-refreshed
3
Resolve
When your agent calls a
Canva
tool, we fetch the right token server-side. It never touches your agent, never appears in the LLM context, never shows up in your logs
speed:
~40ms
check:
before every call
seen by:
nobody
4
Audit
Every
Canva
tool call is logged — who triggered it, which meeting was fetched, what came back. 90 days of history, tied to the user who authorized it
history:
90 days
export:
SIEM-ready
logged:
every call
Test other agents
See the same per-user auth pattern across other connectors.
GTM and RevOps Teams
Competitive intelligence briefing agent
Scans Gong calls for competitor mentions, matches each one to its Notion battlecard, and DMs every affected rep a single Slack digest per cycle. Every call runs as the PMM who owns the briefing, never a shared bot.
Engineering Teams
Slack triage
Polls Slack for new messages, classifies bugs and support requests with a LangGraph router, files GitHub issues or Zendesk tickets, and confirms in the thread.
People Ops and HR teams
Performance review collector
Collects review feedback from Airtable and Google Forms scoped to each manager's direct reports, writes per-employee summaries to Notion, and DMs the manager a Slack digest.
People Ops and HR teams
Offer letter routing agent
Drafts the offer in PandaDoc, blocks on the hiring manager's approval in Slack, then emails the candidate their e-signature link. Every call runs as the recruiter who triggered it, never a shared HR bot.
Test other agents
See the same per-user auth pattern across other connectors.
GTM
Competitive intelligence briefing agent
Scan Gong calls for competitor mentions, match each one to its Notion battlecard, and DM every affected rep a single Slack digest.
ENGINEERING
Slack triage agent
Classify new Slack messages as bugs or support requests, file the GitHub issue or Zendesk ticket, and reply in the thread.
PEOPLE OPS
Performance review collector agent
Collect review feedback from Airtable and Google Forms per manager, summarise each report in Notion, and DM the digest in Slack.
PEOPLE OPS
Offer letter routing agent
Draft the offer in PandaDoc, gate it on hiring manager approval in Slack, then email the candidate their signature link.
Why Scalekit
Secure your agent's access. Connectors ship in minutes
01.
Shared tokens break per-user analytics
A shared Canva token looks fine in a demo. In production every action looks like one service account, and you cannot tell who wired a source or ran a query. Scalekit resolves the credential of the actual user who triggered the agent, never a shared bot.
// shared token
audit → bot_service_account

// scalekit
audit → user_abc ✓
02.
Authentication is not authorization
03.
Multi-tenancy is architectural
04.
Canva today. Ten connectors tomorrow.
“Our agents act across Salesforce, Gong, Google Drive, and more, on behalf of every customer. Scalekit behind the scenes meant we can keep adding tools without ever rebuilding how credentials or tool calling work.”
Venu Madhav Kattagoni
Head of Engineering / Von
FAQs
Frequently Asked Questions
Do designs the agent creates belong to the user?
Yes. The agent acts with that user's credential, so designs land in their Canva account with normal ownership and sharing.
Can the agent reach team brand templates?
Only the ones the user can already reach. Canva evaluates their access at request time.
How many Canva tools are available?
48 across designs, assets, folders, brand templates, exports, comments, and analytics. The page shows a representative 30.
Are exports synchronous?
No. Start the export, then poll the job with the matching get tool. Both are separate scoped calls.
How are tokens isolated across customers?
Per tenant and per user in an encrypted vault, resolved at request time and never in LLM context.
Start in your coding agent
Up and running in one command
Install the Scalekit skill in your editor of choice. Connector, auth, tools, prompt, all wired up
Claude Code REPL
/plugin marketplace add scalekit-inc/claude-code-authstack
/plugin install agentkit@scalekit-auth-stack
Cursor Code REPL
# ~/.cursor/mcp.json
{
""mcpServers"": {
""canva"": {
""url"": ""https://mcp.scalekit.com/canva"",
""headers"": { ""Authorization"": ""Bearer $SCALEKIT_TOKEN"" }
}
}
}
Codex Code REPL
# ~/.codex/config.toml
[mcp_servers.canva]
url = ""https://mcp.scalekit.com/canva""
auth_env = ""SCALEKIT_TOKEN""
Copilot Code REPL
# .vscode/mcp.json
{
""servers"": {
""canva"": {
""url"": ""https://mcp.scalekit.com/canva"",
""type"": ""http""
}
}
}