legesis exposes the entire signing surface as a typed REST API, signed webhooks, and an embeddable signing iframe — the same primitives we build on.
Four moves, one tidy trail.
One endpoint to create.
Post a document and a list of recipients, get back an envelope ID and a signing URL. Works equally well for ad-hoc sends and automated workflows.
curl https://app.legesis.com/api/v1/envelopes \
-H "Authorization: Bearer $API_KEY" \
-d '{
"documents": [{ "url": "https://..." }],
"recipients": [{
"name": "Elena Rivas",
"email": "elena@atwater.law",
"role": "signer"
}]
}'Typed webhooks, HMAC-signed.
Fifteen event types, each with a stable JSON schema. HMAC-SHA256 signatures; three-attempt exponential backoff; a replay endpoint for the bad days.
{
"id": "evt_01h9k…",
"type": "envelope.signed",
"created": 1712923443,
"data": {
"envelope_id": "env_01h9k…",
"signer": "elena@atwater.law",
"sealed_at": "2025-04-12T14:04:02Z"
}
}Drop the iframe in.
Embed the signing experience directly in your product. Inherits your host CSP, passes signing events via postMessage, handles focus and keyboard like a native surface.
<iframe src="https://sign.legesis.com/e/<signing_token>" allow="clipboard-write" className="h-[720px] w-full" />
Events bubble up via postMessage: legesis:sign-complete
SDKs in the languages you use.
TypeScript, Python, Ruby, Go, PHP. All auto-generated from OpenAPI, all idiomatic, all with retries and pagination baked in.
import { Legesis } from "@legesis/node";
const lg = new Legesis(process.env.LEGESIS_KEY!);
const env = await lg.envelopes.create({
documents: [{ url }],
recipients: [{ name, email, role: "signer" }],
});Numbers the team actually checks.
All typed and documented
TS, Python, Ruby, Go, PHP
Measured over the trailing 90 days
Across all regions
A platform, not just endpoints.
Every API call is scoped to a workspace and an API key, audit-logged with the same rigour as signing events. Keys are roleable, rotatable, and IP-restrictable. Rate limits are published and generous.
For regulated deployments, we support mTLS authentication, private webhook delivery via AWS PrivateLink, and region-pinned processing (EU, US, APAC) on Enterprise.
Before you write it in.
- REST with JSON bodies, following the Stripe-style resource-and-verb convention. No custom RPC, no GraphQL layer — intentionally boring so that it's predictable.
Five free envelopes, no credit card. You can upgrade, downgrade, or walk away — we designed it that way.
No card required · 5 free envelopes · Cancel anytime.