Developer platform

E‑signing inside
your product.

Your server mints a short-lived session with a secret key, your page frames it with a 1.5 KB SDK, and your users sign without leaving your product. Build the whole integration on free test keys first.

Test keys on every plan, including Free Your secret key never reaches a browser MIT-licensed SDKs on GitHub
How it works

Three steps, and the secret key
never leaves your server

An embed starts as a session your server mints. Your page frames the URL it gets back, and the frame talks to your code over a pinned postMessage channel.

  1. 1

    Mint a session on your server

    POST /embed_sessions with your secret key, naming the document and the origin of the page that will frame it. You get back an id and a URL that expires.

  2. 2

    Mount it in your page

    Hand the URL to @gingerdocs/embed. It frames the signing experience on our origin, pins the origin and session id on both ends, and hands your code typed events.

  3. 3

    Act on webhooks

    SDK events are UX signals — hide a spinner, show a confirmation. Provision on the signed document.completed webhook; every event stays readable for 90 days.

Your serverNode.js
const res = await fetch('https://api.gingerdocs.com/api/v1/embed_sessions', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.GINGERDOCS_SECRET_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    kind: 'signing',
    document_id: documentId,
    host_origin: 'https://app.example.com',
  }),
})
const { id, url } = await res.json()
Your pageJavaScript
import { mount } from '@gingerdocs/embed'

const embed = mount('#signing', { url, sessionId: id })

embed.on('ready', () => hideLoader())
embed.on('completed', () => showConfirmation())
embed.on('session_expired', async () => {
  const fresh = await refetchSession()
  embed.reload(fresh.url, { sessionId: fresh.id })
})
ReactJSX
import { GingerDocsEmbed } from '@gingerdocs/react'

<GingerDocsEmbed
  url={session.url}
  sessionId={session.id}
  onEvent={event => event.type === 'completed' && showConfirmation()}
/>

Pass the URL verbatim: its fragment carries the session credential, and its query carries what our edge uses to decide who may frame the page.

Three ways to embed

From a single signature
to the full editor

Every embed is a session your server mints. Its kind and mode decide what the person in the frame can do — and the server enforces it on every request, not just in the UI.

kind: signing

Signing session

One signer, one document, inside your page. No email round-trip, no redirect off your site.

  • Read the document, fill their fields, and sign — draw, type, or upload
  • Decline with a reason, which your page hears as an event
  • Download the signed PDF when the ceremony ends
  • Switch the frame's language from its own menu
kind: workspace · mode: minimal

Workspace · minimal

Template-driven creation for one of your own users, without exposing an editor.

  • Browse their usable templates and fill variables and their own inputs
  • Name who sends and who signs — pre-set and locked by you if you like
  • Preview the pages while filling, then create and send
  • Upload a PDF of their own and send it, with the signature field placed for them
kind: workspace · mode: advanced

Workspace · advanced

The same editor the GingerDocs app ships, running on your domain.

  • Upload PDFs and place signature, initials, text, date, and checkbox fields
  • Save drafts and reopen them later
  • Create templates from a PDF and edit the ones they authored
  • Everything in minimal, too

A fourth mode, read_only, shows a finished document or a template with nothing to act on — a viewer you can drop into your own UI.

REST API

The same product,
as endpoints

Everything under https://api.gingerdocs.com/api/v1, authenticated with a bearer API key. Create a user, upload a document, send it, and read what happened — in four calls, from any language.

Conventions you can build on

  • Secret keys for your servers, publishable keys for a read-only browser surface — each scoped to what it needs
  • Two fully separated environments, test and live, on the same endpoints
  • An Idempotency-Key on every POST makes retries safe
  • Errors carry a machine-stable code; messages are display text and may change
  • 120 requests a minute per key, with Retry-After on a 429
  • Defined by an OpenAPI 3.1 contract that every response is validated against
Browse the API reference
Ask the API who you arecURL
curl https://api.gingerdocs.com/api/v1/account \
  -H "Authorization: Bearer gd_sk_test_YOUR_KEY"
ResponseJSON
{
  "environment": "test",
  "scopes": ["documents", "templates", "users", "embed", "webhooks"],
  "plan": { "key": "free", "limit": 30, "used": 12, "remaining": 18 },
  "defaults": { "email_delivery": "platform" }
}

Users

The people in your product that documents belong to, keyed by your own external_id.

Documents

Upload a PDF or instantiate a template, name the signer, follow the status, download the signed copy.

Fields

Signature, initials, text, date, and checkbox fields, placed in normalised page coordinates.

Templates

List, share, and instantiate templates authored in the app or in an advanced workspace.

Sending

We email the signer, or you deliver the signing link yourself and we send nothing at all.

Webhooks & events

Register HTTPS endpoints, read the delivery log, and replay any event from the 90-day log.

v1 has exactly one signer per document — no recipient lists, no signing order, no hand-off.

Built for production

The parts you would
otherwise have to build

Signing is the easy half. The rest — delivery, verification, retries, branding, languages — comes with the platform.

Signed webhooks, 16 event types

HMAC-SHA256-signed deliveries with retries and a delivery log. Every event stays readable for 90 days through the events API, so nothing is lost while your endpoint is down.

A test environment that sends no email

Test keys work on every plan. Output is watermarked and not legally binding, nothing counts against your plan, a test endpoint can simulate the signature so CI can assert COMPLETED, and test data is purged after 90 days.

Your brand colour, your viewport

Pass theme.primary_color when you mint and the frame's buttons, links, and focus rings follow it. An Expand control lets a narrow sidebar embed take over the viewport and hand it back.

Deliver the signing link yourself

Per account or per send, choose whether GingerDocs emails the signer with your branding or your product does — in which case we send nothing and hand you the signing URL.

A certificate that names you

When you deliver the link or admit a signer through an embedded session, the Certificate of Completion names your legal entity as the verifying party — the responsibility you accept in the Integrator Terms.

Six languages in the frame

Signing and workspace frames ship in English, Japanese, Korean, German, Spanish, and French. Set the locale on the session or the mount; a signer can switch from the frame's own menu.

Open source

Two small SDKs, MIT-licensed

The SDK does one thing: it frames the session URL, pins the origin and session id on both ends of the postMessage channel, and hands your code typed events. You can read it in one sitting.

MIT licenseUnder 1.5 KB gzippedZero dependencies

@gingerdocs/embed

Framework-free. mount(), on(), reload(), unmount() — and the Expand protocol, if you would rather build the iframe yourself.

View on GitHub

@gingerdocs/react

A thin React component around the core package: one onEvent handler for every event, safe to pass inline.

View on GitHub
Pricing for developers

Build free. Go live for $100 a year.

Build on test keys — free

Developer Mode and test keys are available on every plan, including Free. The whole integration — create, send, sign, webhook, download — works in the test environment.

Get a test key

Go live on the Developer plan

$100/ year

Everything in Pro with the same 1,000 document uploads a month, plus live API keys, embedded signing on your registered domains, and signed webhooks.

See the Developer plan

Start in test mode today

Sign up for free, switch on Developer Mode under Settings → Developer, and make your first API call in minutes. No credit card required.