Anyway, that’s just my speculation. We’ll still have to wait for the “App Adoption Award in early April.”
]]>On the other hand, with the design editor intent, the user can choose to flatten or even compress the PDF, which is really helpful in some specific cases. Is there a way for us to obtain the flattened PDF via the content publisher intent?
Thank you!
]]>We’ll be sharing more details about the future of the App Adoption Award in early April. Stay tuned!
]]>We submitted the app with 2 mediaSlots, one using an ExactValueRange, { fileCount: { exact: 1 } }, and the other using a MaxValueRange, { fileCount: { max: 1 } } because we wanted the second mediaSlot to be optional. This was all working fine during dev/testing and production submission version, at the time of submission. Some time after, we started getting an error in the console that said “Error: Single page selection must exist”. This error seemed to be thrown from the second mediaSlot using the MaxValueRange as it now supposedly expects at least one image to be added, as the app worked fine again when tested with commenting out that mediaSlot or switching it to a MinMaxValueRange.
]]>There weren’t any releases for the content publisher intent over the last week or so. Do you mind sharing what you had to change so we can investigate?
Thanks!
]]>Hi, we submitted a new version of our app (APPS-38166) last week and it includes the Publish Intent. It was all verified and working as of the submission date.
Now we find we are getting error “Error: Single page selection must exist“.
Question: Did anything in the SDK change?
Anyway know how to fix this and have made the change, but we will need to cancel our “in review” APPS-38166 submission and probably be sent to the back of the queue. We are trying to get this update approved before our publish extension is removed.
Thanks
Tom
]]>The following apps will be receiving rewards from our App Adoption Awards program:
Check them out and show some love to the developers! ![]()
Happy coding,
Matty
I only have a Content Extension that is live on Canva app store. Thanks!
]]>During beta, these APIs enabled you to launch the Content Publisher and Bulk Create Data Connector intent experiences directly from your apps. With general availability, the APIs are now stable and ready for public app release in the Canva Apps SDK.
In line with our deprecation policy, we’ll maintain this API version for the next six months while continuing to make improvements. Feedback remains welcome ![]()
Find out more about these APIs and get started:
We’re ready when you are. Finalize your apps and submit them for review — we can’t wait to see what you build ![]()
The Canva Team
]]>The following apps will be receiving rewards from our App Adoption Awards program
:
Codia AI Design
Watermark Maker
Type Curve
Image Mixer
To try out each of the winning Apps, head to the Canva Apps Marketplace ![]()
Happy coding,
Matty
With the beta launch, we introduced the ability to experiment with the intent to publish content, provide previews, and configure platform-specific publish settings natively in the Share menu and other surfaces. With GA, you now have a stable, supported way to bring seamless publishing workflows to your apps, backed by production-ready tooling.
What GA Means for You
Next Steps
If you haven’t yet explored the intent, explore our key resources to begin your journey:
If you started development during the beta, now is a great time to finalise your integration, submit your app for review, and launch a publish experience to your users!
Thank you to everyone who provided feedback during the beta period. We’re thrilled to see what you build next!
The Canva Team ![]()
The app creation issue has now been resolved and you should be able to create new apps without any problems.
Action required: If you created an app after 2026-01-21 00:00:00 UTC, you’ll need to recreate it. We’re very sorry for the inconvenience this causes.
There would be a notification in your app detail page if your app is impacted.
To recreate your app:
Go to the Your apps tab in the developer portal
Select the Create an app button
Copy the affected app’s configuration across to the new app
[Optional: Delete the old app once you’ve confirmed the new one is working]
Again, we apologise for the disruption to your workflow. If you have any questions or issues, please let us know.
]]>Thanks for confirming with us! That is correct, we have recently updated our documentation that now localization for apps is mandatory.
For dynamic text returned from an API, please refer to this guideline. Keen to understand further your specific usecase though if you don’t mind sharing (if the guideline is insufficient)!
]]>We’re aware of an issue currently affecting app creation. This only impacts apps created after 2026-01-21 00:00:00 UTC, preventing developers from testing these apps locally.
Workaround: Please use Firefox as your browser for now, which should allow you to continue testing.
We’re actively working on a fix and will share more details about the specific issue shortly.
Thanks for your patience, and apologies for the disruption to your workflow.
]]>Enable it to surface your app on responsive designs like Canva docs
and Canva email
— helping you reach even more users across different design formats! ![]()
Before you flip the switch: make sure your app is ready by checking out the Feature Support guide on how to make your app compatible, as well as the Design Types guide to understand different design formats.
Once you’re all set, head to Developer Portal → Your App → Compatibility Tab → App compatibility to enable the app compatibility toggle.
Questions? Let us know — we’re here to help! ![]()
A little overdue, but in an effort to improve our Developer Experience, we’re packaging up as much of our SDK functionality as possible, to allow for easy updates and better version control. So, we’re excited to announce that @canva/app-middleware is now available on npm! This preview SDK makes it super easy to verify JWT tokens in your Node.js backend services, and replaces jwt_middleware and design_token modules that were previously included in the Apps SDK Starter Kit.
If you’re building apps with Canva, you need to verify tokens to authenticate users and access design context. We’ve built a comprehensive SDK that handles:
Express.js middleware - Drop-in middleware for Express apps that automatically verifies tokens and adds decoded payloads to your requests
import { user } from "@canva/app-middleware/express";
app.post(
"/api/user/profile",
user.verifyToken({ appId: "your-app-id" }),
(req, res) => {
const userId = req.canva.user.userId!;
// Your code here
}
);
Framework primitives - Core verification functions work anywhere - Next.js, AWS Lambda, Cloudflare Workers, Fastify, Hono, or any Node.js environment
import { initUserTokenVerifier } from "@canva/app-middleware";
const verifier = initUserTokenVerifier({ appId: "your-app-id" });
const payload = await verifier.verifyToken(token);
Token extraction utils - Built-in support for Authorization headers, query strings, cookies, or build your own custom extractor
We’re releasing this as a preview to get your feedback early. Try it out, kick the tires, and let us know what you think. What works well? What’s missing? What’s confusing? Your input will help shape the final release.
Install from npm:
npm install @canva/app-middleware@latest
Check out the docs:
npm package:
We’d love to hear your feedback, so please do not hesitate to reach out with any questions.
Cheers
Anto
All apps should be working again, regardless of whether the new versions have been launched. Glad to hear you’ve managed to submit the fixes as well!
]]>Is localization now compulsory?
Noticed that there’s now an alert in the developer portal that says translation is required and to upload your app’s UI strings before submitting.
The docs still suggest that localization is optional and its currently not a required action in the App status section of the portal.
Our app also has dynamic text thats returned from an API, if it is compulsory, would this also be expected to be translated?
]]>I have already corrected and submitted the updated version for review.
To help our team quickly review the correct app, could you please supply your app ID? We will look to expedite the fix. Thanks in advance.
However, I have a clarification question: Will incorrect values (like aiDisclosure: ‘ai’) be handled as part of this merge plan? I have several applications currently passing aiDisclosure: ‘ai’ instead of the correct enum values.
As a once off, we plan to disable runtime validation for released app versions for a short period time including allowing incorrect values as a grace period. However new app versions should use the correct values (either none or app_generated) and may throw errors otherwise.
Thank you and your team for your prompt response and action! We greatly appreciate your quick investigation and decision to temporarily reinstate runtime validation.
I will immediately work with my team to update the code correctly and add the aiDisclosure field in all relevant locations. We will also stop using any shortcuts and more strictly adhere to TypeScript type definitions—a great lesson learned! ![]()
I have already corrected and submitted the updated version for review.
However, I have a clarification question: Will incorrect values (like aiDisclosure: ‘ai’) be handled as part of this merge plan? I have several applications currently passing aiDisclosure: ‘ai’ instead of the correct enum values.![]()
We’ll work on a smooth transition for anyone else not using the types before reapplying the validation
]]>Glad to hear you’ll be adding the field. Great idea to switch to using TypeScript more fully, it will make things easier in the long run for you I’m sure!
]]>Thank you so much for the quick response and action! Really appreciate your team’s swift investigation and decision to revert the runtime validation temporarily.
I will immediately work with my team to update our code properly and add the aiDisclosure field to all relevant places. We’ll also remove those as any shortcuts and follow TypeScript types more strictly - lesson learned! ![]()
A suggestion for future rollouts:
I noticed many other apps seem to have the same issue. For similar breaking changes in the future, perhaps consider a progressive enforcement approach:
Phase 1: Warning logs (developers get alerted but apps still work)
Phase 2: Grace period with countdown notifications
Phase 3: Full enforcement
This would give developers time to react while maintaining platform stability.
Thanks again for your understanding and for working with the developer community. Your responsiveness really helps us maintain quality apps for Canva users.
Best regards,
Liu
In addition to our docs which mentioned the field, the typescript types are also a mechanism of ensuring that you are aware of the correct usage of our API. We apologise that we didn’t also have runtime validation for V2 earlier.
Our plan is to revert the runtime validation for the time being but I recommend disclosing as soon as possible, it’s been 15 months since we announced it. Let me know if you have any trouble!
Thanks again for your report and swift responses, this aided us in getting to the bottom of the problem.
]]>TypeScript, but I lazily used as any. ai image editor ,ai-age-filter … I hope you can set this parameter a bit more broadly first.
Thanks for the clarification.
Actually, I upgraded to V2 quite early - in fact, my first version was already built on V2. However, the issue is about the enforcement timeline, not the field introduction itself.
What I observed:
Previously (until 2 days ago): passing aiDisclosure: 'ai' worked fine, and omitting it also worked
Since 2 days ago: suddenly it became strictly enforced, causing runtime errors
This affected both my production app and other apps I’ve seen
My concern:
While I understand the 15-month notice period for the field’s introduction, the strict enforcement appears to have been enabled very recently without a clear transition period or warning. This is different from just adding a new field.
Impact:
My production app is now broken
I’ve noticed other developers’ apps experiencing similar issues
Users are affected immediately
Suggestion:
I recommend implementing a proper transition strategy, such as:
A grace period with warnings before strict enforcement
Clear communication about enforcement timeline (not just field availability)
Perhaps defaulting to ‘none’ temporarily with deprecation warnings
Could you confirm when the strict enforcement was enabled? This would help us understand the actual timeline we had to adapt.
Thanks for your understanding.
Best regards,
Liu
The aiDisclosure field was added as a new required field part of the V2 release of the Canva Apps SDK in September 2024. Developers have had over 15 months to upgrade. It was a major release, though not a breaking change to existing apps.
Could you explain what behaviour you are seeing? Is it just the types that are failing or a runtime error? If it’s a error while using the app, it appears that you’ve uncovered a bug where the field is expected even for apps on v1 of the Apps SDK.
We needed to make the field required rather than default to ‘none’ to ensure no content is incorrectly undisclosed AI due to omission.
]]>Based on your ongoing feedback and evolving needs, we’re excited to announce that the limit for localised messages per App has been increased to 500!
Thank you for continuing to make Canva accessible to users around the world.
]]>Please ignore it, even if the application passes an incorrect value or no value at all. key:aiDisclosure
]]>Dear Canva Developer Platform Team,
I'm writing to report a **critical breaking change** in the `@canva/asset` upload API that has been affecting many existing apps since approximately **January 13-14, 2026**.
---
## 🔴 Issue Summary
The `aiDisclosure` parameter in the `upload()` function appears to have become **mandatory** without prior deprecation notice. This change has caused widespread failures for users attempting to:
- Add assets to designs
- Upload to media library
**Affected API:**
```typescript
import { upload } from "@canva/asset";
await upload({
type: "image",
url: "https://example.com/image.jpg",
mimeType: "image/jpeg",
thumbnailUrl: "https://example.com/thumb.jpg",
aiDisclosure: "none" // ← Previously optional, now required
});
To maintain backward compatibility and minimize disruption to the Canva app ecosystem, we kindly request:
Default fallback behavior: If
aiDisclosure
is missing or invalid, default to
"none"
(matching previous behavior)
Graceful deprecation: Instead of hard failures, show a console warning to guide developers:
⚠️ Warning: 'aiDisclosure' will be required in a future version.
Please update your integration. Defaulting to 'none'.
See: https://www.canva.dev/docs/apps/asset-upload
Advance notice: Provide a reasonable migration window (e.g., 30-60 days) before enforcing mandatory parameters
Many production apps are now broken without any code changes on our end
Users are experiencing failures with no clear error messaging
This undermines trust in the stability of the Canva platform APIs
We fully understand and support the importance of AI disclosure for transparency. We are committed to updating our integration to comply with this requirement. We simply ask for a graceful transition period to:
Protect existing users from unexpected failures
Give developers adequate time to update their code
Maintain the stability of the Canva app ecosystem
The following apps will be receiving rewards from our App Adoption Awards program
:
Frames Lab
Vector Studio
Calendar Builder
To try out each of the winning Apps, head to the Canva Apps Marketplace ![]()
Happy coding,
Matty
On the design name, we’re actively discussing this internally since getDesignMetadata no longer provides it. We’ll share an update once there’s a clear direction on whether it will be included in contentMetadata.
For the need to specify a size when exporting with the Content Publisher intent, this is part of creating a more predictable experience for developers. By explicitly defining the output size, you avoid any guesswork around dimensions and ensure the export is optimized for your platform. The goal is to make publishing more consistent and seamless.
Let me know if you have any other questions.
Cheers!
]]>so does that mean I need to enter an email for each product?
Yes, for now, you’d need to enter an email for each product.
]]>Until recently, we could retrieve the design title via getDesignMetadata(), but that no longer seems to be possible. Are you planning to include the design name in contentMetadata?
Also, for regular apps we can export pdf_standard without specifying a size, but that doesn’t work with the Content Publisher intent. Is there a recommended workaround for this?
The Intents Platform is coming.
A new foundation for building richer, smarter, more seamless experiences directly inside Canva — a place where apps can understand what users are trying to do and step in naturally, instantly, and delightfully.
For indie builders and platform veterans alike, this is the moment to:
Start dreaming up new apps built natively for Intents
Prepare existing apps to migrate and unlock deeper, more contextual interactions
And to help make that journey smoother for everyone, the foundation has already shifted in your favor:
Our intent-first docs, CLI, and starter kit now give you a clearer, more intuitive path to building intent-driven apps from the very start — reducing friction and helping you move faster with confidence.
The upgraded Developer Portal makes it easier than ever to develop, test, and validate intents, so you can iterate quickly and see exactly how your app behaves in real user flows.
Thank you for celebrating Devcember with us. As we say at Canva, we’re only 1% of the way there — and this next chapter for the Developers Platform is just the beginning. We’re excited to continue this journey with all of you.
Onward to the Intents Platform! ![]()
In short
We are excited to unlock more powerful publishing integrations while keeping the Canva editor focused on helping everyone design.
Awaiting new powers soon to be found… ![]()
Today, two sparkling gifts land beneath the developer tree — both now available in Developer Preview via the @canva/[email protected] package:
Multi-Account OAuth
Multi-Provider OAuth
Together, they unlock the most flexible authentication flows ever released for Canva apps. Let the festivities begin!
Multi-Account OAuth (Developer Preview)
Apps can now let users connect multiple accounts from the same provider — ideal for DAM tenants, multiple cloud drives, social profiles, or any integration where users switch identities.
With Multi-Account OAuth, developers can:
Link multiple accounts from a single provider
Fetch accounts with displayName, principal, avatar, and connection status
Use account-specific getAccessToken() to call external APIs
Refresh accounts or request re-authorization as needed
See the sample code in the docs
Multi-Provider OAuth (Developer Preview)
Alongside multi-account support, apps can now register multiple OAuth providers at once — all inside the same Canva app.
This means users can connect:
Google and Dropbox
Meta and Bynder
Multiple DAMs, CRMs, clouds — whatever your app supports
Apps can now:
Register multiple providers in the app manifest
Initialize OAuth per provider
Combine multi-provider + multi-account for ultimate flexibility
See the sample code in the docs
Both of these new capabilities—multi-account and multi-provider—are available now in Developer Preview, bundled inside: @canva/[email protected]
Find the full guide and API reference here:
To see everything we’ve launched so far, check out the Developer Christmas 2025 thread.
Happy Devcember! ![]()
Teams evolve, responsibilities shift, and now your app can shift right along with them.
App Owners can now transfer ownership to another collaborator directly in the Developer Portal. When ownership is transferred, the previous owner becomes a Manager, keeping visibility and collaborator controls without the full-owner responsibilities.
Here’s how access levels work today:
Members – Can edit fields, preview the app, and submit for review
Managers – Everything a Member can do, plus manage collaborators
Owners – Full control, including deleting apps and now transferring ownership
Where to find it:
Developer Portal → Your App → Collaborators Tab → Role → Owner → Transfer Ownership
This has been one of the top follow-up requests since we launched Multiplayer, and we’re thrilled to continue strengthening team workflows this Devcember. Give it a try — and let us know how it supports your development flow! ![]()
![]()
See the full docs here for more information.
]]>These APIs are designed to simplify multi-design creation workflows. Apps can initiate Bulk Create directly, with their data automatically shown to them, and then move easily into Publishing those generated designs - built on top of the existing Data Connector and Content Publisher intents. Because this is an early preview, we’re actively improving both APIs, and developer feedback is especially welcome.
Highlights
Programmatically open Bulk Create from your app
Use your data to generate a design
Continue the flow into Publishing without interruptions
Build more guided, efficient end-to-end experiences
Try the APIs today in Preview, and expect regular updates
Examples
Explore the docs
We’re excited to support more seamless app → product integrations and scaled content workflows with these new tools, and we look forward to your feedback as we continue refining them into the future.
To catch up on everything we’ve launched so far, check out the Developer Christmas 2025 thread. Happy Devcember! ![]()