Docs
Connect once. Then just tell your AI what to do.
Sign in at the dashboard and copy your Atlas API key. First 5 envelopes are free.
Get API key →Choose your platform:
Claude Desktop or Claude.ai
Go to Settings → Connectors → Add custom connector and paste:
https://atlaswork.ai/api/mcpChatGPT
Atlas is not in the ChatGPT app store yet, so you need to add it manually via Developer mode.
https://atlaswork.ai/api/mcpNo API key needed. Atlas handles auth via OAuth.
Claude Code
claude mcp add --transport http atlas \ https://atlaswork.ai/api/mcp \ --header "Authorization: Bearer YOUR_KEY"
Cursor
Add to ~/.cursor/mcp.json
{
"mcpServers": {
"atlas": {
"url": "https://atlaswork.ai/api/mcp",
"headers": { "Authorization": "Bearer YOUR_KEY" }
}
}
}No code. No forms. Type what you want and your AI handles it.
Send a contract
“Send this NDA to sarah@acme.com. Here's the link: https://drive.google.com/...”
Check status
“Has everyone signed the contract I sent yesterday?”
List pending
“Show me all contracts still waiting to be signed.”
Void
“Cancel the contract I sent to john@example.com.”
Send reminder
“Remind alice@example.com to sign. She hasn't responded.”
Sending a document
Atlas accepts documents three ways. Use whichever fits your workflow.
Share link (any AI)
“Send this NDA to sarah@acme.com. Here's the link: https://drive.google.com/...”
Google Drive, Dropbox, S3, OneDrive, and Box all work.
AI-drafted contract (Claude or ChatGPT)
“Send the contract you just wrote to sarah@acme.com for signing.”
The AI passes the text directly. Atlas converts it to a PDF.
Local file (Claude Code or Cursor)
“Send the contract at /Users/me/contracts/nda.pdf to sarah@acme.com for signing.”
Claude Code reads and encodes the file automatically.
File uploaded to ChatGPT
“Encode and send the contract I just uploaded for signing to sarah@acme.com.”
ChatGPT uses Python to encode the file and passes it to Atlas.
No share link and using claude.ai
Upload your file at atlaswork.ai/upload to get a hosted URL, then paste that URL in your prompt.
Atlas fetches the PDF or DOCX, detects where signatures go, and emails the signer. You get a review link before anything goes out. To skip the review and send immediately, use auto_send: true.
Your AI calls these behind the scenes.
upload_documentStage a PDF or DOCX at a stable URL so you can pass it to send_contract. Pass a public https:// link. Atlas fetches and hosts it.
send_contractSend a PDF or DOCX for signing. Detects fields automatically. Pass a document_url or document_text along with signer_email. Have a local file? Call upload_document first to get a URL.
get_envelopeCheck the status of a signing envelope. Pass envelope_id.
list_envelopesList your envelopes filtered by status (pending, signed, declined, voided).
void_envelopeCancel a pending envelope. The signer can no longer sign.
remind_signerSend a reminder email to the next unsigned signer. Accepts an optional custom message.
get_signed_documentGet a download URL for the completed signed PDF. Only available after signing is complete.
Use templates when you send the same contract shape repeatedly. The schema (PDF, field positions, variables, party roles) is locked at creation. Only the variable values change per send. Sends with template_id skip the AI detection pipeline. Sub-200ms typical.
Templates default to status: draft. Activate before sending live. Each version snapshot is immutable. Editing a template creates a new version and demotes status back to draft.
Source must be one of from_envelope_id, from_pdf_path, or from_template_id.
curl -X POST https://atlaswork.ai/api/templates \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Standard Lease",
"source": { "from_envelope_id": "env_abc123" },
"variables_schema": [
{ "key": "tenant_name", "label": "Tenant Name", "type": "string", "required": true },
{ "key": "monthly_rent", "label": "Monthly Rent", "type": "currency", "required": true },
{ "key": "start_date", "label": "Start Date", "type": "date", "required": true }
],
"parties_schema": [
{ "role_type": "tenant", "role_label": "Tenant", "required": true },
{ "role_type": "landlord", "role_label": "Landlord", "required": true }
]
}'
→ { "success": true, "template_id": "tmpl_...", "status": "draft", "version": 1 }Activation runs structural validation. If the report fails, fix the listed issues and try again. To override a failing report, pass { force: true, force_reason: "..." }.
curl -X POST https://atlaswork.ai/api/templates/tmpl_abc123/activate \
-H "Authorization: Bearer $API_KEY"
→ { "success": true, "status": "active", "validation_report": { "passed": true, "issues": [] } }Pass template_id, variables, and parties to the standard envelope endpoint. No detection runs. Idempotency hash does not include template_version, so retries are safe across version bumps.
curl -X POST https://atlaswork.ai/api/envelope \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"template_id": "tmpl_abc123",
"variables": { "tenant_name": "John Smith", "monthly_rent": 2400, "start_date": "2026-06-01" },
"parties": [
{ "role_type": "tenant", "email": "tenant@example.com", "name": "John Smith" },
{ "role_type": "landlord", "email": "landlord@example.com", "name": "Acme Properties" }
],
"auto_send": false,
"idempotency_key": "lease-2026-q2-7741"
}'
→ {
"success": true,
"envelope_id": "env_...",
"review_url": "https://atlaswork.ai/review/env_...",
"template_id": "tmpl_abc123",
"template_version": 1,
"status": "draft"
}TypeScript:
const res = await fetch('https://atlaswork.ai/api/envelope', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.ATLAS_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
template_id: 'tmpl_abc123',
variables: { tenant_name: 'John Smith', monthly_rent: 2400 },
parties: [
{ role_type: 'tenant', email: 'tenant@example.com', name: 'John Smith' },
{ role_type: 'landlord', email: 'landlord@example.com', name: 'Acme Properties' },
],
idempotency_key: 'lease-2026-q2-7741',
}),
});
const result = await res.json();When required variables or parties are missing, the API returns HTTP 200 with a structured needs_info body. No envelope row is created. No credit is consumed. Surface the missing fields to the user, collect their answers, and retry.
{
"status": "needs_info",
"template_id": "tmpl_abc123",
"template_version": 1,
"missing_required_variables": [
{ "key": "monthly_rent", "label": "Monthly Rent", "type": "currency", "required": true }
],
"missing_optional_variables": [],
"missing_parties": [
{ "role_type": "landlord", "role_label": "Landlord", "needs_fields": ["email"] }
],
"validation_errors": [],
"next_action": "Fill the listed required variables and parties, then POST /api/envelope again."
}With auto_send: true, any missing required variable returns HTTP 400 instead. auto_send never silently falls back to a draft.
Seven new MCP tools cover the full template lifecycle. See the SDK page for end-to-end agent flows.
list_templatesList your templates. Optional search, status, limit, cursor.
get_templateFetch a full template (variables_schema, parties_schema, current_version).
send_with_templateSend an envelope from an active template. Returns needs_info if required variables or parties are missing. No envelope is created until the gate passes.
create_template_from_envelopeTurn a finished envelope into a reusable template. Returns template_id in draft status.
activate_templateFlip a template from draft to active after structural validation passes. Required before live sends.
update_templatePatch name, description, or parties_schema. Field schema and version edits use dedicated endpoints.
archive_templateSoft-archive a template. Archived templates cannot be sent or reactivated.
Your AI knows these automatically. Listed for reference.
| Parameter | What it does |
|---|---|
| document_url | Link to a PDF or DOCX. Google Drive, Dropbox, S3, OneDrive, and Box all work. Atlas fetches server-side. Have a local file? Call upload_document first to get a URL. |
| document_text | Full contract text. Atlas converts it to a PDF with field detection. Use when Claude or ChatGPT drafted the contract. |
| signer_email | Who signs. If omitted, Atlas returns detected fields for your review. |
| signer_name | Signer's full name. Pre-fills name fields automatically. |
| auto_send | Skip review and email the signer immediately. |
| prefill_map | Key-value pairs to pre-fill fields by label. Fuzzy matched. |
| expires_in_days | Days until the signing link expires. Default: 7. |
| parties | Multi-signer flows. Each party has role, email, and order. |
5 free envelopes. No credit card.
Get started →Sending at volume? Book a call →