Integrations
E-signature
DocuSign, Adobe Acrobat Sign, Dropbox Sign, PandaDoc, SignNow and BoldSign: send documents or templates for signature, wait for the signature, store the signed PDF.
Six e-signature providers are connectors with the same actions, so a workflow looks the same whichever one a workspace uses. The provider's envelope, agreement, signature request or document is called an envelope here.
| Provider | Connector | Auth | Field placement | Embedded signing | Certificate | Webhooks verified by |
|---|---|---|---|---|---|---|
| DocuSign (eSignature REST v2.1) | docusign | Authorization Code (access + refresh token or Connect), JWT Grant | Anchor text (/sn1/) | Yes (recipient view) | Yes | Connect HMAC (X-DocuSign-Signature-1) |
| Adobe Acrobat Sign (REST v6) | adobe_sign | Integration key, OAuth (access + refresh token or Connect) | Text tags | Yes (signing URLs) | Audit report | Client ID echo + URL token |
| Dropbox Sign (API v3) | dropbox_sign | API key, OAuth | Text tags | Yes (needs an API app client ID) | In the signed PDF | Event hash (HMAC with the API key) |
| PandaDoc | pandadoc | API key, OAuth | Field tags | Yes (document session) | In the signed PDF | HMAC (?signature=) |
| SignNow | signnow | Service user (password grant), OAuth | Text tags → roles | Yes (embedded invites) | Signed PDF with history | HMAC (X-SignNow-Signature) |
| BoldSign | boldsign | API key | Text tags | Yes | Audit log | Timestamped HMAC (X-BoldSign-Signature) |
Workflow steps
- Send for Signature (
esign_send) — documents (form attachments, files from Word / PDF steps,storage://references or URLs; one or many) or a provider template. Recipients have a name, email, role, signing order, type (signer or copy) and, for DocuSign, an anchor text for the signature field. Subject, message, reminders and expiry where the provider supports them, Embedded signing, text tags, Dropbox Sign test mode, and an Advanced JSON object merged into the provider request. Providers that take one file per envelope (PandaDoc, SignNow) get the PDFs merged first. Output{{envelope.envelope_id}},{{envelope.status}},{{envelope.recipients}}. - Wait for Signature (
esign_wait) — pauses the run until the envelope is completed, declined, voided or expired (or the timeout passes, default 30 days), then continues with{{signature.outcome}}, the recipients (withsigned_atanddeclined_reason) and — by default — the signed PDF stored as a workflow file in{{signature.signed_document}}(and{{signature.certificate}}with Both). Label its outgoing connections Completed, Declined, Voided, Expired or Timeout to branch; unlabelled connections always run. An envelope that is already final continues at once. - E-signature Envelope (
esign_envelope) — Get status (normalized envelope and per-recipient status), Download signed document (combined PDF, certificate / audit trail, or both, stored through the storage provider — Supabase Storage, S3, Azure, GCS or local disk), Void / cancel, Embedded signing URL for a "Sign now" link in a User Task (send with Embedded signing on; DocuSign links last 5 minutes) and List templates. - E-signature Event trigger (
esign_event) — starts a workflow when an envelope is sent, viewed, signed by a recipient, completed, declined, voided or expires; filter by connection and events. Variables:{{esign_event}},{{esign_envelope_id}},{{esign_status}},{{esign_recipient}},{{esign_envelope}}. It needs the provider's webhook (below).
In Send for Signature → From a template, the template picker searches the provider's templates and shows their roles; each recipient fills the role named in Role, and Prefill sets template fields (DocuSign text tabs, Acrobat Sign merge fields, Dropbox Sign custom fields, PandaDoc tokens, SignNow prefill texts, BoldSign form fields).
The same seven actions are connector references (send_documents, send_template, get_status, download_signed, cancel_envelope, signing_url, search_templates), so Call API / Reference, AI agents, MCP (references_execute), the REST API and the CLI can use them too:
usertasks references execute <send_documents reference id> \
--set inputs:='{"documents":"storage://task-files/workflow-files/…/contract.pdf","subject":"Please sign","recipients":[{"name":"Ada Lovelace","email":"ada@example.com"}]}'Safety and reliability
- No duplicate envelopes. Every send claims its client reference first (default: derived from the run, the step and the request; set your own in Advanced). A retried step gets the envelope it already sent (
replayed: true) instead of sending a second one; the reference is also stored on the envelope (DocuSign custom field, Acrobat Sign external ID, metadata elsewhere). - Credentials are encrypted at rest and never appear in step outputs, logs or call logs. Tokens are refreshed when they expire (DocuSign and SignNow authenticate the client with HTTP Basic; Acrobat Sign refreshes at
/oauth/v2/refresh), and a 401 drops the cached token and retries once. - Rate limits and outages: 429 answers are retried after
Retry-After; 5xx answers to reads are retried with backoff. Errors carry the provider's message, a code (unauthorized,not_found,rate_limited,validation…) and whether a retry may help. - Egress: every call passes the egress guard. API base URL override (sandboxes, regional hosts, a mock server) is still guarded.
Webhooks
Each connection has its own webhook URL:
https://<your app>/api/webhooks/esign/<provider>/<integration id>with <provider> one of docusign, adobe-sign, dropbox-sign, pandadoc, signnow, boldsign (the Event trigger's settings show the full URL). The workspace and connection come from the URL, never from the payload; every delivery is verified with the connection's Webhook secret before it is read; a delivery seen before is acknowledged and ignored, and deliveries older than seven days (five minutes for BoldSign) are refused. Only the envelope ID is taken from the payload — its status is read back from the provider before a run resumes or a trigger fires.
Without webhooks, Wait for Signature polls the envelope (every 5 minutes by default; the esign-poll scheduler job). With a webhook secret set, polling is a 30-minute safety net.
DocuSign
- Create a developer account at developers.docusign.com and an app in Apps and Keys: note the integration key and, for refresh tokens, add a secret key.
- Authorization Code Grant: add the redirect URI
https://<your app>/api/connectors/oauth/callback, scopessignature extended. Either paste an access token, refresh token, integration key and secret into the connector, or open the integration, choose OAuth 2.0 (prefilled for the demo environment — useaccount.docusign.comURLs for production) and click Connect. - JWT Grant (unattended service integrations): add an RSA key pair to the app, choose JWT Grant, paste the integration key, the user ID (API username GUID) and the private key. The user grants consent once by opening
https://account-d.docusign.com/oauth/auth?response_type=code&scope=signature%20impersonation&client_id=<integration key>&redirect_uri=<a registered redirect URI>(account.docusign.comin production). - Environment: Demo uses
account-d.docusign.comanddemo.docusign.net; Production usesaccount.docusign.comand your account's base URI. Account base URI → Auto-detect reads it from/oauth/userinfo; Account ID picks one account when the user has several (empty = the default). - Webhooks: Settings → Connect → Add configuration (Custom): URL = the webhook URL, data format JSON (REST v2.1), events Envelope Sent / Delivered / Completed / Declined / Voided and Recipient Signed / Declined, Include HMAC signature on; paste the HMAC key into the connector's Webhook secret.
- Anchor text: put e.g.
/sn1/(in white text) where the signature goes and give the recipient that anchor.
Adobe Acrobat Sign
- Create a free developer account at acrobat.adobe.com/developer. Note your shard (
na1,na2,eu1,eu2,jp1,au1,in1…) from the account URL. - Integration key: Account → Acrobat Sign API → API Information → Integration key, with the scopes below; paste it as the token.
- OAuth: Account → Acrobat Sign API → API Applications → create an application, Configure OAuth: redirect URI
https://<your app>/api/connectors/oauth/callback, scopesuser_read user_login agreement_read agreement_write agreement_send library_read webhook_read webhook_write webhook_retention(:accountmodifier). Paste the client ID, secret and refresh token, or use Connect (the authorize URL ishttps://secure.<shard>.adobesign.com/public/oauth/v2, tokens athttps://api.<shard>.adobesign.com/oauth/v2/token, refresh at/oauth/v2/refresh). - The API access point is discovered with
GET /api/rest/v6/baseUris. - Webhooks: register a webhook (Account → Webhooks or the API) for AGREEMENT events with the URL
<webhook URL>?token=<webhook secret>. Acrobat Sign verifies the URL by sending your client ID inX-AdobeSign-ClientId; UserTasks echoes it back only when it matches the connector's OAuth Client ID and the token matches. - Field placement: Acrobat Sign text tags such as
{{Sig_es_:signer1:signature}}in the document.
Dropbox Sign
- Create an account at sign.dropbox.com; test mode is free on every plan. Settings → API → API key: paste it (it is sent as the HTTP Basic user name).
- Leave Test mode on until your account has a paid API plan — test requests are watermarked and not legally binding.
- Embedded signing: create an API app, add your domain, paste its client ID. The signing URL must be opened with the hellosign-embedded library on that domain.
- OAuth (acting for other Dropbox Sign accounts): enable OAuth on the API app, callback
https://<your app>/api/connectors/oauth/callback. - Callbacks: Settings → API → Account callback (or the API app's event callback) = the webhook URL. Callbacks are verified with the API key (
event_hash); OAuth connectors put the app owner's API key into Webhook secret. UserTasks answersHello API Event Received. - Text tags such as
[sig|req|signer1]place fields.
PandaDoc
- Settings → Integrations → API: generate a Sandbox key for testing (watermarked, 10 requests/minute) and a Production key once API access is enabled. Paste it (sent as
Authorization: API-Key …). - OAuth: create an application in the PandaDoc developer dashboard with redirect URI
https://<your app>/api/connectors/oauth/callbackand scoperead+write. - Webhooks: Settings → Integrations → Webhooks → Create: URL = the webhook URL, events Document state changed and Recipient completed; copy the shared key into Webhook secret.
- PandaDoc processes an uploaded file before it can be sent; the step waits up to 30 seconds for the draft and sends it. Field tags such as
{signature:Client}place fields. - PandaDoc has no void: Void / cancel sets the document to Voided.
SignNow
- Create a developer sandbox at signnow.com/developers (
app-eval.signnow.com, APIapi-eval.signnow.com) and an API application: copy its client ID and client secret. - Service user: choose Service user (password grant) and enter the user's email and password; or OAuth with redirect URI
https://<your app>/api/connectors/oauth/callback. - Set Environment to Sandbox while testing, Production afterwards; Sender email is the invites' "from" address (default: the signed-in user).
- Text tags such as
{{t:s;r:y;o:"Signer 1";}}create fields with roles; recipients are matched to roles by name, then by order. A document without roles can go to one signer (free-form invite). - Events: create event subscriptions (
document.complete,document.fieldinvite.signed,document.fieldinvite.decline) with callback = the webhook URL and a secret key; paste the secret into Webhook secret.
BoldSign
- Create an account at boldsign.com; API → API Key: generate a sandbox key for testing (documents are not binding) and a live key for production. Choose Region EU for
api-eu.boldsign.com. - Webhooks: API → Webhooks → Add: URL = the webhook URL, events Sent, Viewed, Signed, Completed, Declined, Revoked, Expired; copy the signing secret into Webhook secret. BoldSign's verification ping is answered automatically.
- Text tags such as
{{sign|1|*|Signer 1|sig1}}place fields.
Database
Migration 20261206000000_esign.sql adds esign_envelopes (the send ledger), esign_waits (paused runs and their next poll) and esign_events (delivery keys for replay protection), all service-role only, and the esign-poll probe key.