# pitch2pdf — Full Documentation for LLMs Last updated: 2026-09-10 > Convert presentations to PDF quickly. Supports Pitch.com, DocSend, Google Slides, Google Drive, Google Docs, Google Sheets, Canva, Prezi, Presentations.AI, Figma Slides, and direct links to PDF files. pitch2pdf is a free online tool that converts presentation slides and documents to PDF format. Supports Pitch.com, DocSend, Google Slides, Google Drive, Google Docs, Google Sheets, Canva, Prezi, Presentations.AI, Figma Slides, and direct links to PDF files. No signup or software installation required. Paste a presentation URL and download a high-quality PDF. ## Pricing | Tier | Price | Includes | |------|-------|----------| | Free | $0 | First 10 slides at full resolution. No signup required. Remaining slides shown as preview thumbnails. | | One-time download | $3 | All slides at full resolution with OCR-powered searchable text. Single download in small, medium, or large quality. | | Monthly subscription | $8/month | Unlimited full-deck downloads with OCR-powered searchable text. All quality sizes available. Cancel anytime. | | Agent purchase | $3 | Same as the one-time download, paid over HTTP 402 by an AI agent (x402 or Stripe MPP). | All payments processed securely through Stripe. No credit card required for the free tier. ## Supported Services & URL Patterns ### Pitch.com - `pitch.com/v/{deck-name}` — standard view URL - `pitch.com/public/{id}` — public sharing link - `pitch.com/embed/{id}` — embed URL - `pitch.{company}.com/...` — white-label subdomains (e.g., pitch.surgeryai.com) - `pitch.com/r/{id}` — Data Rooms, NOT supported - `{anything}.{tld}/v/...`, `/public/...`, `/embed/...` — decks on a company's own custom domain, with no "pitch" in the hostname, are recognised from the deck page itself and convert exactly like a pitch.com link (public and password-protected). If such a link fails — for example because the domain is unreachable — the deck's underlying pitch.com link still works ### DocSend - `docsend.com/view/{id}` — standard document URL - Supports email-gated documents (enter email in auth field) - Supports password-protected documents (enter password in auth field) - Works with individual documents in DocSend data rooms ### Google Slides - `docs.google.com/presentation/d/{id}/pub` — published link (highest quality, uses SVG extraction) - `docs.google.com/presentation/d/{id}/pubembed` — published embed - `docs.google.com/presentation/d/{id}/preview` — preview link - `docs.google.com/presentation/d/{id}/embed` — embed link - `docs.google.com/presentation/d/{id}/edit` — editor URL (auto-normalized to /pub) - `docs.google.com/presentation/d/{id}/present` — presentation URL (auto-normalized to /pub) - `docs.google.com/presentation/d/{id}` — bare URL (auto-normalized to /pub) - Requires "Anyone with the link" viewer access ### Google Drive - `drive.google.com/file/d/{id}/view` — file view URL - `drive.google.com/open?id={id}` — open URL - Supports Google Docs, Sheets, and Slides shared via Drive links - Requires "Anyone with the link" access - Works even when the owner has disabled downloads ### Google Docs - `docs.google.com/document/d/{id}/edit` — editor URL - `docs.google.com/document/d/{id}/pub` — published URL - `docs.google.com/document/d/{id}` — bare URL - Requires "Anyone with the link" viewer access - Uses native PDF export for faithful reproduction ### Google Sheets - `docs.google.com/spreadsheets/d/{id}/edit` — editor URL - `docs.google.com/spreadsheets/d/{id}/htmlview` — HTML view URL - `docs.google.com/spreadsheets/d/e/{id}/pubhtml` — "Publish to web" URL - Requires "Anyone with the link" viewer access, or the sheet must be published to the web - Every tab is exported, landscape, scaled to fit the page width, with gridlines - Links to a specific tab (gid parameter) still export the whole workbook ### Direct PDF links - Any `http(s)` URL that serves a PDF file directly (for example a report, brochure, or lecture notes hosted on a website) - The file must be publicly reachable without signing in; limits: 50 MB, 300 pages - Links that open a web page rather than the PDF itself are not converted - Same free preview (first 10 pages) and paid tiers; the paid tier adds a searchable OCR text layer, which is useful for scanned or image-only PDFs ### Canva - `canva.com/design/{id}/{token}/view` — public view link - Only public view links are supported (private designs require the owner to generate a view link) - UTM parameters are automatically stripped ### Prezi - `prezi.com/view/{id}` — standard view URL - `prezi.com/p/{id}` — legacy short URL - Only Prezi Present is supported (not Prezi Video /v/ or Prezi Design /i/) - Each zoom step is captured as a separate PDF page ### Presentations.AI - `app.presentations.ai/view/{id}` — view URL - Supports password-protected presentations (enter password in auth field) - Presentations requiring viewer details (name/email) cannot be converted ### Figma Slides - `figma.com/deck/{key}/{slug}?node-id=…` — deck (presentation) link from the Share dialog; the slug and every parameter are optional - `figma.com/slides/{key}/…` — editor share link; pitch2pdf opens the deck view of the same file - Not supported: `figma.com/design/…`, `/file/…`, `/proto/…`, `/board/…` (FigJam) and `/make/…` — design files, prototypes, boards and Figma Make apps are not Slides decks; the converter reports this and asks for the deck link (Figma Slides → Share → copy link) - The deck must be shared with "Anyone with the link" → "can view"; a private deck and a deleted or mistyped link look identical to a visitor, so both are reported as "private or doesn't exist" - Supports password-protected decks (enter the password in the auth field) - Build animations (objects that appear step by step) are captured in their final state — one page per slide with every element shown - Conversion typically takes about a minute for a 20-slide deck and two to three minutes for 50 slides ## Known Limitations - **Public links only**: Presentations must be publicly accessible or you must have valid credentials. pitch2pdf cannot access content restricted to specific accounts or organizations (except via email/password auth on DocSend and Pitch). - **Timeout**: Maximum conversion time is 15 minutes. Most presentations complete in 30-60 seconds. Very large decks (100+ slides) may take 2-3 minutes. - **Visual capture**: The tool captures what is visually displayed. Speaker notes, hidden slides, and non-rendered content are not included. - **Platform changes**: Third-party platforms may update their interfaces, which can temporarily affect conversion quality or availability. - **No speaker notes**: PDFs contain only the visible slide content, not presenter notes. ## Comparison with Alternatives | Method | Requires account? | Works with view-only links? | Offline? | Searchable text? | |--------|-------------------|----------------------------|----------|-----------------| | pitch2pdf | No | Yes | Yes (PDF) | Yes (paid tier, OCR) | | Platform "Download as PDF" | Yes (platform account) | No (need edit access) | Yes | Varies | | Print to PDF (browser) | No | Yes | Yes | No (rasterized) | | Screenshot + combine | No | Yes | Yes | No | **pitch2pdf advantages:** - No account required on any platform - Works with view-only and restricted-download links - Produces consistent, high-quality PDF output - Paid tier adds OCR for searchable, copy-pasteable text - Handles authentication (email/password) for protected content ## Architecture Overview 1. **URL submitted** → Service detected from URL pattern 2. **Capture phase** → Headless browser navigates presentation, captures each slide as high-resolution PNG (Google Slides /pub uses server-side SVG extraction for higher fidelity) 3. **Build phase** → Screenshots optimized and assembled into PDF 4. **Delivery** → PDF uploaded to cloud storage, signed download URL returned ## CLI Install and run with npx (no global install needed): ``` npx pitch2pdf [options] ``` Or install globally: `npm install -g pitch2pdf-cli` ### Options | Flag | Description | |------|-------------| | `--email ` | Email for password-protected presentations (DocSend, Pitch) | | `--password ` | Password for protected presentations | | `-o, --output ` | Output file path. Use `-` for stdout. | | `--json` | Output NDJSON events to stdout (one JSON object per line) | | `--no-progress` | Suppress progress output, print only final file path | | `--api-url ` | Override API URL (default: `https://api.pitch2pdf.com`, or `PITCH2PDF_API_URL` env var) | Environment variables: `PITCH2PDF_API_URL`, `PITCH2PDF_EMAIL`, `PITCH2PDF_PASSWORD` (use env vars for credentials to avoid exposure in process list). ### Exit Codes | Code | Meaning | |------|---------| | 0 | Success | | 1 | General error (invalid URL, server error) | | 2 | Network error | | 3 | Authentication required or failed | | 4 | Bot detection blocked the request | | 5 | Timeout | | 6 | Connection dropped during conversion | | 7 | PDF download failed | | 130 | Interrupted (Ctrl+C) | ### JSON Output Schema (--json) Each line is a JSON object with a `status` field: - `{"status":"processing","stage":"loading","jobId":"..."}` — Loading the presentation - `{"status":"processing","stage":"capturing","currentSlide":1,"totalSlides":10,"jobId":"..."}` — Capturing slides - `{"status":"completed","jobId":"...","numSlides":10,"serviceName":"Pitch","downloadUrl":"..."}` — Conversion complete - `{"status":"failed","code":"AUTH_REQUIRED","message":"..."}` — Error occurred - `{"event":"saved","path":"deck.pdf","size":2451623}` — File saved to disk ### Examples ``` # Basic conversion pitch2pdf https://pitch.com/v/my-deck # DocSend with email gate pitch2pdf https://docsend.com/view/abc --email you@company.com # Save to specific file pitch2pdf https://docs.google.com/presentation/d/1abc/pub -o slides.pdf # Pipe PDF to another tool pitch2pdf https://canva.com/design/abc/token/view -o - | wc -c # JSON for scripting/agents pitch2pdf https://pitch.com/v/deck --json --no-progress ``` ## API Base URL: `https://api.pitch2pdf.com`. No API key. Machine-readable description (OpenAPI 3.1, with MPP `x-payment-info` on the paid endpoint): `https://api.pitch2pdf.com/openapi.json`. Human-readable guide for agents: https://www.pitch2pdf.com/agents. ### Endpoints - `POST /api/convert` — form field `url` (optional `email`, `password` for gated decks). Server-Sent Events: `event: progress` (`stage`, `currentSlide`, `totalSlides`), then `event: complete` with `{"jobId","numSlides","serviceName","downloadUrl"}` — `downloadUrl` is the free preview PDF (first 10 slides at full resolution). Failures arrive as `event: error` with a `code` (see the CLI error code table). - `GET /api/jobs/{jobId}/results` — job summary: slide count, preview URL, whether it is paid, and `agentPaymentsAvailable` (true when the server will accept a machine payment). - `GET /api/jobs/{jobId}/paid-urls` — download URLs for the paid sizes once built. - `POST /api/jobs/{jobId}/generate-paid` — JSON body `{"size":"small"|"medium"|"large"}`. Builds the full OCR'd deck. Requires payment: see below. ### Agent purchase over HTTP 402 (x402 or Stripe MPP) Price: **$3 per deck**, the same as the one-time download a person buys. The amount is fixed server-side and never taken from the request. One payment unlocks every slide at full resolution with an OCR text layer, all three sizes, and a free re-capture of the same deck for 7 days. 1. Call `POST /api/jobs/{jobId}/generate-paid` with `{"size":"medium"}`. Unpaid, the server answers **`402 Payment Required`** with: - `WWW-Authenticate: Payment id="…", realm="api.pitch2pdf.com", method="stripe"|"tempo", intent="charge", request="…", opaque="…"` — one header per MPP rail (Stripe's Machine Payments Protocol: a card via a Shared Payment Token from a Link agent wallet, or USDC on Tempo) - `PAYMENT-REQUIRED: ` — USDC on Base - `Cache-Control: no-store` - JSON body `{"code":"PAYMENT_REQUIRED","error":"Payment required to generate the paid PDF","jobId":"…","amountUsd":3,"rails":["spt","x402","tempo"],"docs":"https://www.pitch2pdf.com/agents"}` 2. Pay the challenge on any advertised rail and **retry the same request** with the credential: `Authorization: Payment ` for MPP, or `PAYMENT-SIGNATURE: ` for x402. 3. The server verifies and settles before responding, then answers `200` with `Payment-Receipt` (plus `PAYMENT-RESPONSE` for x402) and streams the build: `event: progress` with `stage` in `starting`, `ocr`, `building`, `uploading` (`current`, `total`), then `event: complete` with `{"downloadUrl","size"}`. If that size is already built the response is JSON `{"downloadUrl":"…","size":"…","cached":true}` instead of a stream. Clients: `npx mppx@latest https://api.pitch2pdf.com/api/jobs//generate-paid -X POST --json '{"size":"medium"}'`, `npx @stripe/link-cli mpp pay -X POST -d '{"size":"medium"}'`, `tempo request -X POST --json '{"size":"medium"}' `, or any x402 client such as `@x402/fetch` (raise the client's per-payment spend limit to $3 if it caps lower). Error responses on `generate-paid`: | Status | `code` | Meaning | |--------|--------|---------| | 402 | `PAYMENT_REQUIRED` | No credential; challenge in the headers. Pay and retry. | | 402 | `PAYMENT_INVALID` | Credential rejected (wrong amount, minted for another job, expired, already spent, settlement failed). Nothing charged; a fresh challenge is included. | | 403 | — | Unpaid and machine payments are switched off (`agentPaymentsAvailable: false`); a person can unlock the deck at `https://www.pitch2pdf.com/results?jobId=…`. | | 404 | — | No such job. | | 410 | — | The captured slides are gone; convert again. | | 503 | `PAYMENT_RAIL_UNAVAILABLE` | The rail could not be reached to verify or settle; nothing charged. Retry or use another rail. | | 429 | — | Rate limit: 60 requests per minute per IP; the 402 and the paid retry count as two. Honour `Retry-After`. | Refunds: same policy as human purchases — email support@pitch2pdf.com with the jobId. The CLI (`npx pitch2pdf-cli`) gets a `--pay` flag in its next release; until then use the HTTP flow above. ## Pages - [Home](https://www.pitch2pdf.com): Main converter — paste any supported URL and convert to PDF - [Pitch to PDF](https://www.pitch2pdf.com/pitch-to-pdf): Convert Pitch.com presentations, including white-label subdomains and custom domains - [DocSend to PDF](https://www.pitch2pdf.com/docsend-to-pdf): Download DocSend presentations and documents as PDF - [Google Slides to PDF](https://www.pitch2pdf.com/google-slides-to-pdf): Export Google Slides presentations to PDF - [Google Drive to PDF](https://www.pitch2pdf.com/google-drive-to-pdf): Convert Google Drive documents and presentations to PDF - [Google Docs to PDF](https://www.pitch2pdf.com/google-docs-to-pdf): Convert Google Docs documents to PDF from shared links - [Google Sheets to PDF](https://www.pitch2pdf.com/google-sheets-to-pdf): Convert Google Sheets spreadsheets to PDF — every tab, landscape, fit to width - [Canva to PDF](https://www.pitch2pdf.com/canva-to-pdf): Convert Canva designs to PDF from public view links - [Prezi to PDF](https://www.pitch2pdf.com/prezi-to-pdf): Convert Prezi presentations to PDF — each zoom step becomes a slide - [Presentations.AI to PDF](https://www.pitch2pdf.com/presentations-ai-to-pdf): Convert Presentations.AI presentations to PDF - [Figma Slides to PDF](https://www.pitch2pdf.com/figma-slides-to-pdf): Convert Figma Slides decks to PDF from deck or editor links — build animations captured in their final state - [CLI](https://www.pitch2pdf.com/cli): Command-line tool — install, usage, flags, exit codes - [Agents](https://www.pitch2pdf.com/agents): How AI agents convert decks and buy the full PDF over HTTP 402 (x402, Stripe MPP) - [About](https://www.pitch2pdf.com/about): Why we built pitch2pdf - [Privacy Policy](https://www.pitch2pdf.com/privacy): How we handle your data - [Terms of Service](https://www.pitch2pdf.com/terms): Terms for using the service