SafeSign's integration API lets your app fill any document template with your own data, confirm it in your own UI, and send it for signature — customers sign on SafeSign, your users never leave your product.
See how it works Request an API keyOne API, any template. You bring the data; SafeSign handles the documents, signing, and audit trail.
Send values by field name to any template — no per‑template code. New templates work automatically.
Create pre‑filled drafts and render them in your UI so a user can review every document before it goes out.
Prepare a whole packet (e.g. 5 documents) from a single call and send them together.
Your team stays in your app. Only the signer visits SafeSign to sign.
ESIGN/UETA‑compliant signatures with a tamper‑evident audit trail and certificate of completion.
Get notified when a document is signed so your app can update status automatically.
Discover → fill → preview → send.
GET /send/templates/{id}/fields tells your app exactly which field names to supply (the prefillable ones). Do this once per template.
POST /send/batch with your data + the signer. SafeSign fills the template(s) and returns drafts — no email is sent yet.
Show the filled document(s) to your user via GET /send/preview/{id} (a rendered PDF) — a safe preview with nothing sent. They review and approve.
POST /send/confirm dispatches the signing request to the customer. They sign on SafeSign; you receive a completion webhook.
Base URL https://safesign.work/send. Authenticate every request with a bearer key.
Authorization: Bearer <YOUR_API_KEY>
Fill one or more templates with your data and create drafts (no email sent). Returns a submission_id and preview_url per document, plus any unmapped_data_keys.
curl -X POST https://safesign.work/send/batch \
-H "Authorization: Bearer $KEY" -H "Content-Type: application/json" -d '{
"sender_name": "Jane Rep",
"signers": { "Customer": { "name": "Sam Homeowner", "email": "sam@example.com" } },
"documents": [
{ "template": "Install Agreement",
"data": { "totalSystemSize": "14.2 kW", "StreetAddress": "456 Solar Rd" } }
]
}'
Preview a document before sending. Returns the filled document as a PDF. Fetch it
right after /send/batch to render a review screen — the signer is NOT emailed until you
call /send/confirm, so this is a safe, no‑send preview.
Dispatch the signing request(s) to the signer(s), after the user confirms. Body: { "submission_ids": [6,7,8] }.
Discover which fields to map. Returns every field on a template. The ones with
"prefillable": true are exactly the values your app supplies in the data object
of /send/batch (keyed by name). Fields owned by a signer role are filled by that signer
at signing time, not by your app.
GET https://safesign.work/send/templates/42/fields
{
"template": "Install Agreement",
"roles": ["Brighthouse Representative", "Customer", "HIS Signer"],
"fields": [
{ "name": "totalSystemSize", "type": "text", "required": true, "prefillable": true, "role": "Brighthouse Representative" },
{ "name": "batteryCost", "type": "number", "required": false, "prefillable": true, "role": "Brighthouse Representative" },
{ "name": "Customer Signature","type":"signature","required": true,"prefillable": false, "role": "Customer" }
]
}
// -> your app maps the two prefillable fields into /send/batch "data"; "Customer Signature" is signed, not mapped.
List all available templates: [{ id, name, roles }] — use the id with the fields endpoint above.
GET /send/templates/{id}/fields to learn the mappable
keys → 2) POST /send/batch with your data → 3) GET /send/preview/{id} to confirm →
4) POST /send/confirm to send. Your API key authorizes a single application; SafeSign's signing
credentials remain server‑side and are never exposed to client apps.Integration API keys are issued per application. Contact the SafeSign administrator to request a key and your completion‑webhook setup.
Request an API key Go to SafeSign