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.

Updated DeckExtract

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

ParameterTypeRequiredDescription
urlstringYesThe DocSend or Papermark document or data-room URL
formatstringNoOutput format: "pdf" (default) or "pptx"
emailstringNoEmail for email-gated documents
passwordstringNoPasscode for protected documents
sessionIdstringNoSession ID returned by a 422 gate, for the retry
otpstringNo6-digit code for Papermark decks that email a one-time code, with otpSessionId
analyzebooleanNoPro 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:

HTTPcodeMeaning
400invalid_url, unsupported_domainNot a DocSend or Papermark link
401auth_required, invalid_keyMissing, invalid or expired API key
402pro_requiredanalyze: true without a Pro key
404not_foundThe link does not exist
422link_disabled, extraction_failedThe sender disabled the link, or the deck could not be rendered
429monthly_limit, rate_limitedFree plan cap reached, or the Pro hourly pace exceeded
503busyThe 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

FeatureDocSend (Native)DeckExtract APIManual Download
Download documentsNoYesOnly when the sender allows it
Programmatic accessTriggers onlyYesNo
Batch processingNoYesNo
Data rooms (Spaces)NoYes, as a ZIPOne file at a time
Password supportN/AYesYes
Email verificationN/AYesYes
PDF outputN/AYesSometimes
PPTX outputN/AYesNo
Deck analysis (JSON)NoProNo
AI agent access (MCP)NoYesNo
CostIncluded in DocSend5 free a month, then EUR 9.99/monthFree

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

Connect the MCP server

Try DeckExtract now


Need help with other document platforms? Check out our guides on downloading from Papermark and exporting a data room.