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_document
Create document
Create and optionally send a new document for signing. Set draft to true to save without sending.
Parameters
Name
Type
Required
Description
files
array
Required
File objects, each with a name and either a public file_url or base64 content.
recipients
array
Required
Recipient objects with an id, email, and optional name, passcode, subject, or message.
draft
boolean
Optional
Save the document as a draft instead of sending immediately.
apply_signing_order
boolean
Optional
Require recipients to sign one at a time in the specified order.
signwell_create_document_from_template
Create from template
signwell_send_document
Send draft
signwell_get_document
Get signing status
signwell_send_reminder
Send reminder
signwell_update_recipients
Update recipients
signwell_get_completed_pdf
Download signed PDF
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.
OPS
Email-to-calendar scheduling agent
Parse scheduling intent from Gmail threads and create Google Calendar events with the right attendees and timezone.
GTM
CRM AI agent
Log calls, update opportunity stages, and surface stalled deals across HubSpot or Salesforce. No manual data entry.
Why Scalekit
Secure your agent's access. Connectors ship in minutes
Other connector libraries treat auth as a demo afterthought. Scalekit starts with identity, scope enforcement, and audit. Connectors follow.
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""
}
}
}