Embed PDF signing into your web app

Drop-in (86kb) React component for PDF form building and document signing. No backend required — everything runs in the browser. Your documents never leave the device for maximum privacy and security.

How it works

1

Design your template

Open a PDF and drag form fields onto it — text inputs, signatures, checkboxes, dates, and initials. Assign fields to signer roles.

2

Embed on your site

Add our script to your page and call Exeq.sign(). Pass your PDF template URL and field definitions — no iframes, no CORS issues.

3

Collect signatures

Your users fill and sign the document. The completed PDF is generated client-side and posted to your callback URL.

Private by design

PDFs are processed entirely in the browser using client-side JavaScript. Your documents are never uploaded to our servers or any third party. No data leaves the device — signing, form filling, and PDF generation all happen locally.

Everything you need

Multi-party Signing

Sequential signing flow — each signer completes their fields before the next begins. Fully prefilled signers are auto-skipped.

Mail Merge

Pre-fill fields programmatically with initialValues. Batch-generate hundreds of documents with createPdfBuilder.

Formulas & Transforms

Derive fields from other fields — extract month, year, initials, last 4 digits. Ship built-in transforms or register your own.

Dropdown & Options

Predefined option lists render as dropdowns. Set options in the designer or pass them in the template JSON.

Pixel-perfect Output

Preview matches PDF output exactly — same point-based coordinate system, font sizing, and letter spacing.

Multiple Fonts

Helvetica, Courier New, and Times New Roman with configurable font size, letter spacing, and line height.

Undo / Redo

Full undo history in the designer. Cmd+Z / Cmd+Y with intelligent batching — drags undo as a single step.

Multi-select & Align

Shift-click, Cmd-click, Ctrl+A, or drag a marquee to select. Align edges, distribute evenly, move as a group.

Zoom & Pan

Ctrl+scroll to zoom, spacebar to pan. Slider, keyboard shortcuts, and preset dropdown.

Snap Guides

Hold Shift while dragging to see alignment guides and snap to nearby field edges and centers.

Copy & Paste

Cmd+C / Cmd+V to duplicate fields. Pasted fields inherit all properties with offset positioning.

Field Locking

Lock fields to prevent accidental moves or deletes. Visual hatch pattern and lock icon in the field list.

Sticky Styles

Style changes (font, size, color, dimensions) become the default for the next field of the same type.

Audit Trail

Optionally append a signed audit trail page to the final PDF documenting each signer and timestamp.

JSON & CSV Export

Export filled field values alongside the PDF as structured JSON or CSV via the onExport callback.

Real-time Callbacks

onChange fires on every field change. onSignerComplete fires when each signer finishes.

Redaction

Blackout and whiteout fields for permanent redaction — rendered directly into the PDF, not just visual overlays.

Tiny Bundle

~86kb gzipped. No external dependencies at runtime. Works with React 18+ or as a standalone script via CDN.

Pricing

Open Source

Free

no limits

  • Unlimited documents
  • All field types
  • Multi-signer support
  • Client-side PDF generation
  • npm package or script embed
  • Self-hosted — your infrastructure
Get Started

Enterprise

Custom

contact us

  • Server-side PDF processing
  • Signing audit trail appended to PDF
  • Third-party signature verification
  • Managed document storage
  • Custom branding & white-label
  • Priority support & SLA
Contact Us

Quick Start

1npm install @unlev/exeq
1import { DesignerView, SignerView } from '@unlev/exeq';
2import '@unlev/exeq/styles';
3
4// Template editor
5<DesignerView
6  apiKey="your-api-key"
7  initialPdfUrl="/contracts/blank.pdf"
8  onSave={(template) => { /* store template */ }}
9/>
10
11// Signing UI
12<SignerView
13  apiKey="your-api-key"
14  initialPdfUrl="/contracts/template.pdf"
15  initialTemplate={template}
16  initialSigner="Signer 1"
17  onComplete={(blob) => { /* upload signed PDF */ }}
18/>
Full Documentation