# Papra

Minimal document archive for receipts and invoices: email intake, OCR, tagging rules, API, CLI, and 100+ named env vars.

Papra is an AGPL document management platform built for storing and finding receipts, warranties, and invoices: upload or forward email to a generated intake address, extract text with OCR or a hosted extractor, auto-tag with rules or an LLM, and query it all through a bearer-token API, a CLI, or webhooks. Self-hosting is free; papra.app sells managed plans from $7.50 a month.

Alternative to: Dext, Hubdoc

- Capabilities: adaptable, operable
- Vertical: support-bookkeeping
- Shape: business-app
- Form factor: web-app
- Execution model: hybrid
- Provenance: human-written (recorded, never ranked)
- Repo: https://github.com/papra-hq/papra (AGPL-3.0), 5268 stars, last commit 2026-09-03
- Last activity: 2026-09-03
- Page: apps/papra-hq--papra.html
- JSON: apps/papra-hq--papra.json

## Use it when

- we want every receipt and supplier invoice forwarded to one address, OCR'd, tagged, and searchable before month-end without paying per user
- we want our agent to file documents and pull the ones tagged for the accountant through an API key rather than a shared drive

## Gotchas

- AGPL-3.0
- Archive, not ledger: no amounts, no double-entry; pair with an accounting listing
- Email intake needs OwlRelay or a catch-all domain wired to a webhook
- Managed Free plan is 512MB and 3 members

## Editions

- Free (self-hosted): Free, open source
  - source: https://github.com/papra-hq/papra
  - container: docker run -d --name papra -p 1221:1221 -e AUTH_SECRET=... ghcr.io/papra-hq/papra:latest
- Managed Free: Free, closed source
  - hosted: https://papra.app/pricing
- Plus: $8 per month, annual ($9 monthly), closed source
  - hosted: https://papra.app/pricing
- Pro: $25 per month, annual ($30 monthly), closed source
  - hosted: https://papra.app/pricing

## Adaptable: make it yours

Effort: config-only (24 things to edit)

Everything is env vars, documented at docs.papra.app/self-hosting/configuration. An SMB sets AUTH_SECRET, AUTH_IS_REGISTRATION_ENABLED, DOCUMENT_STORAGE_DRIVER (filesystem, S3, Azure), INTAKE_EMAILS_IS_ENABLED plus a driver, DOCUMENTS_OCR_LANGUAGES or CONTENT_EXTRACTION_STRATEGY, AI_IS_ENABLED with one provider key, AUTO_TAGGING_ENABLED, and EMAILS_DRIVER/SMTP_*. Tagging rules, organizations, and API keys are created in the app.

- Env vars: AUTH_SECRET, AUTH_IS_REGISTRATION_ENABLED, AUTH_FIRST_USER_AS_ADMIN, DOCUMENT_STORAGE_DRIVER, DOCUMENT_STORAGE_FILESYSTEM_ROOT, DOCUMENT_STORAGE_S3_BUCKET_NAME, INTAKE_EMAILS_IS_ENABLED, INTAKE_EMAILS_DRIVER, INTAKE_EMAILS_CATCH_ALL_DOMAIN, OWLRELAY_API_KEY, DOCUMENTS_OCR_LANGUAGES, CONTENT_EXTRACTION_STRATEGY, AI_IS_ENABLED, AI_DEFAULT_MODEL, ANTHROPIC_API_KEY, OPENAI_API_KEY, OLLAMA_BASE_URL, AUTO_TAGGING_ENABLED, AUTO_TAGGING_MODEL, EMAILS_DRIVER, SMTP_HOST, WEBHOOK_URL_ALLOWED_HOSTNAMES
- Config files: docker-compose (env block), apps/papra-server/.env (optional)
- Prompt files: none
- Accounts you'll need: an email intake provider (OwlRelay) or your own catch-all domain; optional: S3-compatible storage, an LLM provider for auto-tagging

## Operable: what an agent can drive

Operability: official. Interface: api at https://docs.papra.app/resources/api-endpoints/ (published by the builder, both).

### Reach (partial coverage)

- Upload, list, and delete documents: reachable. API: create document, list documents, get file content, delete by ID
- Full-text search: reachable. API document listing and search with filters; CLI also searches
- Tag documents and run tagging rules: reachable. API: create tag, associate tags, apply a tagging rule to all existing documents
- Set custom properties on documents: reachable. API: define and set custom property values
- Manage organizations: reachable. API: list, create, update, delete organizations
- Ingest by forwarding email: reachable. INTAKE_EMAILS_* env vars and OwlRelay driver; the address is generated per organization, agent sends mail to it
- Ingest from a watched folder: reachable. README: folder ingestion; CLI documented at docs.papra.app/resources/cli
- Extract text and auto-tag with an LLM: reachable. DOCUMENTS_CONTENT_EXTRACTION_ENABLED, AI_IS_ENABLED, AUTO_TAGGING_ENABLED run server-side on ingest
- Share documents externally: undetermined. sharing is a product feature; no sharing endpoint on the fetched API page
- Register webhooks: undetermined. webhooks exist (WEBHOOK_* env) but the API page omits webhook endpoints

## Code stack

- Languages: TypeScript
- Frameworks: SolidJS, Hono, Drizzle, Better Auth
- Package manager: pnpm
- Database: SQLite / libSQL (Turso in production)
- Hosting target: Docker (ghcr.io/papra-hq/papra), Fly.io

## Model stack

- Providers: Anthropic, OpenAI, Mistral, DeepSeek, OpenRouter, Ollama, LM Studio, vLLM, Cocore (all optional)
- Models: none
- Keys you need (names only): ANTHROPIC_API_KEY, OPENAI_API_KEY, MISTRAL_API_KEY, DOCLING_API_KEY, AZURE_DI_API_KEY
- Prompts live in: none
- Tools: none

## Evidence and confidence

- formFactor: README: docker run ghcr.io/papra-hq/papra; SolidJS client and Hono server (confidence 0.95)
- executionModel: AI_IS_ENABLED and AUTO_TAGGING_* are optional bounded steps in a deterministic pipeline (confidence 0.8)
- operability: docs.papra.app/resources/api-endpoints: bearer token; documents, tags, tagging rules, custom properties, organizations, API keys (confidence 0.9)
- effort: docs.papra.app/self-hosting/configuration lists every env var by name (confidence 0.95)
- editions: papra.app/pricing: self-host free under AGPLv3; Plus $9 ($7.5 annual), Pro $30 ($25 annual), Enterprise (confidence 0.9)
- active: gh api: pushed 2026-09-03, 5268 stars
- reach:  (confidence 0.85)

## Open questions

- Webhook and sharing endpoints in the API
- SDK package name and whether an MCP server is planned

## Sources

- https://github.com/papra-hq/papra (sourcing:support-bookkeeping:curated)
- https://docs.papra.app/ (sourcing:support-bookkeeping:curated)
- https://papra.app/pricing (analysis)
