SignWell

Live

API KEY

E-SIGNATURE

Files & Documents

SignWell gives agents API key scoped access to your e-signature workflows: create documents, send for signature, chase pending signers, and pull signed PDFs.

  • Per-user credentials: each call uses the actual user's token, never a shared bot.
  • Encrypted per-tenant vault: AES-256, resolved at request time, never in LLM context.
  • Scoped before every call: pre-call scope check, 90-day SIEM-exportable audit chain.
SignWell
agent · Acme Q3
Run
Has the Acme Corp MSA been signed yet? Remind anyone still pending.
S
signwell_get_document
78ms
SignWell agent
2 of 3 recipients signed. Priya Sharma (legal@acme.com) pending since Jul 21. Reminder sent, document expires Aug 4.
Sources: 1 document, 3 recipients, sent Jul 18
signwell
3 recipients
18:29
Message Claude...

Tools your document agent reaches for on SignWell, scoped per user.

CALL ANY TOOL
Run e-signature end to end: create documents, send from templates, remind pending signers, and download the signed PDF, every call on the user's own API key.
signwell_create_bulk_send
Send create bulk
Create a bulk send to send a document to many recipients at once using a CSV file and one or more templates.
Parameters
Name
Type
Required
Description
bulk_send_csv
string
Required
RFC 4648 base64-encoded CSV file content. Use Get Bulk Send CSV Template to retrieve the correct column format.
template_ids
array
Required
Array of template ID strings (UUIDs) to use for the bulk send.
api_application_id
string
Optional
API Application ID for branding the signing experience.
apply_signing_order
boolean
Optional
Recipients sign one at a time in order.
custom_requester_email
string
Optional
Custom requester email shown in all communications to recipients.
custom_requester_name
string
Optional
Custom requester name shown in all communications to recipients.
message
string
Optional
Email message body for the signature request sent to each recipient.
name
string
Optional
Name for the bulk send, used as the document name for each recipient.
skip_row_errors
boolean
Optional
Skip rows with errors instead of failing the entire bulk send.
subject
string
Optional
Email subject for the signature request sent to each recipient.
signwell_create_document
Create document
signwell_create_document_from_template
Create document from template
signwell_create_template
Create template
signwell_create_webhook
Create webhook
signwell_delete_api_application
Delete api application
signwell_delete_document
Delete document
signwell_delete_template
Delete template
signwell_delete_webhook
Delete webhook
signwell_get_api_application
Get api application
signwell_get_bulk_send
Send get bulk
signwell_get_bulk_send_csv_template
Get bulk send csv template
signwell_get_bulk_send_documents
Get bulk send documents
signwell_get_completed_pdf
Get completed pdf
signwell_get_document
Get document
signwell_get_me
Get me
signwell_get_nom151_certificate
Get nom151 certificate
signwell_get_template
Get template
signwell_list_bulk_sends
List bulk sends
signwell_list_webhooks
List webhooks
signwell_send_document
Send document
signwell_send_reminder
Send reminder
signwell_update_authentication
Update authentication
signwell_update_recipients
Update recipients
signwell_update_template
Update template
signwell_validate_bulk_send_csv
Validate bulk send csv
Build your Agent
Same auth pattern across LangChain, OpenAI, Anthropic, and Google ADK.
Python · LlamaIndex
import { ScalekitClient } from "@scalekit-sdk/node";
import { createReactAgent } from "@langchain/langgraph/prebuilt";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

// SignWell tools scoped to this user
const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["signwell"], toolNames: [
    "signwell_create_document_from_template",
    "signwell_get_document",
    "signwell_send_reminder"] },
  pageSize: 100,
});

const agent = createReactAgent({ llm, tools });
await agent.invoke({ messages: [{ role: "user", content: "Has the Acme MSA been signed yet?" }] });
import OpenAI from "openai";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const openai = new OpenAI();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["signwell"] }, pageSize: 100,
});

const res = await openai.chat.completions.create({
  model: "gpt-5",
  messages: [{ role: "user", content: "Who still needs to sign the vendor agreement?" }],
  tools,
});

// Execute the tool call with the user's vaulted SignWell credential
await sk.tools.executeTool(res.choices[0].message.tool_calls[0], "user_123");
import Anthropic from "@anthropic-ai/sdk";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const anthropic = new Anthropic();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["signwell"] }, pageSize: 100,
});

const msg = await anthropic.messages.create({
  model: "claude-sonnet-5",
  max_tokens: 1024,
  messages: [{ role: "user", content: "Send the NDA template to jane@acme.com for signature." }],
  tools,
});

// Tool call runs with the user's vaulted SignWell credential
await sk.tools.executeTool(msg.content, "user_123");
import { Agent } from "@google/adk/agents";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["signwell"] }, pageSize: 100,
});

const agent = new Agent({
  name: "signwell_document_agent",
  model: "gemini-2.5-pro",
  instruction: "Manage SignWell signing workflows for the signed-in user.",
  tools,
});

