API keys on every plan

One POST, and the paperwork runs itself.

Send a template you already drew. We chase the signatures, and your server hears about every one.

Read the reference

10 documents a month free · The key works the moment you make it · No card required

deploy@yourproduct — bash
$
  • One POST sends a template
  • Webhooks signed with HMAC
  • Retried for a day until you 2xx
  • Included on both plans

Getting started

Three things, and only one of them is code

The document, the fields and the signing order live in a template. Your backend never has to touch a PDF.

  1. Step 1

    Create a key

    Developers → new key. It works immediately - no sandbox, no review to wait for.

  2. Step 2

    Draw a template once

    Upload the PDF, place the fields, name the roles. The fiddly part stays visual.

  3. Step 3

    POST the send

    A template id, a title, and who each role goes to. Everything else was decided already.

const res = await fetch("https://putmysign.com/v1/templates/tpl_9f3c/send", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.PUTMYSIGN_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    title: "NDA — Acme Corp",
    recipients: [
      { role_id: "role_a1", email: "dana@acme.com", name: "Dana Ruiz" },
    ],
  }),
});

if (!res.ok) throw new Error((await res.json()).error.message);
const document = await res.json();

That is the request in full. The response carries the document id and a row per signer.

Webhooks

You find out without asking

Every step is posted to your endpoint, signed so you can prove it came from us. Nothing to poll, nothing lost while you were down.

import crypto from "node:crypto";

export function verify(rawBody, header, secret) {
  const { t, v1 } = Object.fromEntries(
    header.split(",").map((p) => p.trim().split("="))
  );
  const expected = crypto
    .createHmac("sha256", secret)
    .update(`${t}.${rawBody}`)
    .digest("hex");

  // Older than five minutes: someone is replaying yesterday's delivery.
  if (Math.abs(Date.now() / 1000 - Number(t)) > 300) return false;
  return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(v1));
}

Every delivery is signed over the timestamp and the raw body, and the docs page runs this exact function against one you paste in - so a disagreement has an answer without a support thread.

If your server is down

we keep trying for a day
  • 1st tryimmediately
  • 2nd+1 min
  • 3rd+15 min
  • 4th+1 hr
  • 5th+6 hrs
  • last+24 hrs

The same event can therefore reach you twice. Check the event id and ignore one you have already handled.

The surface

Five endpoints, and that is all of it

Small on purpose: the template settles the layout, so the API only carries the send and the status.

  • GET/v1/templatesYour templates, with the role ids to send to.
  • POST/v1/templates/:id/sendSend one. Returns the document.
  • GET/v1/documentsEverything you have sent, newest first.
  • GET/v1/documents/:idStatus of the document and each recipient.
  • GET/v1/documents/:id/fileThe signed PDF, once it is complete.

600

requests / hour

per key, then 429 with Retry-After

5

retries

over roughly a day, until you 2xx

30

min embed URLs

short-lived by design

402

on quota

with the reset date in the body

Embedded signing

Or skip the email entirely

Send with embed: true and you get a signing URL per recipient instead of an invite. Same key, same webhooks.

See embedded signing

Pricing

The API is not the paywall

Keys, webhooks and embedding come with both plans. An API send counts against the same monthly allowance as any other.

Free

$0

Everything you need to get signatures back.

  • 10 documents a month
  • Files kept forever
  • Link expiry up to 30 days

Pro

Recommended

$19/mo

For when the paperwork keeps coming.

  • 100 documents a month
  • Link expiry up to 365 days
  • Reminders

Included on every plan

  • Unlimited recipients per document
  • Files & audit trail kept forever
  • Legally binding signatures
  • Recipients never make an account
  • Tamper-evident audit certificate
  • Unlimited reusable templates

FAQ

Questions about the API

What it can do, what it costs, what breaks.

What does the API actually let me do?

Send one of your saved templates for signature, list your templates, check a document's status, and download the finished PDF. Everything is a plain JSON request with a bearer key.

Do I need a paid plan to use it?

No. API keys are on both plans, and an API send counts against the same monthly allowance as a send from the dashboard - 10 documents a month free.

How do I know when someone signs?

We post a webhook to your endpoint on every step: sent, viewed, signed, declined, commented and completed. Each delivery is signed with HMAC-SHA256 and retried five times over roughly a day until your server replies 2xx.

Do I have to build the document editor?

No. You draw the fields once in a template, and the API send only supplies the title and who each role goes to. That is deliberate: the fiddly part stays visual, and your code stays a single request.

What happens if I run out of documents?

The send comes back 402 with a quota_exceeded code and the reset date in the body, so your job can retry rather than fail silently.

Are there rate limits?

600 requests an hour per key. Past that you get a 429 with a Retry-After header. Keys can be revoked from the Developers page at any time.

Still stuck? support@putmysign.com

Stop building a signing flow

Create a key, point a webhook at your server, send your first document.

Read the reference