One POST, and the paperwork runs itself.
Send a template you already drew. We chase the signatures, and your server hears about every one.
10 documents a month free · The key works the moment you make it · No card required
- 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.
Step 1
Create a key
Developers → new key. It works immediately - no sandbox, no review to wait for.
Step 2
Draw a template once
Upload the PDF, place the fields, name the roles. The fiddly part stays visual.
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.
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.