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. 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. 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. 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. 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. 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. 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. 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. 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. 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/sdk

Python

pip install sign10x

PHP

composer require sign10x/sign10x-php