Use case

Let customers sign without leaving your app

Your customer is already logged in to your portal, checkout or onboarding flow. Sending them to their inbox to sign breaks the moment. Embedded signing opens SignMaster's signing page inside your app, for exactly the person in front of the screen, and tells your page when they're done.

Updated November 5, 2026 · 2 min read

On this page
  1. How it works
  2. Build it in six steps
  3. Iframe or redirect?
  4. Try it before you write code
  5. Questions

How it works

Your server asks SignMaster for a signing session for one signer on an envelope that's already been sent. SignMaster returns a single-use link. You show it in an iframe on your page, or redirect the person to it, and SignMaster reports the outcome back to you. Everything else is the normal signing experience: the consent step, the guided fields, the audit trail and the sealed PDF.

Build it in six steps

  1. 1

    Create a key

    In Settings › Developers, create an API key with the embedded:create scope. Keep it on your server, never in the browser.

  2. 2

    Allow your site

    Under Allowed origins, add the address your page runs on, like https://app.example.com. Plain http works only for localhost while you develop.

  3. 3

    Send the envelope

    Send it from SignMaster as usual, or from your code through the REST API. A session can only open for the signer whose turn it is.

  4. 4

    Ask for a session

    Call POST /api/v1/envelopes/{id}/embedded-sessions with the signer's recipient_email (or recipient_id), a return_url, and a frame_origin if you'll show it in an iframe. The reply carries the session's url and when it expires.

  5. 5

    Open it straight away

    The url works once and must be opened within 5 minutes, so request it at the moment you show it. After it opens, the signer has up to an hour to finish.

  6. 6

    Handle the result

    In an iframe, your page receives signmaster:loaded, signmaster:completed, signmaster:declined or signmaster:error messages. Without one, the signer comes back to your return_url with event=signing_complete, declined, session_expired, link_used or unavailable.

Confirm on your server

A browser event is a hint, not proof. Before you mark an order as signed, check the envelope with GET /api/v1/envelopes/{id}, or listen for the recipient.completed webhook.

Iframe or redirect?

IframeRedirect
Feels likePart of your pageA short trip to SignMaster and back
You get the resultAs a message to your pageAs ?event= on your return URL
Needsframe_origin, listed under Allowed originsA return URL on an allowed origin
Good forPortals and dashboards on desktopPhones and tight layouts
Two ways to show the signing page

Only the origin you name may frame the page, so another site can't wrap your customer's signing session in its own. The certificate of completion records that the person signed in an embedded session and on which site.

Try it before you write code

Settings › Developers has a Try embedded signing sample you can open in one click, plus a Code section with a ready snippet. The developer docs list the endpoints. In an embedded session the signing page drops SignMaster's logo and shows yours, if you've uploaded one.

Questions? Answers.

Which plans include embedded signing?

Crew and Company, along with the rest of the API. New workspaces can try Crew free for 14 days. Compare plans.

Does the signer still get an email?

Yes. The envelope is sent as usual, so the signer also has their emailed link. Embedded signing adds a second way in while they're in your app.

What if the session expires before they finish?

Your page gets an error with session_expired. Ask your server for a new session and open that one instead.

Can I embed it in a mobile app?

Use the redirect flow: open the session in a web view and watch for navigation to your return URL. The signing page is built for phones.

Your next contract,
signed today.

Start free in any browser and send your first document.