April 2026 · Tutorial
How to Add E-Signatures to Any Web App in 10 Minutes
Most e-signature integrations take days. OAuth configuration, SDK installation, template setup, webhook servers. Here's how to skip all of that and ship document signing today.
Founder, Signbee
What you'll build
By the end of this tutorial, your app will be able to:
- Accept document content from your application logic
- Send it for legally binding e-signature
- Deliver a signed PDF with a SHA-256 certificate to both parties
No SDK. No OAuth. No templates. One HTTP endpoint.
Prerequisites
- A Signbee API key (free tier — 5 docs/month, no credit card)
- An app that can make HTTP requests (any language, any framework)
Option 1: Next.js / React
Add a server action or API route that sends documents for signing:
import { NextResponse } from 'next/server';
export async function POST(req: Request) {
const { content, recipientName, recipientEmail } = await req.json();
const response = await fetch('https://signb.ee/api/send', {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.SIGNBEE_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
content,
senderName: 'Your App',
senderEmail: 'contracts@yourapp.com',
recipientName,
recipientEmail,
}),
});
const result = await response.json();
return NextResponse.json(result);
}async function sendContract(recipientEmail: string) {
const res = await fetch('/api/sign', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
content: `# Service Agreement
This agreement is between **YourApp Inc** and **${recipientName}**
for the services described in the attached scope of work.
## Terms
- Payment: Net 30
- Duration: 12 months
- Governing law: State of California`,
recipientName,
recipientEmail,
}),
});
const { id, status } = await res.json();
// Show success UI, save document ID to your database
}Option 2: Express / Node.js
const express = require('express');
const app = express();
app.use(express.json());
app.post('/send-contract', async (req, res) => {
const { content, recipientName, recipientEmail } = req.body;
const response = await fetch('https://signb.ee/api/send', {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.SIGNBEE_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
content,
senderName: 'Your App',
senderEmail: 'contracts@yourapp.com',
recipientName,
recipientEmail,
}),
});
const result = await response.json();
res.json(result);
});
app.listen(3000);Option 3: Python / Flask
from flask import Flask, request, jsonify
import requests
import os
app = Flask(__name__)
@app.route('/send-contract', methods=['POST'])
def send_contract():
data = request.json
response = requests.post(
'https://signb.ee/api/send',
headers={
'Authorization': f'Bearer {os.environ["SIGNBEE_API_KEY"]}',
'Content-Type': 'application/json',
},
json={
'content': data['content'],
'senderName': 'Your App',
'senderEmail': 'contracts@yourapp.com',
'recipientName': data['recipientName'],
'recipientEmail': data['recipientEmail'],
}
)
return jsonify(response.json())Option 4: Use an existing PDF
Already have contract templates as PDFs? Pass a pdf_url instead of content:
const response = await fetch('https://signb.ee/api/send', {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.SIGNBEE_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
pdf_url: 'https://yourapp.com/contracts/nda-template.pdf',
senderName: 'Your App',
senderEmail: 'contracts@yourapp.com',
recipientName: 'Bob Smith',
recipientEmail: 'bob@acme.com',
}),
});Real-world patterns
SaaS onboarding — Send a service agreement when a user upgrades to a paid plan
Freelance marketplace — Auto-generate and send contracts when a proposal is accepted
HR platform — Send offer letters and NDAs during the hiring workflow
Property management — Send lease agreements to tenants for remote signing
AI agents — Let your AI agent handle the entire signing flow via MCP
What the recipient sees
- Email — Clean message with a "Review & Sign" button
- Document preview — Full PDF in the browser, no app download needed
- Signature capture — Type their name, choose from handwriting-style fonts
- Certificate page — Both signatures, timestamps, IPs, SHA-256 hash
- Email delivery — Both parties get the final signed PDF
Comparison: integration effort
| Step | Typical e-sign API | Signbee |
|---|---|---|
| Authentication setup | 1-4 hours (OAuth) | 30 seconds (API key) |
| SDK installation | 15-30 minutes | Not needed |
| Template configuration | 30-60 minutes | Not needed |
| Webhook setup | 30-60 minutes | Not needed |
| Total | 3-6 hours | 10 minutes |
FAQs
Is this legally binding?
Yes. Electronic signatures are legally valid under ESIGN (US), eIDAS (EU), and ECA (UK). Every document includes a SHA-256 certificate.
Which frameworks does this work with?
Any framework that can make HTTP requests. The examples above show Next.js, Express, and Flask, but it works with Rails, Django, Laravel, Go, Rust — any language.
What about more complex signing workflows?
For multi-party signing with conditional routing, see our API comparison guide. DocuSign and Adobe Sign handle those cases.
Related resources
Try Signbee — free tier, no credit card, no setup.