Developers
API documentation
Everything the dashboard does, you can do over HTTPS. Compatible with DocuSeal’s API shape, so SDKs and existing integrations port with a base-URL change.
Authentication
Create a key under API keys. Send it on every request as X-Auth-Token. All responses are JSON; errors look like {"error":"…"} with a 4xx/5xx status.
curl https://sign.airosofts.com/api/v1/me -H "X-Auth-Token: as_live_…"
Templates
- GET/api/v1/templatesList templates (?archived=true to include archived)
- GET/api/v1/templates/:idTemplate with documents + fields
- POST/api/v1/templates/htmlCreate from HTML with field tags
- POST/api/v1/templates/pdfCreate from a PDF (JSON base64 or multipart) with field geometry
- PUT/api/v1/templates/:idRename / replace fields
- POST/api/v1/templates/:id/cloneDuplicate
- GET/api/v1/templates/:id/documentDownload the source PDF
- DELETE/api/v1/templates/:idArchive
POST /api/v1/templates/html
{
"name": "Subcontractor Agreement",
"html": "<p>Name: <text-field name=\"Contractor Name\" role=\"Contractor\" required=\"true\" style=\"width:220px\"></text-field></p>
<signature-field name=\"Signature\" role=\"Contractor\" required=\"true\" style=\"width:240px;height:60px\"></signature-field>"
}Field geometry uses page fractions: { page: 0, x: 0.1, y: 0.82, w: 0.3, h: 0.06 } — the same coordinates the builder saves, so a template made in the UI and one posted via API are interchangeable.
Submissions (send for signature)
- POST/api/v1/submissionsCreate from a template and email signers
- POST/api/v1/submissions/htmlOne call: render HTML → template → send
- GET/api/v1/submissionsList (?status=&template_id=&external_id=&after=)
- GET/api/v1/submissions/:idDetail incl. submitters, documents, audit events
- GET/api/v1/submissions/:id/documentsSigned PDF (?kind=source for the original)
- DELETE/api/v1/submissions/:idArchive
POST /api/v1/submissions
{
"template_id": "…",
"order": "sequential", // or "parallel" (default)
"send_email": true,
"completed_redirect_url": "https://southerninvestment.co/work-with-us/done",
"bcc_completed": "office@southerninvestment.co",
"expire_at": "2026-10-01T00:00:00Z",
"external_id": "monday-item-123",
"submitters": [
{ "role": "Contractor", "email": "jo@example.com", "name": "Jo Ortiz",
"fields": [ { "name": "Contractor Name", "default_value": "Jo Ortiz", "readonly": true } ] },
{ "role": "Company", "email": "roland@southerninvestment.co", "send_email": false }
]
}
→ 201 { "id": "…", "status": "pending",
"submitters": [ { "id": "…", "slug": "…", "embed_src": "https://…/s/<token>", "status": "sent" }, … ] }Use embed_src to open the signing page yourself (redirect, iframe, or the web component below) instead of emailing.
Submitters
- GET/api/v1/submittersList (?submission_id=&status=&email=)
- GET/api/v1/submitters/:idOne submitter with values
- PUT/api/v1/submitters/:idChange email/name, prefill values, send_email:true to re-send
Embedding the signing form
<script src="https://sign.airosofts.com/embed.js"></script>
<airosign-form data-src="https://sign.airosofts.com/s/TOKEN"></airosign-form>
<script>
document.querySelector("airosign-form").addEventListener("completed", (e) => {
console.log("signed", e.detail); // { submitter_id, submission_id, all_completed }
});
</script><docuseal-form> is registered as an alias, so existing DocuSeal embeds keep working. Events: load, completed, declined.
Webhooks
Events: form.viewed · form.started · form.completed · form.declined · submission.created · submission.completed · submission.expired · submission.archived · template.created · template.updated · template.archived. Payload: { event_type, timestamp, data }. Headers webhook-id, webhook-timestamp, webhook-signature (v1,base64(hmac_sha256(secret, id.ts.body))). Non-2xx responses retry at 1, 5, 15, 60, 240 and 720 minutes.
Verification
Every completed document has a public page at /verify/:submission_id (also printed on the certificate page) that re-computes the audit hash chain and lets anyone compare a PDF’s SHA-256 against the sealed original. GET /api/verify/:id returns the same as JSON.
Signer-side API
The signing page is driven by /api/sign/:token/* (state, document, values, signature, complete, decline, otp). These accept only the signed link token — no API key — so you can build a fully custom signing UI if you need one.