Open external link
Open external URLs safely from within Canva apps.
Running this example
To run this example locally:
-
If you haven't already, create a new app in the Developer Portal(opens in a new tab or window). For more information, refer to our Quickstart guide.
-
In your app's configuration on the Developer Portal(opens in a new tab or window), ensure the "Development URL" is set to
http://localhost:8080. -
Clone the starter kit:
git clone https://github.com/canva-sdks/canva-apps-sdk-starter-kit.gitcd canva-apps-sdk-starter-kitSHELL -
Install dependencies:
npm installSHELL -
Run the example:
npm run start:example open_external_linkSHELL -
Click the Preview URL link shown in the terminal to open the example in the Canva editor.
Example app source code
// For usage information, see the README.md file.import { Button, Link, Rows, Text, Title } from "@canva/app-ui-kit";import { requestOpenExternalUrl } from "@canva/platform";import * as styles from "styles/components.css";const DOCS_URL ="https://www.canva.dev/docs/apps/api/platform-request-open-external-url/";const GUIDELINES_URL ="https://www.canva.dev/docs/apps/design-guidelines/external-links/";const ACCEPTING_PAYMENTS_URL ="https://www.canva.dev/docs/apps/accepting-payments/";export const App = () => {const openExternalUrl = async (url: string) => {// requestOpenExternalUrl requires user consent before opening external URLs// This ensures users are aware they're leaving the Canva environmentconst response = await requestOpenExternalUrl({url,});// Handle user consent response - users can abort the navigationif (response.status === "aborted") {// User decided not to navigate to the external link// In production apps, you might want to show feedback or alternative actions}};return (<div className={styles.scrollContainer}><Rows spacing="1u"><Text>To learn more about how to open external URLs in your app, head overto the{" "}{/* Link component with requestOpenExternalUrl prop handles external navigation */}<Linkhref={DOCS_URL}requestOpenExternalUrl={() => openExternalUrl(DOCS_URL)}ariaLabel="Canva Apps SDK docs">docs</Link>.</Text><Title>Guidelines</Title><Text>Be sure to check out the guidelines below</Text><Buttonvariant="secondary"onClick={() => openExternalUrl(GUIDELINES_URL)}>Design Guidelines</Button><Buttonvariant="secondary"onClick={() => openExternalUrl(ACCEPTING_PAYMENTS_URL)}>Payment links</Button></Rows></div>);};
TYPESCRIPT
// For usage information, see the README.md file.import { AppUiProvider } from "@canva/app-ui-kit";import { createRoot } from "react-dom/client";import { App } from "./app";import "@canva/app-ui-kit/styles.css";import type { DesignEditorIntent } from "@canva/intents/design";import { prepareDesignEditor } from "@canva/intents/design";async function render() {const root = createRoot(document.getElementById("root") as Element);root.render(// AppUiProvider provides Canva's design system theming and accessibility features<AppUiProvider><App /></AppUiProvider>,);}const designEditor: DesignEditorIntent = { render };prepareDesignEditor(designEditor);// Hot Module Replacement for development (automatically reloads the app when changes are made)if (module.hot) {module.hot.accept("./app", render);}
TYPESCRIPT
# Open external linksDemonstrates how to handle external link navigation with proper user consent and security patterns. Shows the use of `requestOpenExternalUrl` API, user confirmation workflows, and compliance with external navigation guidelines.For API reference docs and instructions on running this example, see: <https://www.canva.dev/docs/apps/examples/open-external-link/>.NOTE: This example differs from what is expected for public apps to pass a Canva review:- Error handling is simplified for demonstration purposes. Production apps must implement comprehensive error handling with clear user feedback and graceful failure modes when external URL requests fail- Internationalization is not implemented. Production apps must support multiple languages using the `@canva/app-i18n-kit` package to pass Canva review requirements- The code structure is simplified: Production apps using [intents](https://www.canva.dev/docs/apps/intents/) are recommended to call the prepareDesignEditor function from src/intents/design_editor/index.tsx
MARKDOWN
API reference
Need help?
- Join our Community Forum(opens in a new tab or window)
- Report issues with this example on GitHub(opens in a new tab or window)