DocSend API - Complete Guide to API Access, Downloads & Integrations (2026)
Does DocSend have an API? What the official Zapier triggers can and cannot do, and how to download DocSend documents programmatically with the DeckExtract REST API and MCP server, with cURL, JavaScript and Python examples.
If you're searching for a DocSend API to programmatically access, download, or integrate DocSend documents into your workflow, you're not alone. Developers, sales teams and investors need to automate their document workflows and quickly discover that DocSend's API capabilities are surprisingly limited.
This guide covers what DocSend offers programmatically, what it does not, and how to download DocSend (and Papermark) documents from a script, a CRM workflow or an AI agent with the DeckExtract API and MCP server.
Does DocSend Have a Public API?
Short answer: No. DocSend does not offer a public REST API for document downloads or content access.
DocSend (owned by Dropbox since 2021, and increasingly labelled "Dropbox DocSend") is a document sharing and analytics platform built for pitch decks, sales proposals and legal documents with viewer tracking. It excels at sharing documents and tracking engagement, and it intentionally restricts programmatic access to document content.
What DocSend DOES Offer
DocSend provides limited automation capabilities through third-party integrations:
Zapier Integration Triggers:
- New Link Created - fires when you create a new DocSend link
- New Visit - triggers when someone views your document
- New Space Created - activates when you create a new Space
- New Space Visit - triggers for Space engagement
- New Space Download - fires when content is downloaded from Spaces
- New Signed Document - activates when a document is signed (NDAs, agreements)
- Visitor Engagement Summary - aggregates viewing metrics
What These Integrations Allow:
- Send Slack notifications when documents are viewed
- Add document visitors to CRM systems like HubSpot or Salesforce
- Log engagement data to Google Sheets
- Trigger email sequences based on document activity
All of these are triggers about your own links and your own visitors. None of them returns the content of a document.
What DocSend Does NOT Offer
No public API endpoints for:
- Downloading document content (PDF, images, slides)
- Programmatic document uploads
- Bulk document retrieval
- Direct document manipulation
- Content extraction
- Automated backups
This limitation is by design. DocSend's business model relies on keeping documents within the platform to track engagement. Allowing downloads via API would undermine the analytics that senders pay for. The same applies to the Dropbox developer API: it does not expose DocSend documents.
Why Developers Search for DocSend API
There are several legitimate reasons developers and businesses need programmatic access to DocSend documents they have been sent:
1. Document Archival
Investors receive dozens of pitch decks a month as DocSend links that expire or get revoked. Without an API, keeping a copy means opening every link by hand.
2. Backup and Compliance
Regulatory requirements often mandate that businesses keep copies of the documents they reviewed. Relying on the sender's DocSend account for storage creates compliance risk.
3. Workflow Automation
Deal teams want the deck attached to the CRM record (Affinity, Attio, HubSpot, Salesforce) the moment it lands in the inbox, not after someone remembers to download it.
4. Due Diligence
Investors reviewing many decks need them in a folder, a data room of their own, or an AI tool, as PDFs rather than tracked links.
5. AI Agents
Analysts increasingly ask Claude, ChatGPT or an internal agent to summarize a deck. Those tools cannot open a DocSend link; they need the file, or a tool that fetches it.
The DocSend Download API Alternative: DeckExtract
Since DocSend does not provide a download API, DeckExtract fills the gap with a REST API built for extracting documents from DocSend and Papermark links: single documents, and whole data rooms (DocSend Spaces and Papermark rooms) as a ZIP of PDFs.
DeckExtract API Overview
One POST returns JSON with a short-lived download link. Responses use real HTTP status codes, so your code branches on response.status.
Endpoint: POST https://deckextract.com/api/v2/extract
Authentication: every request needs an API key, sent as Authorization: Bearer dk_.... A key is free: sign in with your email and copy it from your account page.
Plans:
- Free: 5 extractions per month. A data room counts as one extraction. Failed extractions are not counted.
- Pro (EUR 9.99/month, cancel anytime): unlimited extractions at a 30-per-hour pace, AI deck analysis with
analyze: true, and the same key works for the MCP server.
Key features:
- Extract as PDF or PowerPoint (PPTX)
- DocSend Spaces and Papermark data rooms as a ZIP of PDFs
- Password-protected documents
- Email-gated documents, including the confirmation-link and one-time-code flows
- Structured deck analysis (company, team, round, metrics) on Pro
Basic API Usage
Simple Document Extraction:
curl -X POST https://deckextract.com/api/v2/extract \
-H "Authorization: Bearer dk_your_api_key" \
-H "Content-Type: application/json" \
-d '{ "url": "https://docsend.com/view/abc123" }'
The response carries the download link. Fetch it to get the file:
RESPONSE=$(curl -s -X POST https://deckextract.com/api/v2/extract \
-H "Authorization: Bearer dk_your_api_key" \
-H "Content-Type: application/json" \
-d '{ "url": "https://docsend.com/view/abc123" }')
echo "$RESPONSE" | jq -r '.download.url' | xargs curl -L -o document.pdf
Password-Protected Documents:
curl -X POST https://deckextract.com/api/v2/extract \
-H "Authorization: Bearer dk_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"url": "https://docsend.com/view/abc123",
"password": "your-password"
}'
Extract as PowerPoint:
curl -X POST https://deckextract.com/api/v2/extract \
-H "Authorization: Bearer dk_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"url": "https://docsend.com/view/abc123",
"format": "pptx"
}'
Documents Requiring Email Verification:
curl -X POST https://deckextract.com/api/v2/extract \
-H "Authorization: Bearer dk_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"url": "https://docsend.com/view/abc123",
"email": "your-email@example.com"
}'
Most email-gated decks resolve in one call. When the sender restricted the deck to specific addresses, the API answers 422 with status: "requires_email_review" and you retry with an authorized email plus the returned sessionId.
API Request Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
url | string | Yes | The DocSend or Papermark document or data-room URL |
format | string | No | Output format: "pdf" (default) or "pptx" |
email | string | No | Email for email-gated documents |
password | string | No | Passcode for protected documents |
sessionId | string | No | Session ID returned by a 422 gate, for the retry |
otp | string | No | 6-digit code for Papermark decks that email a one-time code, with otpSessionId |
analyze | boolean | No | Pro only: also return a structured deck analysis in the same response |
API Response Types
Successful Extraction (HTTP 200):
{
"success": true,
"download": {
"url": "https://deckextract.com/dl/<token>.pdf",
"filename": "<token>.pdf",
"contentType": "application/pdf",
"bytes": 554790,
"expiresAt": "2026-09-09T22:24:33Z"
},
"meta": { "platform": "docsend.com", "format": "pdf", "analyzed": false }
}
The download link is valid for one hour. Data rooms return a ZIP with contentType: application/zip.
Authentication Gate (HTTP 422):
{
"success": false,
"status": "requires_password",
"error": "This deck is passcode-protected. Retry with `password` and `sessionId`.",
"sessionId": "abc123..."
}
The other 422 gates are requires_email_confirmation, requires_email_review and requires_email_otp. Each names the field to resupply on the retry.
Errors:
| HTTP | code | Meaning |
|---|---|---|
| 400 | invalid_url, unsupported_domain | Not a DocSend or Papermark link |
| 401 | auth_required, invalid_key | Missing, invalid or expired API key |
| 402 | pro_required | analyze: true without a Pro key |
| 404 | not_found | The link does not exist |
| 422 | link_disabled, extraction_failed | The sender disabled the link, or the deck could not be rendered |
| 429 | monthly_limit, rate_limited | Free plan cap reached, or the Pro hourly pace exceeded |
| 503 | busy | The extraction queue is full; retry in a minute |
JavaScript/TypeScript Implementation
async function downloadDocSendDocument(url, options = {}) {
const { email, password, sessionId, format = 'pdf' } = options;
const response = await fetch('https://deckextract.com/api/v2/extract', {
method: 'POST',
headers: {
'Authorization': 'Bearer dk_your_api_key',
'Content-Type': 'application/json',
},
body: JSON.stringify({ url, email, password, sessionId, format }),
});
const data = await response.json();
// Success: fetch the short-lived download link.
if (response.ok && data.download) {
const file = await fetch(data.download.url);
return await file.blob();
}
// A 422 gate is not an error: resupply the field it names and retry.
if (response.status === 422 && data.status === 'requires_password') {
throw new Error(`Password required (sessionId ${data.sessionId})`);
}
if (response.status === 422 && data.status === 'requires_email_review') {
throw new Error(`An authorized email is required (sessionId ${data.sessionId})`);
}
// Everything else (400/401/402/429/5xx) is terminal.
throw new Error(data.error || `Extraction failed (${response.status})`);
}
// Usage
const blob = await downloadDocSendDocument(
'https://docsend.com/view/abc123',
{ format: 'pdf' }
);
Python Implementation
import requests
API_KEY = 'dk_your_api_key'
def download_docsend_document(url, email=None, password=None, format='pdf'):
response = requests.post(
'https://deckextract.com/api/v2/extract',
headers={'Authorization': f'Bearer {API_KEY}'},
json={'url': url, 'email': email, 'password': password, 'format': format},
)
data = response.json()
if response.ok and data.get('download'):
return requests.get(data['download']['url']).content
if response.status_code == 422 and data.get('status'):
# requires_password / requires_email_review / ...: retry with the
# named field and data['sessionId'].
raise Exception(f"{data['status']}: {data.get('error')}")
raise Exception(data.get('error', f'Extraction failed ({response.status_code})'))
# Usage
pdf_content = download_docsend_document('https://docsend.com/view/abc123')
with open('document.pdf', 'wb') as f:
f.write(pdf_content)
Deck Analysis in the Same Call (Pro)
Add "analyze": true and the response also carries a structured JSON analysis of the deck (company, team, round, metrics, market, product, competition, funding, each tagged with the slides it came from), extracted from the deck's own text rather than inferred. It is the piece that turns "download the deck" into "fill the CRM record":
curl -X POST https://deckextract.com/api/v2/extract \
-H "Authorization: Bearer dk_your_api_key" \
-H "Content-Type: application/json" \
-d '{ "url": "https://docsend.com/view/abc123", "analyze": true }'
No Code: the DocSend MCP Server
If the caller is an AI assistant rather than a script, skip the API entirely. DeckExtract exposes the same extraction as an MCP server at https://deckextract.com/mcp. Add it to Claude, Claude Code, ChatGPT, Cursor or any MCP client, sign in once when prompted, then ask the assistant to fetch a DocSend link. It comes back as a PDF or PowerPoint the assistant can read.
claude mcp add --transport http deckextract https://deckextract.com/mcp
The n8n automation guide shows the same flow wired to an inbox, and the Claude MCP walkthrough covers the assistant side.
DocSend API Alternatives Comparison
| Feature | DocSend (Native) | DeckExtract API | Manual Download |
|---|---|---|---|
| Download documents | No | Yes | Only when the sender allows it |
| Programmatic access | Triggers only | Yes | No |
| Batch processing | No | Yes | No |
| Data rooms (Spaces) | No | Yes, as a ZIP | One file at a time |
| Password support | N/A | Yes | Yes |
| Email verification | N/A | Yes | Yes |
| PDF output | N/A | Yes | Sometimes |
| PPTX output | N/A | Yes | No |
| Deck analysis (JSON) | No | Pro | No |
| AI agent access (MCP) | No | Yes | No |
| Cost | Included in DocSend | 5 free a month, then EUR 9.99/month | Free |
Common DocSend API Questions
Is there an official DocSend API?
No. DocSend does not provide a public API for downloading or accessing document content. Its Zapier integration only supports event triggers about your own links, not content retrieval.
Can I download DocSend documents programmatically?
Yes, with the DeckExtract API: one POST to /api/v2/extract returns a download link for the PDF or PPTX. It works on documents that were shared with you, including password-protected and email-gated ones.
Does the Dropbox API include DocSend?
No. Although DocSend is owned by Dropbox, the Dropbox developer API does not include DocSend functionality. They remain separate platforms.
How do I automate DocSend downloads?
Use the DeckExtract API from your scripts or automation tools (n8n, Zapier's webhook step, a cron job), or connect the MCP server to your AI assistant. Both handle authentication gates and format conversion.
What formats can I get from DocSend?
PDF or PowerPoint (PPTX) for single documents, and a ZIP of PDFs for a DocSend Space or Papermark data room.
Is there a rate limit?
The free plan includes 5 extractions per month per account. Pro is unlimited at a pace of 30 extractions per hour, which keeps one caller from saturating the extraction workers.
Is it free?
Yes for the first 5 extractions each month. Heavier use is Pro at EUR 9.99 a month (or USD 9.99 and GBP 9.99, plus tax), cancellable any time from your account page. Compare plans.
Use Cases for DocSend Download API
Investor Due Diligence
VCs reviewing multiple startup pitch decks can automate downloads:
# Download several pitch decks for review
for url in "${PITCH_DECK_URLS[@]}"; do
curl -s -X POST https://deckextract.com/api/v2/extract \
-H "Authorization: Bearer dk_your_api_key" \
-H "Content-Type: application/json" \
-d "{\"url\": \"$url\"}" \
| jq -r '.download.url' \
| xargs curl -sL -o "$(basename "$url").pdf"
done
CRM Integration
Deal teams can attach the deck, and the parsed round and metrics, to the CRM record when the link arrives:
async function archiveDeck(docsendUrl, dealId) {
const pdf = await downloadDocSendDocument(docsendUrl);
await uploadToCRM(dealId, pdf);
console.log(`Archived deck for deal ${dealId}`);
}
See the Affinity, Attio and HubSpot integration pages for the CRM side.
Compliance Archival
Legal teams can keep document records automatically:
from datetime import datetime
def archive_signed_documents(docsend_urls):
for url in docsend_urls:
content = download_docsend_document(url)
filename = f"signed_{datetime.now().isoformat()}.pdf"
save_to_archive(filename, content)
Conclusion
DocSend does not offer a public API for document downloads, and it is unlikely to: the platform's value to senders is the tracking that a download would bypass. DeckExtract provides the missing piece for the people the documents were sent to. Whether you're a developer building an integration, an investor reviewing pitch decks, or a deal team archiving proposals, you get:
- A single REST endpoint that returns a download link with real HTTP status codes
- Password-protected and email-gated documents handled for you
- PDF, PowerPoint and data-room ZIP output
- Structured deck analysis on Pro, and an MCP server for AI assistants
- 5 free extractions a month, no card required
View the full API documentation
Need help with other document platforms? Check out our guides on downloading from Papermark and exporting a data room.