Sign Officially

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/envelopesList envelopes. Filter with ?status=sent.
GET /v1/envelopes/{id}Status, people, fields and audit trail.
POST /v1/envelopes/{id}/remindEmail everyone whose turn it is.
POST /v1/envelopes/{id}/voidCancel. Body: {"reason": "..."}
GET /v1/envelopes/{id}/final.pdfThe signed PDF, once a participant has opened the completed document.
GET /v1/envelopes/{id}/auditAudit events with chain verification.
GET /v1/templatesYour 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.