@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
| Item | Value |
|---|---|
| Integration name | canva |
| Reconnect | https://kody.codes/connect/oauth?provider=canva |
| API base | https://api.canva.com/rest |
| Approved hosts | api.canva.com, www.canva.com |
Injected Authorization headers on helpers are ignored (integration-managed).
Import paths
| Export | Import |
|---|---|
| overview | kody:@kody/canva |
| api (named helpers + default dispatcher) | kody:@kody/canva/api |
| operations catalog | kody:@kody/canva/operations |
| smoke-test | kody:@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, limitsheaders— operation-specific metadata (notAuthorization)body— JSON or binary bodyconfirm/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
previewin./operationsand cannot be used in public Canva integrations under review. createCommentis deprecated; prefercreateThread.- 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*Jobuntilsuccessorfailed. - Rate limits throw
CanvaApiErrorwithstatus,body, andretryAfter. - Fork/adapt: connect your
canvaOAuth integration; do not reuse the live@kody/canvaconnection as if it were yours. - Never paste Canva OAuth tokens into chat or logs.