01Upload the document
A PDF, or photos of a paper document. Or start from a template with names, dates and prices already filled in.
Upload a PDF, drag a box where people sign, send. Clients, partners and staff sign in a minute, in their own language, with no account. You see who has signed and get a sealed PDF anyone can check.
No password: you sign in with a code sent to your e-mail.
Built for people who are rarely at a desk. Everything is a click, a drag or a tap.
A PDF, or photos of a paper document. Or start from a template with names, dates and prices already filled in.
Pick the person, drag a Signature box onto the page. On a phone you just tap. Choose who signs first, second, or everyone at once.
PenlyDoc e-mails each person, reminds the slow ones and tells you the moment it is done. Everyone gets the signed PDF.
Every finished document carries the evidence with it, so you never have to dig through e-mails.
A PAdES digital seal. Change one letter and every PDF reader shows it.
Who signed, when, from which device and IP, added as the last page.
Every step is chained by a hash. A deleted or changed entry breaks the chain.
A lawyer or auditor drops the PDF on the public check page. No account needed. Try it
One request with your API key sends a document from a template. Signed events arrive by webhook. Or show the signing page right inside your app.
# your API key: Developers → API keys (sk_…)
export PENLY_API_KEY=sk_...
# send a document from a template
curl -X POST https://sign.yourcompany.com/v1/templates/$TPL/envelopes \
-H "Authorization: Bearer $PENLY_API_KEY" \
-H "Idempotency-Key: order-42" \
-H "Content-Type: application/json" \
-d '{"send": true,
"roles": {"client": {"name": "Anna Becker",
"email": "anna@example.com"}},
"data": {"Price": "4 800 EUR"}}'
# then, on your server
POST /webhooks/penly envelope.completed
// your API key: Developers → API keys (sk_…)
const res = await fetch(`https://sign.yourcompany.com/v1/templates/${tpl}/envelopes`, {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.PENLY_API_KEY}`,
'Idempotency-Key': 'order-42',
'Content-Type': 'application/json'
},
body: JSON.stringify({
send: true,
roles: { client: { name: 'Anna Becker', email: 'anna@example.com' } },
data: { Price: '4 800 EUR' }
})
});
const envelope = await res.json(); // save envelope.id
# your API key: Developers → API keys (sk_…)
import os, requests
r = requests.post(
f"https://sign.yourcompany.com/v1/templates/{tpl}/envelopes",
headers={"Authorization": f"Bearer {os.environ['PENLY_API_KEY']}",
"Idempotency-Key": "order-42"},
json={"send": True,
"roles": {"client": {"name": "Anna Becker",
"email": "anna@example.com"}},
"data": {"Price": "4 800 EUR"}})
envelope = r.json() # save envelope["id"]
Create the organisation, invite your team, upload a PDF. About five minutes.