
Firma.dev
Documents & ProductivityE-signature API for embedding signing into your product or sending contracts at scale. Pay-as-you-go at €0.049 per envelope, no monthly minimums or per-seat fees.
📚 Documentation & Examples
Everything you need to integrate with Firma.dev
🚀 Quick Start Examples
// Firma.dev API Example
const response = await fetch('https://firma.dev', {
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_API_KEY'
}
});
const data = await response.json();
console.log(data);Firma.dev
Firma.dev is an e-signature API for embedding legally binding signing into your own product or sending contracts at scale. You create templates, send signing requests (envelopes) to recipients, and either let Firma email them or embed the signing experience directly in your app — no redirects and no Firma account needed for signers. Pricing is pay-as-you-go at €0.049 per envelope (about 5 US cents), with no subscriptions, monthly minimums, or per-seat fees.
Base URL: https://api.firma.dev/functions/v1/signing-request-api · Docs: docs.firma.dev · Website: firma.dev
Authentication
Every request needs an API key in the Authorization header. The Bearer prefix is optional — both Authorization: YOUR_API_KEY and Authorization: Bearer YOUR_API_KEY are accepted.
Each workspace has two keys:
- Live key — runs normally and consumes credits.
- Test key — doesn't consume credits; signing requests it creates are flagged as test and watermarked. Use it while you integrate.
Sign up free at firma.dev — no credit card required. Keep both keys server-side; the test key has the same access scope as the live one.
Your First Request
List the templates in your workspace:
curl "https://api.firma.dev/functions/v1/signing-request-api/templates" \
-H "Authorization: Bearer YOUR_API_KEY"
Send a document for signature (Python)
POST /signing-requests/create-and-send creates the request and emails the recipients in one call:
import os
import requests
resp = requests.post(
"https://api.firma.dev/functions/v1/signing-request-api/signing-requests/create-and-send",
headers={"Authorization": f"Bearer {os.environ['FIRMA_API_KEY']}"},
json={
"template_id": "tmpl_123",
"name": "NDA - Acme Corp",
"recipients": [
{
"first_name": "Alice",
"last_name": "Johnson",
"email": "alice@example.com",
"designation": "Signer",
"order": 1,
}
],
},
)
resp.raise_for_status()
print(resp.json())
Common mistake:
POST /signing-requests(without/create-and-send) only creates a draft and never emails anyone. Call.../sendon the draft later, or usecreate-and-sendfrom the start.
TypeScript SDK
npm install @firma-dev/sdk
import { FirmaClient } from "@firma-dev/sdk";
const firma = new FirmaClient({ apiKey: process.env.FIRMA_API_KEY });
const templates = await firma.templates.listTemplates();
console.log(templates);
The SDK is generated from Firma's OpenAPI spec, so every endpoint is a typed method (firma.templates, firma.signingRequests, firma.webhooks, …).
Key Concepts
| Concept | What it is |
|---|---|
| Templates | Reusable documents with predefined fields and layouts |
| Signing requests | An envelope sent to recipients, created from a template or an uploaded PDF/DOCX |
| Recipients | first_name, email and a designation of Signer, CC or Approver; order sets sequential signing |
| Workspaces | Isolated environments, each with its own templates, documents, usage and API keys — one per customer in a multi-tenant app |
| Webhooks | Real-time events for the document lifecycle (e.g. signing_request.sent) |
For documents near 5 MB, upload first and pass a document_id instead of inline base64 — large inline payloads can fail with a 502 before validation.
Embedding & White-Labeling
- Embeddable signing — signers complete documents inside your app.
- Embeddable template and signing-request editors — authenticated with short-lived JWT tokens generated server-side.
- White labeling — custom branding, email domains and email templates.
Rate Limits
Limits are enforced per API key (that is, per workspace), and accounts can have unlimited workspaces:
| Operation | Limit |
|---|---|
| Read (GET) | 200 requests/min |
| Write (POST/PUT/PATCH/DELETE) | 120 requests/min |
| Webhook create/update/delete | 60 requests/min |
| Webhook test | 10 requests/min |
Responses carry X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset; a 429 includes Retry-After.
Compliance & Data Residency
Signatures are ESIGN Act, UETA, eIDAS (SES/AES) and UK eIDAS compliant, with audit trails that record timestamps and IP addresses. Firma lists SOC 2, GDPR and ISO 27001, and data is stored in the EU only (AWS Paris).
MCP Servers for AI Assistants
- Data MCP —
https://mcp.firma.dev/mcp(OAuth): manage templates, create signing requests and configure workspaces from Claude, ChatGPT, Cursor and more. - Docs MCP —
https://docs.firma.dev/mcp(no auth): gives coding assistants the full docs and API reference.
claude mcp add --transport http firma-api https://mcp.firma.dev/mcp
Use Cases
- SaaS platforms — add contract signing to your product without sending users to a third-party site
- Marketplaces & HR tools — offer letters, NDAs and agreements at volume
- Multi-tenant apps — a branded, isolated workspace per customer
- AI-built apps — guides for Lovable, v0, Supabase, Replit and other builders