await agent.run("Download the signed PDF for the Acme MSA with the audit page.");
Try these prompts
Copy any prompt into your agent. Each maps directly to a SignWell tool. Click to copy, paste into your agent, done.
Send for signature
Copy the prompt
Copied
Send the NDA template to jane@acme.com for signature.
Copy the prompt
Copied
Create a document from the MSA template and map Acme's legal team to the signer placeholders.
Copy the prompt
Copied
Upload contract.pdf and send it to both founders with signing order enforced.
Track and chase
Copy the prompt
Copied
Which recipients on the Acme MSA have not signed yet?
Copy the prompt
Copied
Send a reminder to everyone still pending on the Q3 vendor agreement.
Copy the prompt
Copied
Fix the typo in the CFO's email on the offer letter and resend it.
Retrieve signed documents
Copy the prompt
Copied
Download the completed PDF for the Acme MSA with the audit page included.
Copy the prompt
Copied
Get the signed contract as a URL I can share with finance.
Copy the prompt
Copied
Pull the recipient list and field values from the closed deal document.
SEE HOW AUTH WORKS
Your users connect once. Their SignWell credentials stay vaulted, every call is checked, and every action is logged.
1
Authorize
Your user connects
SignWell
once. We tie it to their identity and the meetings they approved — no shared bot account, no org-wide access
Who:
user ‘A’
when:
Once per user
access:
Limited to user
2
Store
Their
SignWell
token lives in a vault scoped to them. User A's meetings are never reachable by an agent acting for user B, even on the same connection
vault:
encrypted
scope:
per-user
tokens:
auto-refreshed
3
Resolve
When your agent calls a
SignWell
tool, we fetch the right token server-side. It never touches your agent, never appears in the LLM context, never shows up in your logs
speed:
~40ms
check:
before every call
seen by:
nobody
4
Audit
Every
SignWell
tool call is logged — who triggered it, which meeting was fetched, what came back. 90 days of history, tied to the user who authorized it
history:
90 days
export:
SIEM-ready
logged:
every call
Test other agents
See the same per-user auth pattern across other document connectors.
People Ops and HR teams
Offer letter routing agent
Drafts the offer in PandaDoc, blocks on the hiring manager's approval in Slack, then emails the candidate their e-signature link. Every call runs as the recruiter who triggered it, never a shared HR bot.
GTM and RevOps Teams
Deal room sync
Pulls opportunity context from Salesforce, captures key decisions from Slack, and syncs a running summary to the deal room doc in Google Drive, but only when the deal actually changed.
People Ops and HR teams
Performance review collector
Collects review feedback from Airtable and Google Forms scoped to each manager's direct reports, writes per-employee summaries to Notion, and DMs the manager a Slack digest.
Support and Ops Teams
Support ticket automation agent
Fetches new Zendesk tickets, drafts a reply from Notion knowledge base articles, digests what it cannot answer to Slack, and archives the rest, acting as the support agent rather than a shared API key.
Test other agents
See the same per-user auth pattern across other document connectors.
PEOPLE OPS
Offer letter routing agent
Draft the offer in PandaDoc, gate it on hiring manager approval in Slack, then email the candidate their signature link.
GTM
Deal room sync agent
Pull opportunity context from Salesforce, capture decisions from Slack, and keep the Google Drive deal room doc current.
PEOPLE OPS
Performance review collector agent
Collect review feedback from Airtable and Google Forms per manager, summarise each report in Notion, and DM the digest in Slack.
SUPPORT
Support ticket automation (Google ADK)
Fetch, annotate, and archive Zendesk tickets with Notion context, digesting anything it cannot answer to Slack.
Why Scalekit
Secure your agent's access. Connectors ship in minutes
01.
Shared tokens break per-user analytics
A shared SignWell key looks fine in a demo. In production every contract send looks like one service account, and you cannot tell who sent the NDA or downloaded the signed PDF. Scalekit resolves the credential of the actual user who triggered the agent, never a shared bot.
// shared key
audit → bot_service_account

// scalekit
audit → user_abc ✓
02.
Authentication is not authorization
03.
Multi-tenancy is architectural
04.
SignWell today. Ten connectors tomorrow.
“Our agents act across Salesforce, Gong, Google Drive, and more, on behalf of every customer. Scalekit behind the scenes meant we can keep adding tools without ever rebuilding how credentials or tool calling work.”
Venu Madhav Kattagoni
Head of Engineering / Von
FAQs
Frequently Asked Questions
Does the agent access SignWell as the user or through a shared key?
As the user. Scalekit resolves the credential of the person who triggered the agent at request time, so every document send, reminder, and download in your audit trail is attributed to a real user, not a shared service account.
Where is the SignWell API key stored?
In an AES-256 encrypted vault with per-tenant namespacing. Keys are resolved at request time, never enter LLM context, and can be revoked from one dashboard.
Can I limit what the agent does in SignWell?
Yes. Filter by tool name in listScopedTools to expose only what you want, for example status checks and reminders without create or delete. Scalekit also enforces scope checks before every API call.
What happens when a user revokes access?
The credential is invalidated at the next tool call. The call fails closed, other users' connections are unaffected, and the revocation is logged in the audit chain.
SignWell uses API keys, not OAuth. How does per-user auth still work?
Each user connects their own SignWell API key once, through a Scalekit-hosted flow. Scalekit vaults it in the user's tenant namespace and proxies every request with that key, so there is no shared key and the raw credential never reaches your agent or the LLM.
Start in your coding agent
Up and running in one command
Install the Scalekit skill in your editor of choice. Connector, auth, tools, prompt, all wired up
Claude Code REPL
/plugin marketplace add scalekit-inc/claude-code-authstack
/plugin install agentkit@scalekit-auth-stack
Cursor Code REPL
# ~/.cursor/mcp.json
{
""mcpServers"": {
""signwell"": {
""url"": ""https://mcp.scalekit.com/signwell"",
""headers"": { ""Authorization"": ""Bearer $SCALEKIT_TOKEN"" }
}
}
}
Codex Code REPL
# ~/.codex/config.toml
[mcp_servers.signwell]
url = ""https://mcp.scalekit.com/signwell""
auth_env = ""SCALEKIT_TOKEN""
Copilot Code REPL
# .vscode/mcp.json
{
""servers"": {
""signwell"": {
""url"": ""https://mcp.scalekit.com/signwell"",
""type"": ""http""
}
}
}