Documentation Index
Fetch the complete documentation index at: https://docs.spitshake.io/llms.txt
Use this file to discover all available pages before exploring further.
Frequently Asked Questions
How do I test without sending real emails?
DocuTrust supports a test mode that suppresses email delivery while still creating submissions and signing URLs. To use test mode:- When creating a submission via the API, set the
send_emailoption tofalse:
- Retrieve the signing URL from the submission response and open it directly in your browser:
What file formats are supported?
DocuTrust supports the following formats for template documents:| Format | Extension | Notes |
|---|---|---|
.pdf | The primary format. Supports multi-page documents. Fields are placed on the PDF pages. | |
| Microsoft Word | .docx | Converted to PDF on upload. The original DOCX is stored alongside the converted PDF. |
| HTML | .html | Rendered to PDF. Useful for dynamically generated documents and templates with complex layouts. |
Can multiple people sign one document?
Yes. DocuTrust supports both sequential and parallel multi-signer workflows.Sequential Signing
Submitters sign in a defined order. Each submitter receives their signing invitation only after the previous submitter completes their fields.Parallel Signing
All submitters receive their signing invitations simultaneously and can sign in any order.How do I pre-fill form fields?
Use thevalues object when creating a submission to pre-fill fields for a submitter. The keys are the field names defined in your template schema:
Is my data encrypted?
Yes. DocuTrust encrypts data at multiple layers: At rest:- All documents (PDFs, DOCX, HTML) are encrypted with AES-256-GCM before being written to storage. Each file has a unique initialization vector.
- Submitter PII (email, name, phone, IP address, user agent, submitted values, metadata) is encrypted in the database using Active Record Encryption.
- Email addresses use deterministic encryption (enabling lookups), while all other fields use non-deterministic encryption (maximum privacy).
- All connections use TLS 1.2+. Older TLS versions and unencrypted HTTP are rejected.
- Webhook deliveries to your endpoints are sent over HTTPS.
- Three separate encryption keys for documents, database fields, and configuration.
- Keys are rotatable with zero downtime via the
KeyRotationService. - HKDF derivation fallback from
SECRET_KEY_BASEif explicit keys are not set.
Do you support webhooks?
Yes. DocuTrust supports 14 webhook event types with HMAC-SHA256 signed payloads for verification.Supported Events
| Event | Trigger |
|---|---|
submission.created | A new submission is created. |
submission.sent | A submission is sent to submitters. |
submission.completed | All submitters have completed a submission. |
submission.expired | A submission has passed its expiration date. |
submission.archived | A submission is archived. |
submitter.sent | An email invitation is sent to a submitter. |
submitter.opened | A submitter opens the signing link. |
submitter.completed | A submitter completes their fields. |
submitter.declined | A submitter declines to sign. |
template.created | A new template is created. |
template.updated | A template is modified. |
document.generated | A signed PDF document is generated. |
form.started | A submitter begins filling out a form. |
form.completed | A submitter finishes filling out a form. |
Payload Verification
Every webhook payload includes anX-DocuTrust-Signature header containing an HMAC-SHA256 signature computed from the payload body and your webhook secret:
Can I embed signing in my app?
Yes. DocuTrust offers three approaches for embedding the signing experience:1. Iframe Embedding
Embed the signing page directly in your application using an iframe:postMessage:
2. Redirect Flow
Redirect the signer to the DocuTrust signing page, then back to your application on completion:redirect_url with query parameters indicating the result.
3. API-Driven
Create submissions and retrieve signing URLs entirely via the API, giving you full control over the user experience:- Create a submission via
POST /api/submissions. - Extract the
signing_urlfrom each submitter in the response. - Present the URL to the signer in your own UI (link, button, or iframe).
- Receive a webhook when the submitter completes signing.
What happens when a submission expires?
When a submission passes itsexpire_at timestamp:
- The submission status changes to expired.
- All submitters who have not yet completed their fields have their status changed to expired.
- Submitters who have already completed their fields retain their completed status.
- Expired submitters are notified via email that the signing request has expired.
- The signing URL returns an expiration notice instead of the signing form.
- A
submission.expiredwebhook event is fired.
expire_at when creating the submission: