Embed widget

Embed signing inside your product, in an afternoon.

One script tag mounts the VG·Sign signer in an iframe inside your product, themed by your workspace brand, with signed and declined events delivered to your page over postMessage.

Beta

v1 · REST · OpenAPI at /api/v1/openapi.json

Three lines of HTML.

Renders a sealed signing experience inside any container. Your dashboard, your customer portal, your white-labelled invoice page.

your-app.html
<script src="https://vg-sign.com/embed.js"></script>

<div id="vg-sign" data-token="SIGNING_TOKEN"
     data-theme="auto"></div>

<script>
  VGSign.mount({
    onSigned: e => toast(`✓ Signed: ${e.token}`),
    onDeclined: e => reroute("/agreements/inbox"),
  });
</script>
  • Drop-in

    One script tag, one div. No build pipeline, no React peer dep.

  • Branded

    Inherits your workspace logo and brand colour, set once in settings.

  • Sandboxed

    Renders in an iframe; talks back over postMessage only. Your DOM stays untouched.

  • Allowlisted

    Framing is denied by default. Only origins we add to your allowlist can embed.

Branded from your workspace.

The embedded signer inherits your workspace branding, logo and brand colour on Pro, Team or Enterprise, set once under Settings, Brand. No separate theme file to maintain; what your senders see is what your embedded customers see. By default the embedded signer follows the viewer’s system light/dark preference.

Acme · Customer portalYour app
VG · SignAwaiting signature

Master Services Agreement

12 pages · expires May 4 · 3 signers

Access & origins.

  • Signing token

    Your backend creates an envelope through the API and receives a per-recipient signing token. Pass it as data-token and the widget loads that recipient’s signer.

  • Origin allowlist

    Your site’s origin must be on our embed allowlist for your domain, a single list we set up for you rather than a setting inside each workspace. Request it from us when you go live; until then, framing is denied.

  • Events

    The iframe posts { source: "vg-sign", type, token } on signed / declined. mount() surfaces them as onSigned / onDeclined.

Send your first envelope free.

Start on Free and upgrade to Pro when you need more.