{
  "version": "2",
  "generatedAt": "2026-11-03T22:49:39.280Z",
  "listing": {
    "slug": "papra-hq--papra",
    "name": "Papra",
    "tagline": "Minimal document archive for receipts and invoices: email intake, OCR, tagging rules, API, CLI, and 100+ named env vars.",
    "shortTagline": "Document archive for receipts",
    "description": "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.",
    "capabilities": [
      "adaptable",
      "operable"
    ],
    "vertical": "support-bookkeeping",
    "alternativeTo": [
      "Dext",
      "Hubdoc"
    ],
    "shape": "business-app",
    "formFactor": "web-app",
    "executionModel": "hybrid",
    "provenance": "human-written",
    "codeStack": {
      "languages": [
        "TypeScript"
      ],
      "frameworks": [
        "SolidJS",
        "Hono",
        "Drizzle",
        "Better Auth"
      ],
      "packageManager": "pnpm",
      "database": [
        "SQLite / libSQL (Turso in production)"
      ],
      "hostingTarget": [
        "Docker (ghcr.io/papra-hq/papra)",
        "Fly.io"
      ]
    },
    "modelStack": {
      "providers": [
        "Anthropic",
        "OpenAI",
        "Mistral",
        "DeepSeek",
        "OpenRouter",
        "Ollama",
        "LM Studio",
        "vLLM",
        "Cocore (all optional)"
      ],
      "models": [],
      "requiredKeys": [
        "ANTHROPIC_API_KEY",
        "OPENAI_API_KEY",
        "MISTRAL_API_KEY",
        "DOCLING_API_KEY",
        "AZURE_DI_API_KEY"
      ],
      "promptLocations": [],
      "tools": []
    },
    "repos": [
      {
        "url": "https://github.com/papra-hq/papra",
        "owner": "papra-hq",
        "name": "papra",
        "license": "AGPL-3.0",
        "stars": 5268,
        "lastCommit": "2026-09-03"
      }
    ],
    "interface": {
      "kind": "api",
      "url": "https://docs.papra.app/resources/api-endpoints/",
      "official": true,
      "hosted": "both"
    },
    "operability": "official",
    "recommendedWrapper": null,
    "reach": [
      {
        "job": "Upload, list, and delete documents",
        "reachable": true,
        "evidence": "API: create document, list documents, get file content, delete by ID"
      },
      {
        "job": "Full-text search",
        "reachable": true,
        "evidence": "API document listing and search with filters; CLI also searches"
      },
      {
        "job": "Tag documents and run tagging rules",
        "reachable": true,
        "evidence": "API: create tag, associate tags, apply a tagging rule to all existing documents"
      },
      {
        "job": "Set custom properties on documents",
        "reachable": true,
        "evidence": "API: define and set custom property values"
      },
      {
        "job": "Manage organizations",
        "reachable": true,
        "evidence": "API: list, create, update, delete organizations"
      },
      {
        "job": "Ingest by forwarding email",
        "reachable": true,
        "evidence": "INTAKE_EMAILS_* env vars and OwlRelay driver; the address is generated per organization, agent sends mail to it"
      },
      {
        "job": "Ingest from a watched folder",
        "reachable": true,
        "evidence": "README: folder ingestion; CLI documented at docs.papra.app/resources/cli"
      },
      {
        "job": "Extract text and auto-tag with an LLM",
        "reachable": true,
        "evidence": "DOCUMENTS_CONTENT_EXTRACTION_ENABLED, AI_IS_ENABLED, AUTO_TAGGING_ENABLED run server-side on ingest"
      },
      {
        "job": "Share documents externally",
        "reachable": null,
        "evidence": "sharing is a product feature; no sharing endpoint on the fetched API page"
      },
      {
        "job": "Register webhooks",
        "reachable": null,
        "evidence": "webhooks exist (WEBHOOK_* env) but the API page omits webhook endpoints"
      }
    ],
    "editions": [
      {
        "name": "Free (self-hosted)",
        "price": null,
        "open": true,
        "distributions": [
          {
            "kind": "source",
            "url": "https://github.com/papra-hq/papra"
          },
          {
            "kind": "container",
            "url": "https://docs.papra.app/self-hosting/using-docker",
            "command": "docker run -d --name papra -p 1221:1221 -e AUTH_SECRET=... ghcr.io/papra-hq/papra:latest"
          }
        ]
      },
      {
        "name": "Managed Free",
        "price": null,
        "open": false,
        "distributions": [
          {
            "kind": "hosted",
            "url": "https://papra.app/pricing"
          }
        ]
      },
      {
        "name": "Plus",
        "price": {
          "amount": 7.5,
          "currency": "USD",
          "period": "month, annual ($9 monthly)"
        },
        "open": false,
        "distributions": [
          {
            "kind": "hosted",
            "url": "https://papra.app/pricing"
          }
        ]
      },
      {
        "name": "Pro",
        "price": {
          "amount": 25,
          "currency": "USD",
          "period": "month, annual ($30 monthly)"
        },
        "open": false,
        "distributions": [
          {
            "kind": "hosted",
            "url": "https://papra.app/pricing"
          }
        ]
      }
    ],
    "skills": {
      "kind": "none",
      "paths": [],
      "install": null,
      "note": "No SKILL.md, Claude Code plugin, or published skill found in the repo."
    },
    "customization": {
      "summary": "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.",
      "envVars": [
        "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"
      ],
      "configFiles": [
        "docker-compose (env block)",
        "apps/papra-server/.env (optional)"
      ],
      "promptFiles": [],
      "effort": "config-only",
      "editCount": 24
    },
    "useWhen": [
      "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"
    ],
    "accounts": [
      "an email intake provider (OwlRelay) or your own catch-all domain",
      "optional: S3-compatible storage, an LLM provider for auto-tagging"
    ],
    "active": true,
    "lastActivity": "2026-09-03",
    "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"
    ],
    "fit": {
      "adaptable": 2,
      "operable": 3
    },
    "evidence": {
      "formFactor": "README: docker run ghcr.io/papra-hq/papra; SolidJS client and Hono server",
      "executionModel": "AI_IS_ENABLED and AUTO_TAGGING_* are optional bounded steps in a deterministic pipeline",
      "operability": "docs.papra.app/resources/api-endpoints: bearer token; documents, tags, tagging rules, custom properties, organizations, API keys",
      "effort": "docs.papra.app/self-hosting/configuration lists every env var by name",
      "editions": "papra.app/pricing: self-host free under AGPLv3; Plus $9 ($7.5 annual), Pro $30 ($25 annual), Enterprise",
      "active": "gh api: pushed 2026-09-03, 5268 stars"
    },
    "confidence": {
      "formFactor": 0.95,
      "executionModel": 0.8,
      "operability": 0.9,
      "effort": 0.95,
      "reach": 0.85,
      "editions": 0.9
    },
    "openQuestions": [
      "Webhook and sharing endpoints in the API",
      "SDK package name and whether an MCP server is planned"
    ],
    "sources": [
      {
        "url": "https://github.com/papra-hq/papra",
        "foundBy": "sourcing:support-bookkeeping:curated"
      },
      {
        "url": "https://docs.papra.app/",
        "foundBy": "sourcing:support-bookkeeping:curated"
      },
      {
        "url": "https://papra.app/pricing",
        "foundBy": "analysis"
      }
    ],
    "research": {
      "stage": "verified",
      "verdict": "unverified",
      "reason": "Best-documented customization surface in the vertical and an official API; receipt-capture half of bookkeeping automation.",
      "disputed": []
    },
    "url": "apps/papra-hq--papra.html",
    "coverage": "partial",
    "paid": true,
    "source": "research/verified/papra-hq--papra.json"
  }
}
