↗ · Quickstart
The whole thing, end to end
Upload a contract, place two fields for one signer, send it, then download the signed PDF once it lands. Set KEY to your ss_live_ key and every call reuses it.
# Your key is created under Account → Developer settings (Business plan)
KEY="ss_live_…"
BASE="https://signsail.com/api/v1"
AUTH="Authorization: Bearer $KEY"
# 1. Upload a PDF by URL (or -F [email protected] for multipart)
DOC=$(curl -s -X POST "$BASE/documents" -H "$AUTH" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com/contract.pdf","title":"NDA"}' | jq -r .id)
# 2. Place a signature + date field for signer 1 (coords normalized 0..1)
curl -s -X PUT "$BASE/documents/$DOC/fields" -H "$AUTH" \
-H "Content-Type: application/json" \
-d '{"placements":[
{"recipientRef":1,"fieldType":"SIGNATURE","pageIndex":0,
"x":0.12,"y":0.80,"w":0.25,"h":0.06,"required":true},
{"recipientRef":1,"fieldType":"DATE_SIGNED","pageIndex":0,
"x":0.45,"y":0.80,"w":0.18,"h":0.04,"required":true}
]}'
# 3. Send it. The Idempotency-Key makes a retry safe.
ENV=$(curl -s -X POST "$BASE/envelopes" -H "$AUTH" \
-H "Content-Type: application/json" -H "Idempotency-Key: nda-send-001" \
-d "{\"documentId\":\"$DOC\",\"recipients\":[{\"email\":\"[email protected]\",\"name\":\"Dana\"}]}" | jq -r .id)
# 4. Poll status, then download once it's completed
curl -s "$BASE/envelopes/$ENV" -H "$AUTH" | jq .status
curl -s "$BASE/envelopes/$ENV/pdf" -H "$AUTH" -o signed.pdf
Prefer not to send coordinates? Write tags like {{sig:s1}} into the PDF and Sign Sail places the fields on upload. The full tag grammar, prefill fields, and webhook shapes are in the API & MCP guide.