Open external link

Open external URLs safely from within Canva apps.

Running this example

To run this example locally:

  1. 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.

  2. 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.

  3. Clone the starter kit:

    git clone https://github.com/canva-sdks/canva-apps-sdk-starter-kit.git
    cd canva-apps-sdk-starter-kit
    SHELL
  4. Install dependencies:

    npm install
    SHELL
  5. Run the example:

    npm run start open_external_link
    SHELL
  6. 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 environment
const response = await requestOpenExternalUrl({
url,
});
// Handle user consent response - users can abort the navigation
if (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 over
to the{" "}
{/* Link component with requestOpenExternalUrl prop handles external navigation */}
<Link
href={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>
<Button
variant="secondary"
onClick={() => openExternalUrl(GUIDELINES_URL)}
>
Design Guidelines
</Button>
<Button
variant="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";
const root = createRoot(document.getElementById("root") as Element);
function render() {
root.render(
// AppUiProvider provides Canva's design system theming and accessibility features
<AppUiProvider>
<App />
</AppUiProvider>,
);
}
render();
// Hot Module Replacement for development (automatically reloads the app when changes are made)
if (module.hot) {
module.hot.accept("./app", render);
}
TYPESCRIPT
# Open external links
Demonstrates 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
MARKDOWN

API reference

Need help?