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.

Michael Beckett
Michael Beckett

Founder, Signbee

What you'll build

By the end of this tutorial, your app will be able to:

  1. Accept document content from your application logic
  2. Send it for legally binding e-signature
  3. 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:

app/api/sign/route.ts
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);
}
Frontend — trigger signing
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

server.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

app.py
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:

Sign an existing PDF
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

  1. Email — Clean message with a "Review & Sign" button
  2. Document preview — Full PDF in the browser, no app download needed
  3. Signature capture — Type their name, choose from handwriting-style fonts
  4. Certificate page — Both signatures, timestamps, IPs, SHA-256 hash
  5. Email delivery — Both parties get the final signed PDF

Comparison: integration effort

StepTypical e-sign APISignbee
Authentication setup1-4 hours (OAuth)30 seconds (API key)
SDK installation15-30 minutesNot needed
Template configuration30-60 minutesNot needed
Webhook setup30-60 minutesNot needed
Total3-6 hours10 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.