Developers
Integration guide
One real customer flow, end to end. Every snippet already carries the shared sandbox key, so you can paste it into a terminal and watch it run. Swap in your own key when you go live.
1. Authenticate
Every call carries a bearer key. Test keys (sk_test_) never send email; live keys (sk_live_) must stay server-side.
curl /api/public/v1/ping \ -H "Authorization: Bearer sk_test_sandbox0000publicdemo01"
2. Upload the contract
Upload a PDF (or image) as multipart form data. The file is stored privately and never made public.
curl -X POST /api/public/v1/documents \ -H "Authorization: Bearer sk_test_sandbox0000publicdemo01" \ -H "Idempotency-Key: $(uuidgen)" \ -F "[email protected]" \ -F "title=Mutual NDA"
3. Detect the empty fields
Deterministic analysis (text extraction, AcroForm, line and box geometry) suggests where signatures, dates and names belong. No generative AI is involved and the file is never modified.
curl -X POST /api/public/v1/documents/DOCUMENT_ID/analyze-fields \ -H "Authorization: Bearer sk_test_sandbox0000publicdemo01"
4. Create the signature request
Attach recipients in signing order. Send an Idempotency-Key so a retried call never creates a duplicate request.
curl -X POST /api/public/v1/signature-requests \ -H "Authorization: Bearer sk_test_sandbox0000publicdemo01" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: $(uuidgen)" \ -d '{ "document_id": "DOCUMENT_ID", "title": "Mutual NDA", "recipients": [{ "name": "Dana Lee", "email": "[email protected]", "order": 1 }] }'5. Place the fields
Coordinates are normalised (0–1) against the page box, so they render identically at any zoom or screen size.
curl -X POST /api/public/v1/signature-requests/REQUEST_ID/fields \ -H "Authorization: Bearer sk_test_sandbox0000publicdemo01" \ -H "Content-Type: application/json" \ -d '{ "recipient_email": "[email protected]", "fields": [ { "type": "signature", "page": 1, "x": 0.12, "y": 0.78, "width": 0.28, "height": 0.06 }, { "type": "date", "page": 1, "x": 0.62, "y": 0.78, "width": 0.18, "height": 0.04 } ] }'6. Send it
Sending locks the field layout and issues one signing link per recipient. In test mode links are returned in the response instead of emailed.
curl -X POST /api/public/v1/signature-requests/REQUEST_ID/send \ -H "Authorization: Bearer sk_test_sandbox0000publicdemo01"
7. Or embed signing in your own app
Create a short-lived embedded session and render its URL in an iframe. The frame posts a message to your parent window when signing completes.
curl -X POST /api/public/v1/signature-requests/REQUEST_ID/embedded-session \ -H "Authorization: Bearer sk_test_sandbox0000publicdemo01" \ -H "Content-Type: application/json" \ -d '{ "recipient_email": "[email protected]", "redirect_url": "https://your-app.com/signed" }'8. Listen for the result
Register an HTTPS endpoint with your own key (the shared sandbox key is read-only for webhooks), verify the HMAC-SHA256 signature over the raw body, then act on the event. Failed deliveries retry after 1, 5, 30, 120 and 720 minutes.
curl -X POST /api/public/v1/webhooks \ -H "Authorization: Bearer sk_test_sandbox0000publicdemo01" \ -H "Content-Type: application/json" \ -d '{ "url": "https://your-app.com/hooks/sign10x", "events": ["signature_request.completed", "signature_request.voided"] }'9. Fetch the signed PDF
Once every recipient is done, download the flattened copy. The original upload is never altered.
curl /api/public/v1/signature-requests/REQUEST_ID/completed-document \ -H "Authorization: Bearer sk_test_sandbox0000publicdemo01"
Official SDKs
The same flow, wrapped with retries, idempotency keys, typed errors and webhook verification.
JavaScript / TypeScript
npm install @sign10x/sdkPython
pip install sign10xPHP
composer require sign10x/sign10x-php