Developers
Send documents for signature from your own software.
A small REST API with API keys and signed webhooks. Part of the Business plan. Create keys under Developers in your dashboard.
Authentication
Send your key as a Bearer token. Keys start with so_live_. Keep them on your server, never in a browser or app.
curl https://signofficially.com/v1/me \ -H "Authorization: Bearer so_live_..."
Create an envelope from a template
Templates define the document, roles and field positions. You supply the people for each role.
curl -X POST https://signofficially.com/v1/envelopes \
-H "Authorization: Bearer so_live_..." \
-H "Content-Type: application/json" \
-d '{
"template": "TEMPLATE_ID",
"title": "Service agreement - Acme",
"recipients": {
"0": {"name": "Priya Raman", "email": "priya@example.com"},
"1": {"name": "Daniel Okafor", "email": "daniel@example.com"}
}
}'
Create an envelope from a PDF
Upload a PDF and describe the people and fields. Field positions are fractions of the page (0 to 1, from the top-left).
curl -X POST https://signofficially.com/v1/envelopes \
-H "Authorization: Bearer so_live_..." \
-F "file=@contract.pdf" \
-F 'meta={"title":"Contract","recipients":[{"ref":"a","name":"Priya Raman","email":"priya@example.com"}],
"fields":[{"recipient":"a","type":"signature","page":1,"x":0.55,"y":0.80,"w":0.30,"h":0.06},
{"recipient":"a","type":"date","page":1,"x":0.55,"y":0.87,"w":0.20,"h":0.04}]}'
Other endpoints
GET /v1/envelopes | List envelopes. Filter with ?status=sent. |
GET /v1/envelopes/{id} | Status, people, fields and audit trail. |
POST /v1/envelopes/{id}/remind | Email everyone whose turn it is. |
POST /v1/envelopes/{id}/void | Cancel. Body: {"reason": "..."} |
GET /v1/envelopes/{id}/final.pdf | The signed PDF, once a participant has opened the completed document. |
GET /v1/envelopes/{id}/audit | Audit events with chain verification. |
GET /v1/templates | Your templates and their roles. |
Webhooks
We POST JSON to your URL for envelope.sent, envelope.viewed, envelope.signed, envelope.completed, envelope.sealed, envelope.declined, envelope.voided and envelope.expired. Each request carries X-SignOfficially-Signature: t=TIMESTAMP,v1=HMAC, where HMAC is SHA-256 over TIMESTAMP.BODY with your webhook secret. Reject requests older than five minutes. Failed deliveries are retried for a day with growing delays.
Privacy note
Documents uploaded through the API are encrypted by our servers on arrival, so unlike the browser, the server sees the PDF for a moment. Private (end-to-end) mode is browser-only.