Skip to main content

Documentation Index

Fetch the complete documentation index at: https://developers.luminpdf.com/llms.txt

Use this file to discover all available pages before exploring further.

By default, Lumin sends signers an email with a link to complete their signature. Embedded signing lets you bypass or supplement that email flow — you generate a signing link via the API and present it inside your own web app, mobile app, or customer portal. When to use embedded signing:
  • You want signers to sign without leaving your product.
  • Your users are already authenticated in your app and you want a seamless in-context experience.
  • You need to control exactly when and how the signing prompt is presented.
  • You want to combine embedded signing with email delivery — the two approaches can be used together.

How it works

1
Create the signature request
2
Send the document for signing as usual using POST /signature_request/send. You do not need to disable email notifications — embedded signing works alongside email delivery.
3
curl -X POST https://api.luminpdf.com/v1/signature_request/send \
  -H "Authorization: API-key <your-key>" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Rental Agreement",
    "file_url": "https://example.com/rental-agreement.pdf",
    "expires_at": 1927510980694,
    "signing_type": "SAME_TIME",
    "signers": [
      { "email_address": "[email protected]", "name": "Alex Tenant" }
    ]
  }'
4
{
  "signature_request": {
    "signature_request_id": "696d007913f3b8...",
    "created_at": "1768751225657",
    "status": "WAITING_FOR_PROCESSING"
  }
}
5
Save the signature_request_id — you need it to generate signing links.
7
Call POST /signature_request/{id}/signing-link with the signer’s email address to get a unique, time-limited signing URL for that signer.
8
curl -X POST https://api.luminpdf.com/v1/signature_request/696d007913f3b8.../signing-link \
  -H "Authorization: API-key <your-key>" \
  -H "Content-Type: application/json" \
  -d '{
    "signer_email": "[email protected]"
  }'
9
{
  "view_url": "https://sign.luminpdf.com/auth?mode=view-contract&token=8647b08b...",
  "signer_email": "[email protected]",
  "status": "NEED_TO_SIGN"
}
11
Use view_url to direct the signer to the Lumin signing interface. You have two options:
12
Redirect
Redirect the user’s browser directly to the signing URL:
window.location.href = signingResponse.view_url;
Embed in iframe
Embed the signing experience inline in your page:
<iframe
  src="https://sign.luminpdf.com/auth?mode=view-contract&token=8647b08b..."
  width="100%"
  height="800px"
  style="border: none;"
  title="Sign document"
></iframe>

Signer status values

The status field in the signing-link response reflects the signer’s current state at the time of the request.
StatusMeaning
NEED_TO_SIGNThe signer has not yet signed. The view_url is ready to use.
WAITING_FOR_OTHERSOrdered signing is in use and it is not yet this signer’s turn.
APPROVEDThe signer has already completed signing.
REJECTEDThe signer declined to sign.
WAITING_FOR_PROCESSINGThe request is still being prepared. Retry after a short delay.
FAILEDA processing error occurred. Check the signature request details for reason.
You can call the signing-link endpoint for a signer whose status is APPROVED — it will still return a view_url so the signer can review the completed document.

Call the endpoint once per signer, passing each signer’s email address. Each call returns an independent view_url.
# Link for signer 1
curl -X POST https://api.luminpdf.com/v1/signature_request/696d007913f3b8.../signing-link \
  -H "Authorization: API-key <your-key>" \
  -H "Content-Type: application/json" \
  -d '{ "signer_email": "[email protected]" }'

# Link for signer 2
curl -X POST https://api.luminpdf.com/v1/signature_request/696d007913f3b8.../signing-link \
  -H "Authorization: API-key <your-key>" \
  -H "Content-Type: application/json" \
  -d '{ "signer_email": "[email protected]" }'

Email delivery and embedded signing together

Embedded signing does not suppress Lumin’s email notifications. If you want both:
  • Leave email delivery on — signers can choose to sign via email or via your embedded link.
  • If you want to handle the experience entirely within your app, inform signers through your own messaging and rely on the signing link rather than the Lumin email.
Use the signature_request_approved webhook event to trigger next steps in your app — such as unlocking a feature or showing a completion screen — as soon as all signers are done.