Skip to content
← Public packages

@kody/canva

Create, organize, collaborate on, import, and export Canva content through the Connect API.

AGENTS.md

163 lines · 4.8 KB · Markdown

@kody/canva — agent notes

Human setup and intent live in README.md. This file is for agents: imports, smoke/dryRun execute snippets, and edge cases. Auth is the saved OAuth integration named canva — never paste tokens. Do not disable live webhooks or jobs.

Auth / integration

ItemValue
Integration namecanva
Reconnecthttps://kody.codes/connect/oauth?provider=canva
API basehttps://api.canva.com/rest
Approved hostsapi.canva.com, www.canva.com

Injected Authorization headers on helpers are ignored (integration-managed).

Import paths

ExportImport
overviewkody:@kody/canva
api (named helpers + default dispatcher)kody:@kody/canva/api
operations catalogkody:@kody/canva/operations
smoke-testkody:@kody/canva/smoke-test

Prefer static kody:@kody/canva/... imports from execute. Do not lead with packages.invoke.

Named helpers live on ./api (for example listDesigns, getDesign, createDesign, listFolderItems). The default ./api export dispatches by lowercase OpenAPI slug (operation + input).

Designs and jobs

createDesign, getDesign, listDesigns, getDesignPages, getDesignDataset, getDesignExportFormats, createDesignResizeJob, getDesignResizeJob, createDesignMergeJob, getDesignMergeJob, createPrintPartnerDesign, and createPrintPartnerDesignExportJob.

Assets

createAssetUploadJob, getAssetUploadJob, createUrlAssetUploadJob, getUrlAssetUploadJob, getAsset, updateAsset, and deleteAsset.

Imports and exports

createDesignImportJob, getDesignImportJob, createUrlImportJob, getUrlImportJob, createDesignExportJob, and getDesignExportJob.

Folders

createFolder, getFolder, updateFolder, deleteFolder, listFolderItems, and moveFolderItem.

Comments

createThread, getThread, createReply, getReply, listReplies, and the deprecated createComment.

Brand templates and autofill

listBrandTemplates, getBrandTemplate, getBrandTemplateDataset, publishBrandTemplate, createDesignAutofillJob, and getDesignAutofillJob.

Users and OIDC

usersMe, getUserProfile, getUserCapabilities, userInfo, and getOidcJwks.

Request shape for named helpers / dispatch input:

  • params — path placeholders (designId, folderId, …)
  • query — filters, pagination, sort, limits
  • headers — operation-specific metadata (not Authorization)
  • body — JSON or binary body
  • confirm / dryRun — mutation safety

Smoke test (read-only)

import smokeTest from 'kody:@kody/canva/smoke-test'

export default async function main() {
	return await smokeTest()
	// => { ok: true, integration: 'canva', checks: { profile, capabilities } }
	// status + responseType only — no profile PII
}

Optional discovery (no Canva call beyond local catalog):

import operationsCatalog from 'kody:@kody/canva/operations'

export default async function main() {
	return await operationsCatalog()
	// => { count, operations: { listdesigns: { method, path, tag, ... }, ... } }
}

dryRun / confirm (writes)

Every mutating operation requires confirm: true after explicit user approval. Use dryRun: true to preview method, path template, and request without contacting Canva.

import { createDesign } from 'kody:@kody/canva/api'

export default async function main() {
	return await createDesign({
		body: {
			design_type: { type: 'preset', name: 'presentation' },
			title: 'Quarterly review',
		},
		dryRun: true,
	})
}

Slug dispatcher:

import canva from 'kody:@kody/canva/api'

export default async function main() {
	return await canva({
		operation: 'listdesigns',
		input: { query: { limit: 5 } },
	})
}

Read-only example:

import { getDesign, listDesigns } from 'kody:@kody/canva/api'

export default async function main() {
	const recent = await listDesigns({
		query: { ownership: 'owned', sort_by: 'modified_descending', limit: 10 },
	})
	const design = await getDesign({ params: { designId: 'DAVZr1z5464' } })
	return { recent, design }
}

Edge cases / fork notes

  • Preview APIs can change without notice; they are marked preview in ./operations and cannot be used in public Canva integrations under review.
  • createComment is deprecated; prefer createThread.
  • Resize APIs need Canva Pro (or eligible plan). Autofill / some brand-template ops need Canva Enterprise.
  • Async create ops return job IDs — poll the matching get*Job until success or failed.
  • Rate limits throw CanvaApiError with status, body, and retryAfter.
  • Fork/adapt: connect your canva OAuth integration; do not reuse the live @kody/canva connection as if it were yours.
  • Never paste Canva OAuth tokens into chat or logs.