Guides
Tracking and the audit trail
See who opened what, from which link, and every event in order.
Every link is its own
Each email squiggli sends carries a new link: the invite, each reminder, each resend. So when a signer opens a document you know which email got them there. The envelope lists each signer's links:
json
"links": [
{ "id": "lnk_a1", "source": "invite", "sequence": 1, "opens": 0 },
{ "id": "lnk_b2", "source": "reminder", "sequence": 1, "opens": 0 },
{ "id": "lnk_c3", "source": "reminder", "sequence": 2, "opens": 1, "first_opened_at": "2026-11-09T08:42:10.000Z" }
]Sources are invite, reminder (automatic), resend (you called remind) and api (the signing_url the API returns).
The audit trail
bash
curl https://squiggli.billy-965.workers.dev/v1/envelopes/env_.../events -H "Authorization: Bearer $SQUIGGLI_API_KEY"| Event | Recorded when |
|---|---|
envelope.created | The envelope is made. |
envelope.sent | It is sent. |
signer.notified | A sequential signer gets their turn. |
link.opened | A signer opens their link: which link, IP address, device. |
signer.viewed | A signer opens it for the first time. |
reminder.sent | A reminder goes out. |
signer.consented | A signer agrees to sign electronically: the exact wording and its version. |
signer.signed | A signer signs: IP, device, the intent statement and the documents' SHA-256 hashes. |
signer.declined | A signer declines, with their reason. |
envelope.completed | Everyone has signed. |
envelope.voided | The sender cancels it. |
envelope.expired | The deadline passes. |
The audit trail is never changed or deleted while the envelope exists, and it is printed on the completion certificate.