Canva Apps SDK and Connect API adoption surface
Document status:
reviewed. Canonical source.
Summary
Canva exposes two materially different integration surfaces. Apps SDK code runs inside the editor and the Design Editing API can read and edit supported page ingredients. Connect APIs are OAuth-protected server APIs for off-platform workflows such as import, export and return navigation. The Apps SDK is the primary semantic NUIF adoption path; Connect is a secondary workflow bridge and cannot currently import or export NUIF natively.
The first app profile should use only generally available current_page
Design Editing APIs on one fixed-dimension page, normalize groups/rects/shapes/
text through a bounded schema, validate the complete plan and call sync once.
Canva’s documented preview restriction, product-specific element model and app
review process make a broader “Canva adapter” claim unsound.
Evidence
- A Canva app is JavaScript embedded in a side-panel iframe. Canva injects API
packages including
@canva/design; the app does not gain direct access to an undocumented document file. Locator: Apps SDK, Integrating with Canva, basic app and API package sections, retrieved 2026-08-31: https://www.canva.dev/docs/apps/integrating-canva/. openDesignprovides page snapshots, helpers andsync. Sessions expire after one minute. Supported pages areabsolute; unsupported pages cannot be read or edited, and Canva Docs are explicitly incompatible. Fixed and unbounded absolute pages are distinguished and pages carry stablePageIdvalues. Locator: Apps SDK, Design Editing API, core concepts, sessions and pages, retrieved 2026-08-31: https://www.canva.dev/docs/apps/design-editing/.- The Design Editing API provides CRUD only for supported elements: embeds,
groups, rects, shapes and text. Images and videos are represented as rectangle
fills, text is exposed as rich-text ranges, and tables are unsupported.
Layering is list order rather than a
z-index. Locator: same document, elements, element types and layering sections. - Snapshot changes affect the live design only after
sync; Canva’s design guidelines recommend applying a logical change as one operation so the user can undo it as one action. Apps must present critical unsupported/failure states and must not unexpectedly replace or delete the whole design. Locator: Apps SDK, Design Editing API design guidelines, changing a design and error sections, retrieved 2026-08-31: https://www.canva.dev/docs/apps/design-guidelines/design-editing-api/. - The general Design Editing guide still labels
all_pagesas preview while the GA package changelog says multi-page editing was promoted to GA. This documentation inconsistency is why profile 0 remains on the unambiguous GAcurrent_pagecall. Locators: design editing guide above;@canva/designGA changelog, retrieved 2026-08-31: https://www.canva.dev/docs/apps/api/latest/design-changelog/. - Canva states that preview packages may change without a new version and apps using them cannot pass public app review. The same rule applies to preview Connect features. Locators: Apps SDK, Integrating with Canva, preview APIs; Connect API overview, preview APIs, retrieved 2026-08-31: https://www.canva.dev/docs/apps/integrating-canva/ and https://www.canva.dev/docs/connect/.
- Canva’s app iframe CSP allows
wasm-unsafe-evalbut blocks third-party JavaScript, frames and web workers. This permits a bundlednuif-wasmmodule but not remote executable code or worker-based assumptions. Locator: Apps SDK, Content Security Policy, allowed features and directives, retrieved 2026-08-31: https://www.canva.dev/docs/apps/content-security-policy/. - Connect design imports are asynchronous byte uploads requiring OAuth bearer
authorization and
design:content:write; the endpoint is rate-limited to 20 requests per minute per user. The supported list includes native Affinity extensions, PDF and other formats, but not NUIF. Locator: Connect APIs, Create design import job and Design imports, retrieved 2026-08-31: https://www.canva.dev/docs/connect/api-reference/design-imports/create-design-import-job/ and https://www.canva.dev/docs/connect/api-reference/design-imports/. - Connect exports are asynchronous and currently support JPG, PNG, GIF, PPTX,
MP4, PDF, CSV, HTML bundle and standalone HTML; completed download URLs expire
after 24 hours. The endpoint requires
design:content:readand has integration, document and user throttles in addition to the per-user request limit. Locator: Connect APIs, Create design export job, retrieved 2026-08-31: https://www.canva.dev/docs/connect/api-reference/exports/create-design-export-job/. - A public app is submitted as a source bundle through the Developer Portal, needs listing/testing material and Canva review, and can be released only after approval. Marketplace developers must provide identity and legal-entity information; team apps use an Enterprise-team review path. Released or rejected apps are changed by creating a new app version. Locators: Apps SDK, Submitting apps, App review process, Developer verification and App versioning, retrieved 2026-08-31: https://www.canva.dev/docs/apps/submitting-apps/, https://www.canva.dev/docs/apps/app-review-process/, https://www.canva.dev/docs/apps/developer-verification/ and https://www.canva.dev/docs/apps/versioning-apps/.
Options considered
Apps SDK Design Editing API
Selected as the primary path. It exposes typed semantic objects, a transaction- like sync boundary, user-visible undo and a public distribution channel. The first profile remains narrow enough to test without inventing Canva semantics.
Connect API native NUIF workflow
Not currently possible. NUIF is absent from the documented import/export format lists. Connect can route SVG/PDF with explicit loss or return users to a design, but cannot prove element-level NUIF round trips. Native NUIF support is an upstream adoption request, not an adapter feature that this repository can declare.
Render or app-element flattening
Rejected. Replacing a page with a screenshot or one opaque app element defeats editable semantics and conflicts with Canva’s design-editing guidance. A render may be diagnostic evidence only.
Preview API dependency
Rejected for the public profile. Preview behavior can change without versioning and blocks public review. Preview experiments may be kept in a separate branch and evidence class, never in a release bundle.
Adoption and release path
- Implement pure Canva snapshot and mutation-plan types with fixtures, bounds
and
HostAdapterReportoutput; do not call live APIs until that mapping is exact for the declared subset. - Build a no-network, single-file Apps SDK review shell that bundles
nuif-wasm, verifies its CSP and official TypeScript types, and uses only stable APIs. - Run named live-host trials for read, import, one-sync undo, cancellation, locked content, conflicts, session expiry and unsupported ingredients.
- Publish a source review bundle through GitHub release artifacts with digest, SBOM and fixture report. Submission remains a manual authenticated action; a Git tag must never publish the app automatically.
- After human developer verification and Canva approval, create versions in the Developer Portal for reviewed updates. Keep the app version independent from editor, WASM and format versions.
- Propose native NUIF MIME import/export to Canva only after the profile has public fixtures, independently reviewed fidelity and demonstrated user demand. The proposal must specify package safety, unknown-extension retention and profile negotiation rather than asking Canva to adopt the entire draft.
NUIF relevance
Borrow Canva’s explicit iframe, permission, session, sync, review and distribution boundaries. They are a useful model for a host adapter that makes mutation authority and user-visible undo explicit.
Adapt HostAdapterReport, canonical NUIF operations and the WASM binding to
the Apps SDK edge. Keep Connect API OAuth, rate limits, temporary URLs and
privacy policy outside the deterministic core.
Reject preview APIs in a public profile, opaque app-element flattening, remote executable code and any native NUIF interoperability claim until Canva publishes the corresponding MIME and semantic contract.
Open questions
- Which element IDs, metadata fields or app-owned data survive duplicate, reorder, close/reopen and cross-design copy under generally available APIs?
- Does the review production bundle execute
nuif-wasmidentically under the documented CSP on every supported Canva browser/desktop host? - Which rich-text, custom-path, image-fill crop and font semantics can be mapped exactly without undocumented assumptions?
- When the all-pages documentation and GA package surface agree, what page- ordering, session-expiry and atomicity rules are needed for a separate multi-page profile?