Every signing workflow starts the same way: someone opens a PDF editor, drags and drops signature fields onto the right lines, exports, uploads to a signing service, adds signer emails, and hits send. When you're doing this once a month for an NDA it's fine. When you're generating hundreds of contracts per day from templates, it's a bottleneck.
QuantoSign's Markdown Automation API solves this. Write your document in
plain Markdown. Drop {{RTAI:Signer1:Signature}} placeholders wherever you want
signature fields. One API call converts it to a PDF, extracts the exact coordinates of each
placeholder, places interactive signing fields there, and sends signing links to every signer.
The Flow
The API ingests Markdown, converts it to PDF via LibreOffice, scans the PDF content stream for invisible marker text to find each placeholder's exact page coordinates, then creates interactive signing fields at those locations. The signed PDF includes inline stamps — the signature image and date appear exactly where the placeholders were in your Markdown.
Step 1 — Write the NDA in Markdown
Here's a two-party NDA written entirely in Markdown. The {{RTAI:SignerN:FieldType}}
placeholders render as invisible markers in the PDF, replaced by interactive signing fields:
Placeholders follow the format {{RTAI:SignerN:FieldType}}. Signer number matches the signing order — Signer1 signs first, Signer2 receives their link after Signer1 completes. Supported field types:
| Placeholder | Field Type | Description |
|---|---|---|
| {{RTAI:Signer1:Signature}} | signature | Drawn or typed signature |
| {{RTAI:Signer1:Date}} | date | Auto-filled signing date |
| {{RTAI:Signer1:Text}} | text | Free-text (name, title, etc.) |
| {{RTAI:Signer1:Initials}} | initials | Initials field |
| {{RTAI:Signer1:Checkbox}} | checkbox | Checkbox agreement |
Step 2 — One API Call
Point the API at your Markdown string and declare your signers. The API handles everything else.
curl -X POST https://esign.rt19.runtimeai.io/api/v1/sign/documents/from-markdown \
-H "Authorization: Bearer $ESIGN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"title": "Mutual NDA — April 2026",
"markdown_content": "# NDA\n\nSee nda.md for full content",
"signers": {
"Signer1": {"name":"Alice Smith","email":"alice@acme.com","order":1},
"Signer2": {"name":"Bob Jones", "email":"bob@buildco.com","order":2}
},
"send_immediately": true
}'
import requests
response = requests.post(
"https://esign.rt19.runtimeai.io/api/v1/sign/documents/from-markdown",
headers={"Authorization": f"Bearer {token}"},
json={
"title": "Mutual NDA — April 2026",
"markdown_content": open("nda.md").read(),
"signers": {
"Signer1": {"name": "Alice Smith", "email": "alice@acme.com", "order": 1},
"Signer2": {"name": "Bob Jones", "email": "bob@buildco.com", "order": 2},
},
"send_immediately": True,
}
)
doc = response.json()
print(f"Document {doc['document_id']} sent to {len(doc['signers'])} signers")
const response = await fetch(
'https://esign.rt19.runtimeai.io/api/v1/sign/documents/from-markdown',
{
method: 'POST',
headers: {
Authorization: `Bearer ${token}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
title: 'Mutual NDA — April 2026',
markdown_content: fs.readFileSync('nda.md', 'utf8'),
signers: {
Signer1: { name: 'Alice Smith', email: 'alice@acme.com', order: 1 },
Signer2: { name: 'Bob Jones', email: 'bob@buildco.com', order: 2 },
},
send_immediately: true,
}),
}
);
const { document_id, signers } = await response.json();
Step 3 — The Response
The API returns the document ID and a signing link for each signer. Signer2's link is inactive until Signer1 completes — sequential order is enforced automatically.
Step 4 — Signing Experience
Each signer opens their link in any browser. They see the full NDA rendered as a PDF with interactive fields at every placeholder location. The signature field renders a drawing pad; date fields auto-fill to today. After signing, the document moves to the next signer in the sequence.
Step 5 — The Signed PDF
Once all signers complete, the executed PDF is available for download. Signatures and dates appear inline with their original placeholder labels — exactly where you placed them in the Markdown source.
- Source:
runtimeai_nda.md— the Markdown NDA with{{RTAI:...}}placeholders - Result:
runtimeai_nda_signed.pdf— executed PDF with inline signature stamps
Demo B: Claude Code via MCP
If you use Claude Code (Anthropic's CLI), the QuantoSign MCP server lets you orchestrate the entire signing workflow as a conversation — no scripts, no curl commands. This demo uses two separate Claude Code sessions: one for Alice (the sender, Acme Technologies) and one for Bob (the counterparty, Buildco Corp — a different company).
1. Add QuantoSign to Claude Code
Both Alice and Bob add this to their Claude Code MCP config at
~/.claude/settings.json. Each uses their own API key:
{
"mcpServers": {
"quantosign": {
"command": "npx",
"args": ["@runtimeai/mcp-server-quantosign"],
"env": {
"QUANTOSIGN_API_KEY": "your-api-key-here",
"QUANTOSIGN_BASE_URL": "https://esign.rt19.runtimeai.io/api/v1/sign"
}
}
}
}
Get your API key from the
API Keys dashboard.
Restart Claude Code — the QuantoSign tools load automatically and are listed via /mcp.
2. Alice's Session — Create & Send
Alice opens a Claude Code terminal and runs these prompts:
nda.md, with me (Alice Smith, alice@acme.com) as Signer1 and Bob Jones (bob@buildco.com) as Signer2. Don't send yet — I want to review first.
3. Bob's Session — Review & Sign
Bob is at a different company. He opens his own Claude Code session after receiving the "your turn" email, and pastes his signing link:
Two parties, different companies, different Claude Code sessions. From Markdown source to fully executed PDF — six conversational turns, zero code.
When to Use This
- Contract automation — Generate NDAs, SOWs, and offer letters from templates in your codebase
- AI agent workflows — Let an agent draft, create, and route a document without human intervention
- CI/CD pipelines — Auto-generate and send compliance attestations as part of a release workflow
- Low-volume use cases — Faster than uploading a PDF and dragging fields for one-off agreements