PDF extraction & slides,
as a service

Upload a PDF via REST API or dashboard. Get back structured text, page count, and metadata โ€” or an editable PowerPoint deck that imports straight into Google Slides.

Open Dashboard Browse API

Features

โšก

Fast extraction

pdf-parse extracts text synchronously in memory โ€” no temp files, no disk I/O for the PDF.

๐Ÿ”‘

API key auth

Multi-tenant isolation. Each key maps to a tenant โ€” jobs are never shared across tenants.

๐Ÿ“‚

Job archiving

Jobs stay queryable after extraction. Archive them when done; unarchive or delete any time.

๐Ÿ–ฅ๏ธ

Dashboard

Upload PDFs, view extracted text, convert to slides, archive and delete jobs โ€” all from a browser UI.

๐Ÿ“Š

PDF โ†’ Slides (.pptx)

Convert any PDF into an editable PowerPoint deck โ€” brochure spreads split into per-panel slides, images cropped to fit. Imports directly into Google Slides.

Authentication

All /api/* endpoints and the dashboard require authentication.

API key (recommended for programmatic use)

Pass your key in the x-api-key header or as the ?apiKey= query param.

curl -H "x-api-key: pk_your_key_here" https://pdf.vinficient.com/api/jobs

SSO cookie (cl_session)

Set by the /login page. Used by the dashboard. Expires after 7 days.

Admin key

Pass x-admin-key: <ADMIN_KEY> to manage API keys via /admin/keys. Set via ADMIN_KEY env var (default: admin-dev-key).

API Reference

POST /api/jobs Upload a PDF and extract text

Multipart form upload. Returns a job object. Text is extracted synchronously.

pdfFile field โ€” PDF only, max 20MB
curl -X POST https://pdf.vinficient.com/api/jobs \
  -H "x-api-key: pk_your_key" \
  -F "[email protected]"

# Response
{
  "id": "abc123",
  "filename": "document.pdf",
  "status": "done",
  "pages": 3,
  "textLength": 4821,
  "size": 120456,
  "archived": false,
  "createdAt": 1712000000000
}
POST /api/convert/pptx Convert a PDF to an editable PowerPoint deck

Stateless โ€” no job record is created. Accepts a multipart file OR a JSON {"url"} body. Returns the .pptx binary; imports directly into Google Slides. Book-format PDFs (cover + spreads/gatefolds) are split into one slide per panel; images are cropped to the slide canvas. Large PDFs can take 1โ€“2 minutes.

pdfFile field โ€” PDF only, max 20MB (multipart mode)
urlstring โ€” http/https PDF URL (JSON mode, alternative to file upload)
curl -X POST https://pdf.vinficient.com/api/convert/pptx \
  -H "x-api-key: pk_your_key" \
  -F "[email protected]" \
  -o brochure.pptx

# Response headers
X-Pdf-Pages: 13            # pages in the source PDF
X-Pptx-Slides: 28          # slides emitted (book mode splits spreads into panels)
X-Pptx-Text-Boxes: 735     # editable text boxes placed
X-Pptx-Images: 132         # images embedded
X-Pptx-Skipped-Images: 0   # images that could not be decoded
GET /api/jobs List active (non-archived) jobs

Returns an array of job summaries (no text). Sorted newest first.

curl https://pdf.vinficient.com/api/jobs \
  -H "x-api-key: pk_your_key"
GET /api/jobs/archived List archived jobs
curl https://pdf.vinficient.com/api/jobs/archived \
  -H "x-api-key: pk_your_key"
GET /api/jobs/:id Get full job including extracted text
curl https://pdf.vinficient.com/api/jobs/abc123 \
  -H "x-api-key: pk_your_key"

# Response includes full "text" field
PATCH /api/jobs/:id/archive Archive or unarchive a job
archivedboolean โ€” true to archive, false to unarchive
curl -X PATCH https://pdf.vinficient.com/api/jobs/abc123/archive \
  -H "x-api-key: pk_your_key" \
  -H "Content-Type: application/json" \
  -d '{"archived": true}'
DELETE /api/jobs/:id Permanently delete a job
curl -X DELETE https://pdf.vinficient.com/api/jobs/abc123 \
  -H "x-api-key: pk_your_key"
POST /admin/keys Create an API key (admin)
tenantstring (required) โ€” tenant identifier
labelstring (optional) โ€” human-readable label
curl -X POST https://pdf.vinficient.com/admin/keys \
  -H "x-admin-key: admin-dev-key" \
  -H "Content-Type: application/json" \
  -d '{"tenant": "acme", "label": "Acme Corp"}'

# Response: { "key": "pk_...", "tenant": "acme", "label": "Acme Corp" }
GET /admin/keys List all API keys (admin)
curl https://pdf.vinficient.com/admin/keys \
  -H "x-admin-key: admin-dev-key"
DELETE /admin/keys/:key Revoke an API key (admin)
curl -X DELETE https://pdf.vinficient.com/admin/keys/pk_abc123 \
  -H "x-admin-key: admin-dev-key"