Overview
You can embed a public Agent Canvas into your own product using a standard HTML<iframe>, so your end users view canvas insights directly inside your app — no Upsolve account required, and no DNS or CNAME setup.
Optionally, you can white-label the share link so it shows your own domain instead of ai-hub.upsolve.ai.
Prerequisites
- An Agent Canvas with a public link enabled — open the Canvas share modal and toggle Public link on.
- The public link’s access token — shown in the share modal when the public link is on. It is the last path segment of the share URL.
Embed the canvas (the only required step)
Build a page in your product and drop in an iframe pointing at the Upsolve canvas link:- Replace
{accessToken}with the token from your share modal. ?hideHeader=1hides the canvas name and “Read-only” badge for a chrome-free embed (see URL Parameters).- For on-premise deployments, replace
ai-hub.upsolve.aiwith your instance’s hostname.
/shared/canvas/:token route sends Content-Security-Policy: frame-ancestors *, so the page can be embedded from any origin. Your users see your app’s page in the address bar; the canvas renders inside the frame. You do not need a custom domain or any DNS changes for this.
(Optional) White-label the share link with your own domain
By default the share modal generates links againstai-hub.upsolve.ai. If you’d rather the copyable link show your own domain, set a Custom Share Domain:
- Go to Project Settings → Sharing.
- Enter your Custom Share Domain — the base that replaces the
ai-hub.upsolve.ai/shared/canvasportion of the link, e.g.insights.yourcompany.com/canvas. A live preview shows the resulting link. - Save.
https://<your-domain>/<accessToken> — e.g. https://insights.yourcompany.com/canvas/{accessToken}.
The Custom Share Domain only rewrites the link string Upsolve generates — it does not change where the canvas is served. You decide what that URL does:
- Serve it from your own app (no DNS setup). Route that path in your product (e.g.
/canvas/:token) to a page you build that iframes the Upsolve canvas — the token is right there in the URL, so your page just renders<iframe src="https://ai-hub.upsolve.ai/shared/canvas/{token}?hideHeader=1">. This is the lightest option and needs no CNAME. - Point the domain at Upsolve (CNAME / reverse proxy). Forward the domain to your Upsolve instance so
https://<your-domain>/shared/canvas/{token}reaches Upsolve’s/shared/canvas/:tokenroute directly. If you proxy, keep theframe-ancestors *response header so the page can still be framed.
URL Parameters
How It Works
The/shared/canvas/:token route serves response headers that allow cross-origin framing (Content-Security-Policy: frame-ancestors *), configured for Vercel (cloud), nginx (cloud), and nginx (on-prem). All other Upsolve routes remain restricted to same-origin framing.
Embedding works because of that header alone — the outer page can live on any domain (yours). The Custom Share Domain is purely cosmetic for the link; it changes what the copyable URL says, not how the canvas is served.
Security
- The canvas is read-only — end users cannot modify data or run queries.
- Access is gated by the access token in the URL; revoking the public link (toggling it off in the share modal) immediately invalidates the token.
- No authentication or Upsolve account is required for viewers.