Developer APIPro and up

Signing inside your product, not next to it

Short-lived signing tokens render the experience inside your own layout rather than redirecting away. Webhooks retry on a published schedule, carry deduplication IDs, and are HMAC-signed. Every mutating endpoint accepts an idempotency key.

The most requested change in our v3 API was removing the redirect. In v2, embedding meant sending the user to a URL — your product visibly handed off to ours, which is strange when the whole point was keeping users in your application.

v3 issues signing tokens scoped to a single recipient on a single envelope. Mount the embed in an iframe or use the JavaScript SDK, and completion fires a callback in the parent frame rather than a page navigation.

How it works

Step by step

  1. 1

    Create an envelope

    POST a document, recipients, and field definitions — or reference a template and supply only the values. Pass an idempotency key so a network timeout cannot produce a duplicate envelope, which is the failure mode that otherwise sends a counterparty the same contract twice.

  2. 2

    Issue a signing token

    Scoped to one recipient on one envelope, expiring in fifteen minutes by default. It is not a session and cannot be used to enumerate other documents on the account.

  3. 3

    Render the embed

    The signing experience renders inside your layout. Your users never see a domain they do not recognise, and completion is a callback you handle rather than a redirect you have to catch.

  4. 4

    Handle webhooks as the source of truth

    Acknowledge fast, queue, process asynchronously. Verify the HMAC signature against the raw request body before any JSON parsing — parsing and re-serialising changes the bytes and the signature will not match. That is the single most common integration bug we see.

What it supports

Embedded signing with short-lived, single-recipient tokens
Webhooks with 24-hour exponential backoff, event IDs for deduplication, and HMAC-SHA256 signing
Event replay endpoint for the last 30 days
Idempotency keys on every mutating endpoint, retained 24 hours
Cursor pagination and stable machine-readable error codes with request IDs
Sandbox with forced failure modes — bounces, declines, expiries, webhook delivery failures
SDKs for TypeScript, Python, Ruby, and Go, plus an OpenAPI schema
Who it's for

Where this matters most

Availability & limits

Pro and up

API and webhooks on Pro. Embedded signing and higher rate limits are Business.

Worth knowing
  • Rate limits are per-account, not per-key — extra keys do not multiply quota
  • Embedded signing requires Business
  • Signing tokens expire in 15 minutes by default and cannot be extended indefinitely
  • v2 remains supported with no announced end date; deprecation would carry 12 months notice
Compare plans →
Questions

Developer API, specifically

Almost always because the signature is being checked against re-serialised JSON rather than the raw request body. Parsing and re-stringifying changes the bytes. Verify first, parse second.

Works well with

Ready to try it?

Sign a sample document in under a minute — no signup required.

Open the live demo →