Create from your data
Create templates from PDF or HTML, prefill fields with submitters[].values, and send signature requests with the REST API.
SignlyPDF for software companies
Create signature requests through the API, let customers sign inside your app, and receive the result automatically. SignlyPDF handles the document flow around your product.
API access for approved ISV integrations; details are agreed before activation.
Your app stays in control of the customer experience; the API handles the signing flow.
What you can build
Use the pieces your product needs. Every part connects to the same document and signing request.
Create templates from PDF or HTML, prefill fields with submitters[].values, and send signature requests with the REST API.
Use the returned embed URL to show the signing form inside your interface.
Webhooks tell your system when a signer views, completes, or declines a document.
Get links to the signed PDF and audit log in the completion webhook.
For your developers
Start with a template. One request creates the signing flow and returns the URL to embed in your app.
# Copy the whole block into Bash to try the public sandbox
(
set -e
SIGNLY_API_KEY=signly_sandbox_9f3c2a7b1e4d6f58a0c3b7e2d5f91a4c
template_response=$(curl -fsS -X POST https://signlypdf.com/api/templates/html \
-H "X-Auth-Token: $SIGNLY_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"ISV demo","html":"<p>Business name: {{Business name;role=Merchant}}</p><p>Signature: {{Signature;role=Merchant;type=signature}}</p>"}')
[[ $template_response =~ \"id\"[[:space:]]*:[[:space:]]*([0-9]+) ]]
template_id=${BASH_REMATCH[1]}
printf -v request_body '{"template_id":%s,"send_email":false,"submitters":[{"role":"Merchant","email":"customer@example.com","values":{"Business name":"Harbor Bistro LLC"}}]}' "$template_id"
curl -fsS -X POST https://signlypdf.com/api/submissions \
-H "X-Auth-Token: $SIGNLY_API_KEY" \
-H "Content-Type: application/json" \
-d "$request_body"
)
This creates a temporary template and submission without sending email. The Merchant role in the request must match the role in the template exactly, or the API returns 422. Use your approved key and your own template ID for production.
Use embed_src to show the form where your customer already works.
The form.completed payload already contains documents and audit_log_url links to the signed PDF and audit log.
API response
The response is an array. Take embed_src from the signer you want to show in your app.
[
{
"id": 20471,
"submission_id": 8861,
"slug": "pX4ytYbVfQe2Lm",
"email": "customer@example.com",
"role": "Merchant",
"status": "awaiting",
"embed_src": "https://signlypdf.com/apiemb/pX4ytYbVfQe2Lm"
}
]
Integration details
Pass the signer's embed_src from the response to the embed component. It emits completed and declined events for your interface.
<script src="https://signlypdf.com/js/embed.js"></script>
<signlypdf-embed
src="https://signlypdf.com/apiemb/pX4ytYbVfQe2Lm"
width="100%"
height="auto">
</signlypdf-embed>
Subscribe to signer events form.viewed, form.started, form.completed, and form.declined.
Document events include submission.created, submission.completed, submission.expired, submission.archived, template.created, and template.updated.
With a webhook secret configured, deliveries carry X-Signly-Signature (HMAC SHA-256) and X-Signly-Timestamp. See the verification example.
Create a PDF template with POST /api/templates or an HTML template with POST /api/templates/html. HTML field tags such as {{Field;role=Merchant}} set up signer fields.
Prefill them with submitters[].values. For a one-time document, use POST /api/submissions/docx, /html, or /pdf without creating a template first.
After approval, find your API key under Account settings → API. Send it in the X-Auth-Token header from your server.
For testing before approval, use the public signly_sandbox_... key on the developer page. This command uses it directly:
curl https://signlypdf.com/api/templates \
-H "X-Auth-Token: signly_sandbox_9f3c2a7b1e4d6f58a0c3b7e2d5f91a4c"
The default limit is 600 requests per key every 5 minutes. The shared sandbox key has a separate 100-request limit. Read the rate limit details.