Embedded signing

Let your users sign inside your app with signing sessions and mountSigning.

Signers with delivery: "embedded" sign in your app. Your app vouches for who they are (the audit trail records customer_asserted, with their client_ref), so only create a session for that signed-in user, when they open the page that shows it.

On your server

const { :  } = await ...(, , {
  : 3600,
});
// Hand session.url to the browser. Its token is in the URL fragment: never log it.

Each call makes a new session; it works until expires_at (at most 24 hours) or until the signer has signed. Sessions are refused for email signers (signer_not_embedded), for requests that aren't sent and for signers who already signed or declined.

In the browser

Add your page's origin to your Sign settings' allowed_origins (dashboard, or coss.sign.settings.update), then mount the signing page:

const  = ({
  : ,
  ,
  : () => {
    if (. === "signed") .("Signed; request is", .);
    if (. === "declined") .("Declined:", .);
  },
});
// Later: signing.destroy();

The iframe grows with its content. Events: ready, viewed (they opened the documents), signed (request_status is completed when they were the last), declined and error. They come only from the signing page's origin and your iframe; treat them as UI hints and rely on webhooks for your records.

Without allowed_origins, the signing page can't be framed: open session.url in its own tab or redirect to it instead.

Settings